成品
觀察功能需求
搜尋框,輸入搜尋關鍵字,下方會列出5筆列表
按下next page 會取得下5筆資料
按下prev page,會取得上5筆資料
ajax 在同一個頁面,不做刷新就可以改變頁面的內容。 q: query
youtube API(application programming interface)資料查看 YouTube 資料 API 參考手冊
取得授權:憑證
API 金鑰:AIzaSyCKPRCaNS-PQJLl2jzoQEf-O4I0tnrtd8M
1 2 jQuery API D ocument => 表示看官方文件 串API =>
檢視範例,ajax資料的情形
JS 部分 1.嘗試串接Youtube API
首先需考量,我們所需要的資料參數有哪些(
在抓取成功的部分,要設置抓取五筆搜尋到的五筆資料,並將其呈現於頁面
除了5筆資料外,還需要跳轉上、下頁的按鈕1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 function getVideo ( ) { let value = $('#search-field' ).val (); let youtubeURL = "https://www.googleapis.com/youtube/v3/search" ; $.ajax ({ type : "GET" , url : youtubeURL, data : { part : 'id,snippet' , q : value, maxResults : 5 , type : "video" , key : 'AIzaSyCKPRCaNS-PQJLl2jzoQEf-O4I0tnrtd8M' }, dataType : "json" , success : function (data ) { let nextPageToken = data.nextPageToken ; let prevPageToken = data.prevPageToken ; insertItems (data); getBtn (data, prevPageToken, nextPageToken) }, error : function (err ) { console .log ('oh no' ); } }); }
網址放入參數[JS] 使用 JavaScript 解析網址與處理網址中的參數(URL Parameters)
2.將資料呈現於頁面(insertItems())
透過迴圈方式將要抓取的資料依序填入
觀察原本畫面結構,並依據去找尋資料中符合的資料
videoId、videoTitle、description、channelTitle…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function insertItems (item ) { let output = '' ; $.each (item.items , function (index, value ) { let videoId = item.items [index].id .videoId ; let videoTitle = item.items [index].snippet .title ; let description = item.items [index].snippet .description ; let thumbnailURL = item.items [index].snippet .thumbnails .high .url ; let channelTitle = item.items [index].snippet .channelTitle ; let publishedDate = item.items [index].snippet .publishedAt ; output += `<li><div class="list-left"> <img src=" ${thumbnailURL} "></div> <div class="list-right"> <h3> <a data-fancybox data-type="iframe" data-src="https://www.youtube.com/embed/${videoId} " "href="javascript:;"> ${videoTitle} </a></h3> <small>By <span class="cTitle"> ${channelTitle} </span> on ${publishedDate} </small> <p> ${description} <p></div></li> <div classs="clearfix"></div> ` $('#results' ).html (output); }); };
3.製作上、下頁的按鈕鍵
注意該函式要帶入的參數有哪些
我們要判斷為,在第一頁時,只有下一頁的按鈕
判斷方式為,(!prevPageToken)
沒有上一頁的token
(截圖)
在判斷之中,我們需要將要插入的標籤與內容,放入,並append到畫面要呈現的位置
注意:在插入的button之中,加入data-token="${nextPageToken}" data-query="${value}"
,用於後續抓取屬性內容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function getBtn (value, prevPageToken, nextPageToken ) { console .log (nextPageToken) if (!prevPageToken) { var btnOutput = $(`<div class="button-container"> <button id="next-button" class="paging-button" data-token="${nextPageToken} " data-query="${value} " onclick="pressNext();"> Next Page</button></div>` ) $("#buttons" ).append (btnOutput); } else { var btnOutput = $(`<div class="button-container"><button id="prev-button" class="paging-button" data-token="${prevPageToken} " data-query="${value} " onclick="pressPrev();"> Prev Page</button> <button id="next-button" class="paging-button" data-token="${nextPageToken} " data-query="${value} " onclick="pressNext();">Next Page</button></div>` ) $("#buttons" ).append (btnOutput); } }
Youtube:Implementation: Pagination
4.下一頁點下後,下五筆的資料
同樣以ajax的方式來抓取
在參數的地方我們要抓取的是,按取下一頁的token
success之中所應用的函示,同樣為插入5筆的資料,以及上下頁的按鈕
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 function pressNext ( ) { let youtubeURL = "https://www.googleapis.com/youtube/v3/search" ; let token = $('#next-button' ).data ('token' ); let value = $('#search-field' ).val (); $.ajax ({ type : "GET" , url : youtubeURL, data : { part : 'id,snippet' , q : value, pageToken : token, maxResults : 5 , type : "video" , key : 'AIzaSyCKPRCaNS-PQJLl2jzoQEf-O4I0tnrtd8M' }, dataType : "json" , success : function (data ) { console .log (data); let nextPageToken = data.nextPageToken ; let prevPageToken = data.prevPageToken ; $('#results' ).html ('' ); $('#buttons' ).html ('' ); insertItems (data); getBtn (data, prevPageToken, nextPageToken) }, error : function (err ) { console .log ('oh no' ); } }); }
5.上一頁
同樣的抓取方式,只有要帶入的資料有些差異
token = $('#prev-button').data('token');
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 function pressPrev ( ) { $('#results' ).html ('' ); $('#buttons' ).html ('' ); let youtubeURL = new URL (`https://www.googleapis.com/youtube/v3/search?` ); let token = $('#prev-button' ).data ('token' ); let value = $('#search-field' ).val (); $.ajax ({ type : "GET" , url : youtubeURL, data : { part : 'id,snippet' , q : value, pageToken : token, maxResults : 5 , type : "video" , key : 'AIzaSyCKPRCaNS-PQJLl2jzoQEf-O4I0tnrtd8M' }, dataType : "json" , success : function (data ) { console .log (data); let nextPageToken = data.nextPageToken ; let prevPageToken = data.prevPageToken ; $('#results' ).html ('' ); $('#buttons' ).html ('' ); insertItems (data); getBtn (data, prevPageToken, nextPageToken) }, error : function (err ) { console .log ('oh no' ); } }); }
HTML5 自定義屬性 data-* 和 jQuery.data 詳解 2018.06.20 [技術分享] 什麼是 HTML 5 中的資料屬性(data-* attribute)
6.運用fancybox的方式彈出
補充知識: XMLHttpRequest(XHR):是一種規範,用來發ajax使用
token(令牌):唯一的、可以認證身份或取得資料
GET:向伺服器發request,(伺服器會告訴我們要發伺服器的網址,我們向它請求資訊)
用瀏覽器debug
可在watch加上要觀察的變數
參考資料[30apis] Day 7 : YouTube Data API + 基礎 Fetch API How To Implement A Youtube Video Search Using Youtube Data API V3 Youtube Data API 使用手札 Youtube Data API 申請 配額
1 2 3 4 5 6 7 8 9 10 11 12 13 { "error" : { "code" : 403 , "message" : "The request cannot be completed because you have exceeded your \u003ca href=\"/youtube/v3/getting-started#quota\"\u003equota\u003c/a\u003e." , "errors" : [ { "message" : "The request cannot be completed because you have exceeded your \u003ca href=\"/youtube/v3/getting-started#quota\"\u003equota\u003c/a\u003e." , "domain" : "youtube.quota" , "reason" : "quotaExceeded" } ] } }
favicon.ico error
問題:
script.js: Allow attribute will take precedence over ‘allowfullscreen’.