# JS練習_Youtube 搜尋器 製作一個youtube搜尋頁面,讓使用者可以輸入關鍵字,依照關鍵字搜尋符合關鍵字的內容影片並有上/下頁功能的選擇。 - 成品畫面 ![](https://i.imgur.com/dgFYAMl.png) ## 功能 - 輸入內容 - 使用者輸入的內容,搜尋影片 - 有上一頁/ 下一頁按鈕,頁面跳轉 ## JS ### 申請API key 前往一個Google cloudclub Platform 建立專案 ![](https://i.imgur.com/krIJfPo.png) 輸入專案名稱 ![](https://i.imgur.com/qiuHEz9.png) 進來專案內容後,點選建立憑證,API 金鑰 ![](https://i.imgur.com/YoVSx6c.png) 點選旁邊的資訊主頁,點選啟用API和服務,搜尋我們這次要使用的API `Youtube Data API v3` ![](https://i.imgur.com/2337YHv.png) ![](https://i.imgur.com/6HsPLai.png) 使用$(document).ready() 確定DOM 的完全載入 1. 設定key的變數 2. 加入form 的 `submit`事件 - 設定防呆機制 - 呼叫`videoSearch()` ### videoSearch() - 參數:key/ search/ maxResult - 先將要展示搜尋結果那個html內容清除 - 使用jQuery `get`方法,設定傳入的url像這邊是我們是使用youtube的search API,在官方的說明文件中先貼上search API文件中的url `https://www.googleapis.com/youtube/v3` ,再做其他參數欄位設定。 console.log出來JSON結果的資料 ![](https://i.imgur.com/N6eukrV.png) 觀察我們需要的資料data裡面的items - 將每個`data.items`透過`forEach`方式取得每一筆item的資料,並呼叫`getOutput`方法創造html內容,將內容貼在 `$('#videos')`後。 - 創造一個button 點擊時,會觸發`getButton()` ### getButton() 判斷token 是否為`prevPageToken`,並設定button的html內容屬性,及點擊會促發`nextPage()`與`prevPage()`函式。 - 倘若是 ->會有兩個button,Previous/ Next button。 - 倘若不是 -> 只會有Next button。 ```.js function getButton(prevPageToken, nextPageToken){ let q; if(!prevPageToken){ var btnOutput = '<div class="button-container">' + '<button id="next-button" class="paging-button" data-token="' +nextPageToken+'" data-query="'+q+'"+ onclick="nextPage();">Next Page</button></div>'; }else{ var btnOutput = '<div class="button-container">' + '<button id="prev-button" class="paging-button" data-token="' +prevPageToken+'" data-query="'+q+'"+ onclick="prevPage();">Previous Page</button>'+ '<button id="next-button" class="paging-button" data-token="' +nextPageToken+'" data-query="'+q+'"+ onclick="nextPage();">Next Page</button> </div>'; } return btnOutput; } ``` ### getOutput(item) 設定一些從JSON檔觀察出的變數,建立成output字串(有標題、圖片及文字的html內容),return output內容至呼叫函式的地方。 ![](https://i.imgur.com/6pQTvbj.png) ```.js function getOutput(item){ var videoId = item.id.videoId; var title = item.snippet.title; var description = item.snippet.description; var thumb = item.snippet.thumbnails.high.url; var channelTitle = item.snippet.channelTitle; var videoDate = item.snippet.publishedAt; // Build Output String var output = "<li>" + '<div class="list-left">' + '<img src="' + thumb + '">' + "</div>" + '<div class="list-right">' + '<h3><a class="fancybox fancybox.iframe" href="http://www.youtube.com/embed/' + videoId + '">' + title + "</a></h3>" + '<small>By <span class="cTitle">' + channelTitle + "</span> on " + videoDate + "</small>" + "<p>" + description + "</p>" + "</div>" + "</li>" + '<div class="clearfix"></div>' + ""; return output; } ``` ==*== return 很重要,要是沒有return 東西只是被創造出來,不會丟回去html裡。 ### nextPage() / prevPage() 使用搜尋功能搜出影片後,在頁面會出現一個`next page`的button,點擊促發nextPage()函式,這裡函式跟`videoSearch()`很像,主要差別在,由上面我們先跑出來的data,觀察出要帶入下一頁或上一頁的資訊必須要有一個token,才可以帶入,這裡先定義token及q的變數,再帶入`$.get`中,之後跑出來的data,一樣創造html內容 ```.js //nextpage button function nextPage(){ let token = $('#next-button').data('token'); console.log(token) let q = $('#next-button').data('query'); $('#videos').html(''); $('#button').html(''); q = $("#search").val(); $.get("https://www.googleapis.com/youtube/v3/search",{ key: 'AIzaSyCSwkueGwGH8xdWDDgcMMAdXDRxKg0uEiE', type: 'video', part: 'snippet, id', pageToken: token, q: q, }, function(data){ let prevPageToken = data.prevPageToken; let nextPageToken = data.nextPageToken; console.log(data); data.items.forEach(item => { video = getOutput(item); $("#videos").append(video); }); //show button let buttons =getButton(prevPageToken, nextPageToken); $('#button').append(buttons); }) } ``` ### fancybox FancyBox是一套jQuery 的套件,可以可以套用在圖片及影片上呈現放大燈箱的效果。 - [fancyBox CDN](https://cdnjs.com/libraries/fancybox) - [官方document](http://fancyapps.com/fancybox/3/docs/#video) ==注意== 再index.html中,最後要有啟用的動作,不然會沒有效果。 ```.js <script> $('[data-fancybox]').fancybox({ youtube : { controls : 0, showinfo : 0 }, vimeo : { color : 'f00' } }); </script> ``` ###### tags: `javascript`