在練習 Ajax 串接實作時,饅頭計畫中就推薦就找了幾個實作作業,找有開放資源的網站(如:YouTube、Github、氣象局),製作搜尋引擎取得資料。而在串接其他平台的資料,很重要的一點就是要練習看該平台所提供的官方文件,從提供的資料可以知道要怎麼取得所需要的資料、參數要如何放。必須說,一開始真的花滿多的時間在看文件,不段嘗試串接的參數,反覆查看取得的資料是否合乎需求。
取得授權:憑證

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,// 預設為五筆資料,可以設定1~50
      type: "video",
      key: '放入申請的金鑰'// 使用 API 只能取得公開的播放清單
    },
    dataType: "json",
    success: function (data) {
      //console.log(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)
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);
  });
};
(!prevPageToken)沒有上一頁的tokendata-token="${nextPageToken}" data-query="${value}",用於後續抓取屬性內容。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
//取得下一頁的資料
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,// 預設為五筆資料,可以設定1~50
      type: "video",
      key: '放入申請的金鑰'// 使用 API 只能取得公開的播放清單
    },
    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');
    }
  });
}
token = $('#prev-button').data('token');
//前一頁
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,// 預設為五筆資料,可以設定1~50
      type: "video",
      key: '放入申請的金鑰'// 使用 API 只能取得公開的播放清單
    },
    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)
使用fancyBox展示影片
使用iframe連結欲嵌入的外部影片連結
透過CDN方式連結fancybox套件
<!-- fancyBox -->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" />
  <script src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js"></script>
<h3><a data-fancybox data-type="iframe" data-src="https://www.youtube.com/embed/${videoId}" "href="javascript:;"> ${videoTitle} 
</a></h3>
$('[data-fancybox]').fancybox({
  toolbar  : false,
  smallBtn : true,
  iframe : {
    preload : false
  }
})
今天文章的練習來源: [jQuery] - 練習-Youtube Search Engine