1. 準備 | 2. ローディングアニメ実装方法 | 2-1 ローディング中表示、非表示の方法| 2-2 ローディングアニメ実装方法 - 4パターン
ローディングアニメ(Nowloading)をYouTube検索ページ(PHP)に実装してみました。
実装対象のYouTube検索ページ(PHP)の元ソースコードは、つぎのサイトの「動画の検索(認証なし)」HTMLサンプル(フリー)です。
https://phpjavascriptroom.com/?t=strm&p=youtubedataapi_v3_list#a_search_noauth_video
本ページでは、つぎの4つのローディングアニメ画像を使用し、それぞれの実装サンプルについて説明します。
使用するYouTUbe検索HTML、ローディングアニメ画像などをフリー画像を公開しているサイトからダウンロードして準備します。
1. GIFアニメ画像 |
2. FontAwesomeのWebアイコンフォント |
3. CSSのみで生成したアニメ画像 ●
|
4. javascriptで描いたYouTube風線画アニメ 上、灰色線上に赤線が左から右へ描かれます。 |
ローディング中表示、非表示を行うJabascriptなどの機能(スペック)は、つぎのとおり10のスペックで構成されています。
ただし、表示するローディングアニメの種類により多少の違いがありますす。
表示するローディングアニメの種類はつぎのとおりです。アニメは、上spec-7 ローディング中表示アニメ画像配置DIV域に置きます。 ローディングアニメの種類と使用スペックの対応を下表に示します。
表示アニメのパターン(種類) | spec-1 | spec-2 | spec-3 | spec-4 | spec-5 | spec-6 | spec-7 | spec-8 | spec-9 | spec-10 | spec-11 |
1. GIFアニメ画像 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | |||
2. FontAwesomeのWebアイコンフォント | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
3. CSSのみで生成したアニメ画像 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ||
4. javascriptで描いたYouTube風線画アニメ | ○ | ○ | ○ | ○ | ○ | ○ |
つぎに、下タブメニューに示すコードは実装対象の「YouTube検索HTML」の中に、11のスペックコードをどの位置に配置するかを「表示するアニメ」の種類ごとに示します。
実装追加するスペックコードを青字で示し、スペック番号(1-11)を付与しています。
なお、元のYouTube検索HTMLコードのJavascript(7行目から194行目)の部分は省略形で表示しています。
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css">
<title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> ←6行目
<?php //spec-1前部 YouTube検索javascript
if(isset($_REQUEST['keyword'])){
$keyWord = $_REQUEST['keyword']; // 検索キーワード
print <<<YOU
<script> ←7行目
/* 開発キー
https://code.google.com/apis/console
*/
var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; // ←11行目 YuTube API KEY 要変更
function onJSClientLoad() {
dbg("★onJSClientLoad");
gapi.client.setApiKey(APIKEY);
gapi.client.load('youtube', 'v3', function(){
$.getYouTubeResults({
query:"$keyWord", // ←18行目 "ハムスター hamster"を"$keyWord"に変更
order:"date",
limit:50,
maxResults:10
});
});
}
・
・
</script> ←194行目
YOU;
} //spec-1後部 YOU;から3行
?>
<style>
/* spec-2 ローディング画面フェードレイヤーCSS */
#fadeLayer {
position:absolute;
top:0px;
left:0px;
width:100%;
height:100%;
background-color:#000000; /* 黒 */
opacity:0.50;
visibility:hidden;
z-index:10;
}
/* spec-3 ローディングアニメ表示域CSS */
#nowLoading {
position: absolute;
left: 580px;
top: 150px;
width: 48px;
height: 48px;
visibility: hidden;
text-align: center;
border-radius: 50%;
}
</style>
<script> // spec-4 ローディング中非表示javascript
window.onload = function() {
document.getElementById("nowLoading").style.visibility="hidden"; //ローディングアニメ画像非表示
document.getElementById("fadeLayer").style.visibility="hidden"; //ローディング終了時のフェード画面(明るくする)
document.getElementById("keyWord").value = "<?php echo $_REQUEST['keyword'] ?>";
};
</script>
<script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> ←195行目
<link rel="stylesheet" type="text/css" href="/common/css/example.css"></head>
</head>
<body>
<!-- spec-5 YouTube検索フォーム -->
<form name="sform" ACTION="#" method=post>
<input type="search" value="" name="keyword" size=50 id="keyWord">
<input type="submit" value="YouTube検索">
</form>
<h3 class='h'>実行結果</h3>
<h1>設置サンプル:[YouTube API(v3) - 動画検索(認証なし)</h1>
<p> 'ハムスター'または'hamster'がタイトルに含まれる動画を、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p>
<div id="message"></div>
<div id="results"></div>
<!-- spec-6 ローディング中表示画面フェイドレイヤーDIV域 -->
<div id="fadeLayer"></div>
<!-- spec-7 ローディング中表示アニメ画像配置DIV域 -->
<div id="nowLoading"><img src="nowloading-712-48.gif" id="imgloading" width=48></div>
<?php // spec-8 ローディング中表示javascript 上2つDIV域の後に配置
if(isset($_REQUEST['keyword'])){
print "<script>\n";
print "document.getElementById('nowLoading').style.visibility='visible';\n"; //ローディングアニメ画像表示
print "document.getElementById('fadeLayer').style.visibility='visible';\n"; //ローディングアニメ表示中のフェード画面(うす暗くする)
print "</script>";
}
?>
</body>
</html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css">
<title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<?php //spec-1 YouTube検索javascript
if(isset($_REQUEST['keyword'])){
$keyWord = $_REQUEST['keyword']; // 検索キーワード
print <<<YOU
<script>
/* 開発キー
https://code.google.com/apis/console
*/
var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; // ←11行目 YuTube API KEY 要変更
function onJSClientLoad() {
dbg("★onJSClientLoad");
gapi.client.setApiKey(APIKEY);
gapi.client.load('youtube', 'v3', function(){
$.getYouTubeResults({
query:"$keyWord", // ←18行目 "ハムスター hamster"を"$keyWord"に変更
order:"date",
limit:50,
maxResults:10
});
});
}
・
・
</script> ←194行目
YOU;
}
?>
<style>
/* spec-2 ローディング画面フェードレイヤーCSS */
#fadeLayer {
position:absolute;
top:0px;
left:0px;
width:100%;
height:100%;
background-color:#000000; /* 黒 */
opacity:0.50;
visibility:hidden;
z-index:10;
}
/* spec-3 ローディングアニメ表示域CSS */
#nowLoading {
position: absolute;
left: 580px;
top: 150px;
width: 48px;
height: 48px;
visibility: hidden;
text-align: center;
border-radius: 50%;
}
</style>
<script> // spec-4 ローディング中非表示javascript
window.onload = function() {
document.getElementById("nowLoading").style.visibility="hidden"; //ローディングアニメ画像非表示
document.getElementById("fadeLayer").style.visibility="hidden"; //ローディング終了時のフェード画面(明るくする)
document.getElementById("keyWord").value = "<?php echo $_REQUEST['keyword'] ?>";
};
</script>
<!-- spec-11 ウェブフォント fontawesome CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script>
<link rel="stylesheet" type="text/css" href="/common/css/example.css"></head>
</head>
<body>
<!-- spec-5 YouTube検索フォーム -->
<form name="sform" ACTION="#" method=post>
<input type="search" value="" name="keyword" size=50 id="keyWord">
<input type="submit" value="YouTube検索">
</form>
<h3 class='h'>実行結果</h3>
<h1>設置サンプル:[YouTube API(v3) - 動画検索(認証なし)</h1>
<p> 'ハムスター'または'hamster'がタイトルに含まれる動画を、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p>
<div id="message"></div>
<div id="results"></div>
<!-- spec-6 ローディング中表示画面フェイドレイヤーDIV域 -->
<div id="fadeLayer"></div>
<!-- spec-7 ローディング中表示 webアイコンフォント配置DIV域 -->
<div id="nowLoading"><i class="fa fa-spinner fa-spin fa-5x fa-fw" style="color: blue"></i></div>
<?php // spec-8 ローディング中表示javascript 上2つDIV域の後に配置
if(isset($_REQUEST['keyword'])){
print "<script>\n";
print "document.getElementById('nowLoading').style.visibility='visible';\n"; //ローディングアニメ画像表示
print "document.getElementById('fadeLayer').style.visibility='visible';\n"; //ローディングアニメ表示中のフェード画面(うす暗くする)
print "</script>";
}
?>
</body>
</html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css">
<title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<?php //spec-1 YouTube検索javascript
if(isset($_REQUEST['keyword'])){
$keyWord = $_REQUEST['keyword']; // 検索キーワード
print <<<YOU
<script>
/* 開発キー
https://code.google.com/apis/console
*/
var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; // ←11行目 YuTube API KEY 要変更
function onJSClientLoad() {
dbg("★onJSClientLoad");
gapi.client.setApiKey(APIKEY);
gapi.client.load('youtube', 'v3', function(){
$.getYouTubeResults({
query:"$keyWord", // ←18行目 "ハムスター hamster"を"$keyWord"に変更
order:"date",
limit:50,
maxResults:10
});
});
}
・
・
</script> ←194行目
YOU;
}
?>
<style>
/* spec-2 ローディング画面フェードレイヤーCSS */
#fadeLayer {
position:absolute;
top:0px;
left:0px;
width:100%;
height:100%;
background-color:#000000; /* 黒 */
opacity:0.50;
visibility:hidden;
z-index:10;
}
/* spec-3 ローディングアニメ表示域CSS */
#nowLoading {
position: absolute;
left: 580px;
top: 150px;
width: 48px;
height: 48px;
visibility: hidden;
text-align: center;
border-radius: 50%;
}
</style>
<!-- spec-9 CSSアニメ -->
<style>
.atom-spinner, .atom-spinner * {
box-sizing: border-box;
}
.atom-spinner {
height: 60px;
width: 60px;
overflow: hidden;
}
.atom-spinner .spinner-inner {
position: relative;
display: block;
height: 100%;
width: 100%;
}
.atom-spinner .spinner-circle {
display: block;
position: absolute;
color: Coral;
font-size: calc(60px * 0.24);
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.atom-spinner .spinner-line {
position: absolute;
width: 100%;
height: 100%;
border-radius: 50%;
animation-duration: 1s;
border-left-width: calc(60px / 25);
border-top-width: calc(60px / 25);
border-left-color: Blue;
border-left-style: solid;
border-top-style: solid;
border-top-color: transparent;
}
.atom-spinner .spinner-line:nth-child(1) {
animation: atom-spinner-animation-1 1s linear infinite;
transform: rotateZ(120deg) rotateX(66deg) rotateZ(0deg);
}
.atom-spinner .spinner-line:nth-child(2) {
animation: atom-spinner-animation-2 1s linear infinite;
transform: rotateZ(240deg) rotateX(66deg) rotateZ(0deg);
}
.atom-spinner .spinner-line:nth-child(3) {
animation: atom-spinner-animation-3 1s linear infinite;
transform: rotateZ(360deg) rotateX(66deg) rotateZ(0deg);
}
@keyframes atom-spinner-animation-1 {
100% {
transform: rotateZ(120deg) rotateX(66deg) rotateZ(360deg);
}
}
@keyframes atom-spinner-animation-2 {
100% {
transform: rotateZ(240deg) rotateX(66deg) rotateZ(360deg);
}
}
@keyframes atom-spinner-animation-3 {
100% {
transform: rotateZ(360deg) rotateX(66deg) rotateZ(360deg);
}
}
</style>
<script> // spec-4 ローディング中非表示javascript
window.onload = function() {
document.getElementById("nowLoading").style.visibility="hidden"; //ローディングアニメ画像非表示
document.getElementById("fadeLayer").style.visibility="hidden"; //ローディング終了時のフェード画面(明るくする)
document.getElementById("keyWord").value = "<?php echo $_REQUEST['keyword'] ?>";
};
</script>
<script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script>
<link rel="stylesheet" type="text/css" href="/common/css/example.css"></head>
</head>
<body>
<!-- spec-5 YouTube検索フォーム -->
<form name="sform" ACTION="#" method=post>
<input type="search" value="" name="keyword" size=50 id="keyWord">
<input type="submit" value="YouTube検索">
</form>
<h3 class='h'>実行結果</h3>
<h1>設置サンプル:[YouTube API(v3) - 動画検索(認証なし)- CSS生成アニメ</h1>
<p> 'ハムスター'または'hamster'がタイトルに含まれる動画を、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p>
<div id="message"></div>
<div id="results"></div>
<!-- spec-6 ローディング中表示画面フェイドレイヤーDIV域 -->
<div id="fadeLayer"></div>
<!-- spec-7 ローディング中表示アニメ画像配置DIV域 -->
<DIV class="atom-spinner" id="nowLoading">
<div class="spinner-inner">
<div class="spinner-line"></div>
<div class="spinner-line"></div>
<div class="spinner-line"></div>
<!--Chrome renders little circles malformed :(-->
<div class="spinner-circle">●</div>
</div>
</DIV>
<?php // spec-8 ローディング中表示javascript 上2つDIV域の後に配置
if(isset($_REQUEST['keyword'])){
print "<script>\n";
print "document.getElementById('nowLoading').style.visibility='visible';\n"; //ローディングアニメ画像表示
print "document.getElementById('fadeLayer').style.visibility='visible';\n"; //ローディングアニメ表示中のフェード画面(うす暗くする)
print "</script>";
}
?>
</body>
</html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css">
<title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<?php //spec-1 YouTube検索javascript
if(isset($_REQUEST['keyword'])){
$keyWord = $_REQUEST['keyword']; // 検索キーワード
print <<<YOU
<script>
/* 開発キー
https://code.google.com/apis/console
*/
var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; // ←11行目 YuTube API KEY 要変更
function onJSClientLoad() {
dbg("★onJSClientLoad");
gapi.client.setApiKey(APIKEY);
gapi.client.load('youtube', 'v3', function(){
$.getYouTubeResults({
query:"$keyWord", // ←18行目 "ハムスター hamster"を"$keyWord"に変更
order:"date",
limit:50,
maxResults:10
});
});
}
・
・
</script> ←194行目
YOU;
}
?>
<style>
/* spec-3 ローディングアニメ表示域CSS */
#nowLoading {
position: absolute;
left: 0px;
top: 0px;
visibility: hidden;
}
</style>
<!-- spec-10 横線アニメーション -->
<script>
//*************** 横線アニメーション ***************//
var drawHorizontalLineAnim = function() {
// 変数定義(共通設定)
var cs = document.getElementById('nowLoading'),
ctx = cs.getContext('2d'),
csWidth = cs.width,
csHeight = cs.height,
center = {
x: csWidth / 2,
y: csHeight / 2
};
// 線の基本スタイル(共通設定)
ctx.strokeStyle = "red"; //'#666';
ctx.lineWidth = 10;
// 横線アニメーション処理
var beginPos = 0, // スタート位置
movePos = beginPos, // 移動位置(現在位置)
addVal = 30, // 加算量 10
endPos = csWidth - 10, // 終了位置
isAnim = function() { // アニメーションを終了する条件
return (movePos < endPos);
};
var render = function() {
ctx.beginPath();
ctx.moveTo(beginPos, center.y);
ctx.lineTo(movePos, center.y);
ctx.closePath();
ctx.stroke();
if (isAnim() === true) {
movePos += addVal;
// ↑のaddで終了点を超えることがあるため上限を決める
movePos = (isAnim() === false) ? endPos : movePos;
requestAnimationFrame(render)
}
};
render();
};
</script>
<script> // spec-4 ローディング中非表示javascript
window.onload = function() {
document.getElementById("nowLoading").style.visibility="hidden"; //ローディングアニメ画像非表示
document.getElementById("keyWord").value = "<?php echo $_REQUEST['keyword'] ?>";
};
</script>
<script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script>
<link rel="stylesheet" type="text/css" href="/common/css/example.css"></head>
</head>
<body>
<!-- spec-5 YouTube検索フォーム -->
<form name="sform" ACTION="#" method=post>
<input type="search" value="" name="keyword" size=50 id="keyWord">
<input type="submit" value="YouTube検索">
</form>
<h3 class='h'>実行結果</h3>
<h1>設置サンプル:[YouTube API(v3) - 動画検索(認証なし)</h1>
<p> 'ハムスター'または'hamster'がタイトルに含まれる動画を、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p>
<div id="message"></div>
<div id="results"></div>
<!-- spec-7 ローディングアニメ画像配置CANVAS域 -->
<canvas id="nowLoading" width="1600" height="2"></canvas>
<?php // spec-8 ローディング中表示javascript 上2つDIV域の後に配置
if(isset($_REQUEST['keyword'])){
print "<script>\n";
print "document.getElementById('nowLoading').style.visibility='visible';\n"; //ローディングアニメ画像表示
print "drawHorizontalLineAnim();"; //横線アニメ関数起動
print "</script>";
}
?>
</body>
</html>
<style> /* spec-3 ローディングアニメ表示域CSS */ #nowLoading { position: absolute; left: 0px; top: 0px; width:2px; height:2px; background-color: red; visibility: hidden; } </style> <!-- spec-10 横線アニメーション --> <script> function drawHorizontalLineAnim(){ $(function(){ $('.box3').animate({ width: '100%' }, 5000, 'linear'); }); } </script> <!-- spec-7 ローディングアニメ画像配置DIV域 --> <div id="nowLoading"></div>
YouTube検索原本MTMLに対して、上記各スペックを実装配置した結果のPHPソースコード(全体)をローディングアニメごとに、下タブメニューに示します。
PHPソースコードは、実装配置したコードの部分をライトブルー背景で表示しています。
・実装スペック配置手順
・ローディングアニメ実装済みPHPの4パターンのデモ:
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> /* 開発キー https://code.google.com/apis/console */ var APIKEY="AIzaSyC3VBRnfUU9_qO1Gr1ARBO8BZLT-Sp6vFc"; function onJSClientLoad() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', function(){ $.getYouTubeResults({ query:"ハムスター hamster", order:"date", limit:50, maxResults:10 }); }); } (function($){ $.getYouTubeResults=function(options){ dbg("★getYouTubeResults"); var opt=$.extend({ query:"", type:"video", maxResults:10, limit:0, channelId:"", regionCode:"JP", /* 国コード */ order:"viewCount", /* 検索順 */ part:"id, snippet, status", fields:"" },options); var pageToken="",s=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; var requestOptions = { maxResults:opt.maxResults, //1ページ当たりの結果数最大値(0-50)デフォルト10 q:opt.query, /* 検索キーワード */ regionCode:opt.regionCode, type:opt.type,//video,channel,playlist order:opt.order, /* publishedAfter publishedBefore topicId videoCaption videoCategoryId videoDefinition videoDimension videoDuration videoEmbeddable videoLicense "relatedToVideoId:"0f1SLJEY6iY",//指定した動画の関連動画のみ検索対象とする videoSyndicated youtube.com外で再生できる動画のみ検索 channelId チャンネル固有ID(ユーザー名ではない)を指定すると、そのチャンネル内での検索となる */ "part":"id,snippet" }; if(opt.fields!="") requestOptions.fields=opt.fields; makeRequest(); /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:"", path:"/youtube/v3/search", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ $("#message").html(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ pageToken=resp.nextPageToken; /* dbg("output");dbg("pageToken:"+pageToken); */ if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ if(opt.limit>0 && totalResults> opt.limit){ totalResults=opt.limit; } total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<li>結果数最大値の指定:"+opt.maxResults+"</li>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>取得数上限:"+((opt.limit==0)?"∞":opt.limit)+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; $("#results").append("<h2>Results</h2>"+s); s=""; if(totalResults==0){ $("#message").html("検索条件に一致するデータがありませんでした"); } } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Search Results</h2>"+s); } } function itemOutput(items){ //dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(j>=opt.limit) return; j=(allcnt*resultsPerPage)+i+1; if(item.id && item.snippet){ s+="<dl>"; /* id */ var id=item.id.videoId; var kind=item.id.kind; var thumbnails_default="no thumbnails"; var snippet=item.snippet; var title=(snippet.title)?snippet.title:"no title"; var channelId=(snippet.channelId)?snippet.channelId:"no channelId"; var channelTitle=(snippet.channelTitle)?snippet.channelTitle:"no channelTitle"; var pubdatedAt=(snippet.publishedAt)?formatDate(snippet.publishedAt):"no publishedAt"; var description=(snippet.description)?snippet.description:"no description"; if(snippet.thumbnails){ $.each(snippet.thumbnails, function(y, ytem){ //default, medium, height if(y=="default"){ thumbnails_default=ytem.url; } }); } s+="<dt>"; s+="<a href='http://www.youtube.com/watch?v="+id+"'><img src='"+thumbnails_default+"'></a>"; s+="</dt><dd>【"+j+"】"; s+="<p>種類:"+kind+"</a></p>"; s+="<p>動画タイトル(ID):<a href='http://www.youtube.com/watch?v="+id+"'>"+title+"("+id+")</a></p>"; s+="<p>動画が属するチャンネルのタイトル(ID): <a href='http://www.youtube.com/channel/"+channelId+"'>"+channelTitle+"("+channelId+")</a></p>"; s+="<p>動画の公開日: "+pubdatedAt+"</p>"; s+="<p>動画の説明文:"+description+"</p>"; /* if(snippet.resourceId && snippet.resourceId.videoId){ s+="<p>resourceId.videoId:<a href='http://www.youtube.com/watch?v="+snippet.resourceId.videoId+"'>"+snippet.resourceId.videoId+"</a></p>"; } */ s+="</dd></dl>"; } }); } return this; } })(jQuery); var formatDate=function(str){ var tmp=str.split("T"); var ymd=tmp[0].split("-"); var hms=tmp[1].split(":"); var sec=hms[2].split(".")[0]; var d=new Date(new Date(ymd[0], ymd[1]-1, ymd[2], hms[0], hms[1], sec).getTime()+(1000*60*60*9)); //+9h var year=d.getFullYear(); var month=d.getMonth()+1; var day=d.getDate(); var hour=(d.getHours() < 10 ) ? '0'+d.getHours() : d.getHours(); var min =(d.getMinutes() < 10 ) ? '0'+d.getMinutes() : d.getMinutes(); var sec =(d.getSeconds() < 10 ) ? '0'+d.getSeconds() : d.getSeconds(); return year+"/"+month+"/"+day+" "+hour+":"+min;//+":"+sec; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script> <script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> <link rel="stylesheet" type="text/css" href="/common/css/example.css"></head> <body id='example3' class='example'><div class="ads" style="margin:32px auto;text-align:center;"></div><h1 class='h'><a href='/'>PHP & JavaScript Room</a> :: 設置サンプル</h1> <h3 class='h'>実行結果</h3> <h1>設置サンプル:[YouTube API(v3) - 動画検索(認証なし)</h1> <p> 'ハムスター'または'hamster'がタイトルに含まれる動画を、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p> <div id="message"></div> <div id="results"></div> </body> </html>
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script><?php //spec-1 YouTube検索javascript if(isset($_REQUEST['keyword'])){ $keyWord = $_REQUEST['keyword']; // 検索キーワード class="prettyprint linenums" print <<<YOU<script> /* 開発キー https://code.google.com/apis/console */ var APIKEY="AIzaSyDFNkPw-ics1W_-x0x3tYqNpsEcEIf9r-8"; // ←元11行目 YuTube API KEY 要変更 function onJSClientLoad() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', function(){ $.getYouTubeResults({ query:"$keyWord", // ←元18行目 "ハムスター hamster"を"$keyWord"に変更 order:"date", limit:50, maxResults:10 }); }); } (function($){ $.getYouTubeResults=function(options){ dbg("★getYouTubeResults"); var opt=$.extend({ query:"", type:"video", maxResults:10, limit:0, channelId:"", regionCode:"JP", /* 国コード */ order:"viewCount", /* 検索順 */ part:"id, snippet, status", fields:"" },options); var pageToken="",s=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; var requestOptions = { maxResults:opt.maxResults, //1ページ当たりの結果数最大値(0-50)デフォルト10 q:opt.query, /* 検索キーワード */ regionCode:opt.regionCode, type:opt.type,//video,channel,playlist order:opt.order, /* publishedAfter publishedBefore topicId videoCaption videoCategoryId videoDefinition videoDimension videoDuration videoEmbeddable videoLicense "relatedToVideoId:"0f1SLJEY6iY",//指定した動画の関連動画のみ検索対象とする videoSyndicated youtube.com外で再生できる動画のみ検索 channelId チャンネル固有ID(ユーザー名ではない)を指定すると、そのチャンネル内での検索となる */ "part":"id,snippet" }; if(opt.fields!="") requestOptions.fields=opt.fields; makeRequest(); /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:"", path:"/youtube/v3/search", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ $("#message").html(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ pageToken=resp.nextPageToken; /* dbg("output");dbg("pageToken:"+pageToken); */ if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ if(opt.limit>0 && totalResults> opt.limit){ totalResults=opt.limit; } total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<li>結果数最大値の指定:"+opt.maxResults+"</li>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>取得数上限:"+((opt.limit==0)?"∞":opt.limit)+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; $("#results").append("<h2>Results</h2>"+s); s=""; if(totalResults==0){ $("#message").html("検索条件に一致するデータがありませんでした"); } } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Search Results</h2>"+s); } } function itemOutput(items){ //dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(j>=opt.limit) return; j=(allcnt*resultsPerPage)+i+1; if(item.id && item.snippet){ s+="<dl>"; /* id */ var id=item.id.videoId; var kind=item.id.kind; var thumbnails_default="no thumbnails"; var snippet=item.snippet; var title=(snippet.title)?snippet.title:"no title"; var channelId=(snippet.channelId)?snippet.channelId:"no channelId"; var channelTitle=(snippet.channelTitle)?snippet.channelTitle:"no channelTitle"; var pubdatedAt=(snippet.publishedAt)?formatDate(snippet.publishedAt):"no publishedAt"; var description=(snippet.description)?snippet.description:"no description"; if(snippet.thumbnails){ $.each(snippet.thumbnails, function(y, ytem){ //default, medium, height if(y=="default"){ thumbnails_default=ytem.url; } }); } s+="<dt>"; s+="<a href='http://www.youtube.com/watch?v="+id+"'><img src='"+thumbnails_default+"'></a>"; s+="</dt><dd>【"+j+"】"; s+="<p>種類:"+kind+"</a></p>"; s+="<p>動画タイトル(ID):<a href='http://www.youtube.com/watch?v="+id+"'>"+title+"("+id+")</a></p>"; s+="<p>動画が属するチャンネルのタイトル(ID): <a href='http://www.youtube.com/channel/"+channelId+"'>"+channelTitle+"("+channelId+")</a></p>"; s+="<p>動画の公開日: "+pubdatedAt+"</p>"; s+="<p>動画の説明文:"+description+"</p>"; /* if(snippet.resourceId && snippet.resourceId.videoId){ s+="<p>resourceId.videoId:<a href='http://www.youtube.com/watch?v="+snippet.resourceId.videoId+"'>"+snippet.resourceId.videoId+"</a></p>"; } */ s+="</dd></dl>"; } }); } return this; } })(jQuery); var formatDate=function(str){ var tmp=str.split("T"); var ymd=tmp[0].split("-"); var hms=tmp[1].split(":"); var sec=hms[2].split(".")[0]; var d=new Date(new Date(ymd[0], ymd[1]-1, ymd[2], hms[0], hms[1], sec).getTime()+(1000*60*60*9)); //+9h var year=d.getFullYear(); var month=d.getMonth()+1; var day=d.getDate(); var hour=(d.getHours() < 10 ) ? '0'+d.getHours() : d.getHours(); var min =(d.getMinutes() < 10 ) ? '0'+d.getMinutes() : d.getMinutes(); var sec =(d.getSeconds() < 10 ) ? '0'+d.getSeconds() : d.getSeconds(); return year+"/"+month+"/"+day+" "+hour+":"+min;//+":"+sec; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script>YOU; } ?> <style> /* spec-2 ローディング画面フェードレイヤーCSS */ #fadeLayer { position:absolute; top:0px; left:0px; width:100%; height:100%; background-color:#000000; /* 黒 */ opacity:0.50; visibility:hidden; z-index:10; } /* spec-3 ローディングアニメ表示域CSS */ #nowLoading { position: absolute; left: 580px; top: 150px; width: 48px; height: 48px; visibility: hidden; text-align: center; border-radius: 50%; } </style> <script> // spec-4 ローディング中非表示javascript window.onload = function() { //sleep(3000); // デバッグ用 ローディングアニメ動作確認のため sleep関数 document.getElementById("nowLoading").style.visibility="hidden"; //ローディングアニメ画像非表示 document.getElementById("fadeLayer").style.visibility="hidden"; //ローディング終了時のフェード画面(明るくする) document.getElementById("keyWord").value = "<?php echo $_REQUEST['keyword'] ?>"; }; </script><script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> <link rel="stylesheet" type="text/css" href="/common/css/example.css"></head> <body id='example3' class='example'><div class="ads" style="margin:32px auto;text-align:center;"></div><h1 class='h'><a href='/'>PHP & JavaScript Room</a> :: 設置サンプル - GIFアニメ</h1><!-- spec-5 YouTube検索フォーム --> <form name="sform" ACTION="#" method=post> <input type="search" value="" name="keyword" size=50 id="keyWord"> <input type="submit" value="YouTube検索"> </form><h3 class='h'>実行結果</h3> <h1>設置サンプル:[YouTube API(v3) - 動画検索(認証なし)</h1> <p> 'ハムスター'または'hamster'がタイトルに含まれる動画を、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p> <div id="message"></div> <div id="results"></div><!-- spec-6 ローディング中表示画面フェイドレイヤーDIV域 --> <div id="fadeLayer"></div> <!-- spec-7 ローディング中表示アニメ画像配置DIV域 --> <div id="nowLoading"><img src="../img/nowloading-89-66.gif" id="imgloading" width=48></div> <?php // spec-8 ローディング中表示javascript 上2つDIV域の後に配置 if(isset($_REQUEST['keyword'])){ print "<script>\n"; print "document.getElementById('nowLoading').style.visibility='visible';\n"; //ローディングアニメ画像表示 print "document.getElementById('fadeLayer').style.visibility='visible';\n"; //ローディングアニメ表示中のフェード画面(うす暗くする) print "</script>"; } ?> <!-- ローディングアニメ動作確認用 sleep関数 --> <script> //引数にはミリ秒を指定します。(例:5秒の場合は5000) function sleep(a){ var dt1 = new Date().getTime(); var dt2 = new Date().getTime(); while (dt2 < dt1 + a){ dt2 = new Date().getTime(); } return; } </script></body> </html>
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script><?php //spec-1 YouTube検索javascript if(isset($_REQUEST['keyword'])){ $keyWord = $_REQUEST['keyword']; // 検索キーワード print <<<YOU<script> /* 開発キー https://code.google.com/apis/console */ var APIKEY="AIzaSyDFNkPw-ics1W_-x0x3tYqNpsEcEIf9r-8"; // ←元11行目 YuTube API KEY 要変更 function onJSClientLoad() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', function(){ $.getYouTubeResults({ query:"$keyWord", // ←元18行目 "ハムスター hamster"を"$keyWord"に変更 order:"date", limit:50, maxResults:10 }); }); } (function($){ $.getYouTubeResults=function(options){ dbg("★getYouTubeResults"); var opt=$.extend({ query:"", type:"video", maxResults:10, limit:0, channelId:"", regionCode:"JP", /* 国コード */ order:"viewCount", /* 検索順 */ part:"id, snippet, status", fields:"" },options); var pageToken="",s=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; var requestOptions = { maxResults:opt.maxResults, //1ページ当たりの結果数最大値(0-50)デフォルト10 q:opt.query, /* 検索キーワード */ regionCode:opt.regionCode, type:opt.type,//video,channel,playlist order:opt.order, /* publishedAfter publishedBefore topicId videoCaption videoCategoryId videoDefinition videoDimension videoDuration videoEmbeddable videoLicense "relatedToVideoId:"0f1SLJEY6iY",//指定した動画の関連動画のみ検索対象とする videoSyndicated youtube.com外で再生できる動画のみ検索 channelId チャンネル固有ID(ユーザー名ではない)を指定すると、そのチャンネル内での検索となる */ "part":"id,snippet" }; if(opt.fields!="") requestOptions.fields=opt.fields; makeRequest(); /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:"", path:"/youtube/v3/search", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ $("#message").html(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ pageToken=resp.nextPageToken; /* dbg("output");dbg("pageToken:"+pageToken); */ if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ if(opt.limit>0 && totalResults> opt.limit){ totalResults=opt.limit; } total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<li>結果数最大値の指定:"+opt.maxResults+"</li>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>取得数上限:"+((opt.limit==0)?"∞":opt.limit)+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; $("#results").append("<h2>Results</h2>"+s); s=""; if(totalResults==0){ $("#message").html("検索条件に一致するデータがありませんでした"); } } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Search Results</h2>"+s); } } function itemOutput(items){ //dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(j>=opt.limit) return; j=(allcnt*resultsPerPage)+i+1; if(item.id && item.snippet){ s+="<dl>"; /* id */ var id=item.id.videoId; var kind=item.id.kind; var thumbnails_default="no thumbnails"; var snippet=item.snippet; var title=(snippet.title)?snippet.title:"no title"; var channelId=(snippet.channelId)?snippet.channelId:"no channelId"; var channelTitle=(snippet.channelTitle)?snippet.channelTitle:"no channelTitle"; var pubdatedAt=(snippet.publishedAt)?formatDate(snippet.publishedAt):"no publishedAt"; var description=(snippet.description)?snippet.description:"no description"; if(snippet.thumbnails){ $.each(snippet.thumbnails, function(y, ytem){ //default, medium, height if(y=="default"){ thumbnails_default=ytem.url; } }); } s+="<dt>"; s+="<a href='http://www.youtube.com/watch?v="+id+"'><img src='"+thumbnails_default+"'></a>"; s+="</dt><dd>【"+j+"】"; s+="<p>種類:"+kind+"</a></p>"; s+="<p>動画タイトル(ID):<a href='http://www.youtube.com/watch?v="+id+"'>"+title+"("+id+")</a></p>"; s+="<p>動画が属するチャンネルのタイトル(ID): <a href='http://www.youtube.com/channel/"+channelId+"'>"+channelTitle+"("+channelId+")</a></p>"; s+="<p>動画の公開日: "+pubdatedAt+"</p>"; s+="<p>動画の説明文:"+description+"</p>"; /* if(snippet.resourceId && snippet.resourceId.videoId){ s+="<p>resourceId.videoId:<a href='http://www.youtube.com/watch?v="+snippet.resourceId.videoId+"'>"+snippet.resourceId.videoId+"</a></p>"; } */ s+="</dd></dl>"; } }); } return this; } })(jQuery); var formatDate=function(str){ var tmp=str.split("T"); var ymd=tmp[0].split("-"); var hms=tmp[1].split(":"); var sec=hms[2].split(".")[0]; var d=new Date(new Date(ymd[0], ymd[1]-1, ymd[2], hms[0], hms[1], sec).getTime()+(1000*60*60*9)); //+9h var year=d.getFullYear(); var month=d.getMonth()+1; var day=d.getDate(); var hour=(d.getHours() < 10 ) ? '0'+d.getHours() : d.getHours(); var min =(d.getMinutes() < 10 ) ? '0'+d.getMinutes() : d.getMinutes(); var sec =(d.getSeconds() < 10 ) ? '0'+d.getSeconds() : d.getSeconds(); return year+"/"+month+"/"+day+" "+hour+":"+min;//+":"+sec; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script>YOU; } ?> <style> /* spec-2 ローディング画面フェードレイヤーCSS */ #fadeLayer { position:absolute; top:0px; left:0px; width:100%; height:100%; background-color:#000000; /* 黒 */ opacity:0.50; visibility:hidden; z-index:10; } /* spec-3 ローディングアニメ表示域CSS */ #nowLoading { position: absolute; left: 580px; top: 150px; width: 48px; height: 48px; visibility: hidden; text-align: center; border-radius: 50%; } </style> <script> // spec-4 ローディング中非表示javascript window.onload = function() { document.getElementById("nowLoading").style.visibility="hidden"; //ローディングアニメ画像非表示 document.getElementById("fadeLayer").style.visibility="hidden"; //ローディング終了時のフェード画面(明るくする) document.getElementById("keyWord").value = "<?php echo $_REQUEST['keyword'] ?>"; }; </script> <!-- spec-11 ウェブフォント fontawesome CSS --> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"><script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> <link rel="stylesheet" type="text/css" href="/common/css/example.css"></head> <body id='example3' class='example'><div class="ads" style="margin:32px auto;text-align:center;"></div><h1 class='h'><a href='/'>PHP & JavaScript Room</a> :: 設置サンプル - webアイコンフォント</h1><!-- spec-5 YouTube検索フォーム --> <form name="sform" ACTION="#" method=post> <input type="search" value="" name="keyword" size=50 id="keyWord"> <input type="submit" value="YouTube検索"> </form><h3 class='h'>実行結果</h3> <h1>設置サンプル:[YouTube API(v3) - 動画検索(認証なし)</h1> <p> 'ハムスター'または'hamster'がタイトルに含まれる動画を、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p> <div id="message"></div> <div id="results"></div><!-- spec-6 ローディング中表示画面フェイドレイヤーDIV域 --> <div id="fadeLayer"></div> <!-- spec-7 ローディング中表示 webアイコンフォント配置DIV域 --> <div id="nowLoading"><i class="fa fa-spinner fa-spin fa-5x fa-fw" style="color: blue"></i></div> <?php // spec-8 ローディング中表示javascript 上2つDIV域の後に配置 if(isset($_REQUEST['keyword'])){ print "<script>\n"; print "document.getElementById('nowLoading').style.visibility='visible';\n"; //ローディングアニメ画像表示 print "document.getElementById('fadeLayer').style.visibility='visible';\n"; //ローディングアニメ表示中のフェード画面(うす暗くする) print "</script>"; } ?></body> </html>
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script><?php //spec-1 YouTube検索javascript if(isset($_REQUEST['keyword'])){ $keyWord = $_REQUEST['keyword']; // 検索キーワード print <<<YOU<script> /* 開発キー https://code.google.com/apis/console */ var APIKEY="AIzaSyDFNkPw-ics1W_-x0x3tYqNpsEcEIf9r-8"; // ←元11行目 YuTube API KEY 要変更 function onJSClientLoad() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', function(){ $.getYouTubeResults({ query:"$keyWord", // ←元18行目 "ハムスター hamster"を"$keyWord"に変更 order:"date", limit:50, maxResults:10 }); }); } (function($){ $.getYouTubeResults=function(options){ dbg("★getYouTubeResults"); var opt=$.extend({ query:"", type:"video", maxResults:10, limit:0, channelId:"", regionCode:"JP", /* 国コード */ order:"viewCount", /* 検索順 */ part:"id, snippet, status", fields:"" },options); var pageToken="",s=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; var requestOptions = { maxResults:opt.maxResults, //1ページ当たりの結果数最大値(0-50)デフォルト10 q:opt.query, /* 検索キーワード */ regionCode:opt.regionCode, type:opt.type,//video,channel,playlist order:opt.order, /* publishedAfter publishedBefore topicId videoCaption videoCategoryId videoDefinition videoDimension videoDuration videoEmbeddable videoLicense "relatedToVideoId:"0f1SLJEY6iY",//指定した動画の関連動画のみ検索対象とする videoSyndicated youtube.com外で再生できる動画のみ検索 channelId チャンネル固有ID(ユーザー名ではない)を指定すると、そのチャンネル内での検索となる */ "part":"id,snippet" }; if(opt.fields!="") requestOptions.fields=opt.fields; makeRequest(); /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:"", path:"/youtube/v3/search", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ $("#message").html(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ pageToken=resp.nextPageToken; /* dbg("output");dbg("pageToken:"+pageToken); */ if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ if(opt.limit>0 && totalResults> opt.limit){ totalResults=opt.limit; } total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<li>結果数最大値の指定:"+opt.maxResults+"</li>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>取得数上限:"+((opt.limit==0)?"∞":opt.limit)+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; $("#results").append("<h2>Results</h2>"+s); s=""; if(totalResults==0){ $("#message").html("検索条件に一致するデータがありませんでした"); } } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Search Results</h2>"+s); } } function itemOutput(items){ //dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(j>=opt.limit) return; j=(allcnt*resultsPerPage)+i+1; if(item.id && item.snippet){ s+="<dl>"; /* id */ var id=item.id.videoId; var kind=item.id.kind; var thumbnails_default="no thumbnails"; var snippet=item.snippet; var title=(snippet.title)?snippet.title:"no title"; var channelId=(snippet.channelId)?snippet.channelId:"no channelId"; var channelTitle=(snippet.channelTitle)?snippet.channelTitle:"no channelTitle"; var pubdatedAt=(snippet.publishedAt)?formatDate(snippet.publishedAt):"no publishedAt"; var description=(snippet.description)?snippet.description:"no description"; if(snippet.thumbnails){ $.each(snippet.thumbnails, function(y, ytem){ //default, medium, height if(y=="default"){ thumbnails_default=ytem.url; } }); } s+="<dt>"; s+="<a href='http://www.youtube.com/watch?v="+id+"'><img src='"+thumbnails_default+"'></a>"; s+="</dt><dd>【"+j+"】"; s+="<p>種類:"+kind+"</a></p>"; s+="<p>動画タイトル(ID):<a href='http://www.youtube.com/watch?v="+id+"'>"+title+"("+id+")</a></p>"; s+="<p>動画が属するチャンネルのタイトル(ID): <a href='http://www.youtube.com/channel/"+channelId+"'>"+channelTitle+"("+channelId+")</a></p>"; s+="<p>動画の公開日: "+pubdatedAt+"</p>"; s+="<p>動画の説明文:"+description+"</p>"; /* if(snippet.resourceId && snippet.resourceId.videoId){ s+="<p>resourceId.videoId:<a href='http://www.youtube.com/watch?v="+snippet.resourceId.videoId+"'>"+snippet.resourceId.videoId+"</a></p>"; } */ s+="</dd></dl>"; } }); } return this; } })(jQuery); var formatDate=function(str){ var tmp=str.split("T"); var ymd=tmp[0].split("-"); var hms=tmp[1].split(":"); var sec=hms[2].split(".")[0]; var d=new Date(new Date(ymd[0], ymd[1]-1, ymd[2], hms[0], hms[1], sec).getTime()+(1000*60*60*9)); //+9h var year=d.getFullYear(); var month=d.getMonth()+1; var day=d.getDate(); var hour=(d.getHours() < 10 ) ? '0'+d.getHours() : d.getHours(); var min =(d.getMinutes() < 10 ) ? '0'+d.getMinutes() : d.getMinutes(); var sec =(d.getSeconds() < 10 ) ? '0'+d.getSeconds() : d.getSeconds(); return year+"/"+month+"/"+day+" "+hour+":"+min;//+":"+sec; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script>YOU; } ?> <style> /* spec-2 ローディング画面フェードレイヤーCSS */ #fadeLayer { position:absolute; top:0px; left:0px; width:100%; height:100%; background-color:#000000; /* 黒 */ opacity:0.50; visibility:hidden; z-index:10; } /* spec-3 ローディングアニメ表示域CSS */ #nowLoading { position: absolute; left: 580px; top: 150px; width: 48px; height: 48px; visibility: hidden; text-align: center; border-radius: 50%; } </style> <!-- spec-9 CSSアニメ --> <style> .atom-spinner, .atom-spinner * { box-sizing: border-box; } .atom-spinner { height: 60px; width: 60px; overflow: hidden; } .atom-spinner .spinner-inner { position: relative; display: block; height: 100%; width: 100%; } .atom-spinner .spinner-circle { display: block; position: absolute; color: Coral; font-size: calc(60px * 0.24); top: 50%; left: 50%; transform: translate(-50%, -50%); } .atom-spinner .spinner-line { position: absolute; width: 100%; height: 100%; border-radius: 50%; animation-duration: 1s; border-left-width: calc(60px / 25); border-top-width: calc(60px / 25); border-left-color: Blue; border-left-style: solid; border-top-style: solid; border-top-color: transparent; } .atom-spinner .spinner-line:nth-child(1) { animation: atom-spinner-animation-1 1s linear infinite; transform: rotateZ(120deg) rotateX(66deg) rotateZ(0deg); } .atom-spinner .spinner-line:nth-child(2) { animation: atom-spinner-animation-2 1s linear infinite; transform: rotateZ(240deg) rotateX(66deg) rotateZ(0deg); } .atom-spinner .spinner-line:nth-child(3) { animation: atom-spinner-animation-3 1s linear infinite; transform: rotateZ(360deg) rotateX(66deg) rotateZ(0deg); } @keyframes atom-spinner-animation-1 { 100% { transform: rotateZ(120deg) rotateX(66deg) rotateZ(360deg); } } @keyframes atom-spinner-animation-2 { 100% { transform: rotateZ(240deg) rotateX(66deg) rotateZ(360deg); } } @keyframes atom-spinner-animation-3 { 100% { transform: rotateZ(360deg) rotateX(66deg) rotateZ(360deg); } } </style> <script> // spec-4 ローディング中非表示javascript window.onload = function() { document.getElementById("nowLoading").style.visibility="hidden"; //ローディングアニメ画像非表示 document.getElementById("fadeLayer").style.visibility="hidden"; //ローディング終了時のフェード画面(明るくする) document.getElementById("keyWord").value = "<?php echo $_REQUEST['keyword'] ?>"; }; </script><script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> <link rel="stylesheet" type="text/css" href="/common/css/example.css"></head> <body id='example3' class='example'><div class="ads" style="margin:32px auto;text-align:center;"></div><h1 class='h'><a href='/'>PHP & JavaScript Room</a> :: 設置サンプル CSSアニメ</h1><!-- spec-5 YouTube検索フォーム --> <form name="sform" ACTION="#" method=post> <input type="search" value="" name="keyword" size=50 id="keyWord"> <input type="submit" value="YouTube検索"> </form><h3 class='h'>実行結果</h3> <h1>設置サンプル:[YouTube API(v3) - 動画検索(認証なし)</h1> <p> 'ハムスター'または'hamster'がタイトルに含まれる動画を、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p> <div id="message"></div> <div id="results"></div><!-- spec-6 ローディング中表示画面フェイドレイヤーDIV域 --> <div id="fadeLayer"></div> <!-- spec-7 ローディング中表示アニメ画像配置DIV域 --> <DIV class="atom-spinner" id="nowLoading"> <div class="spinner-inner"> <div class="spinner-line"></div> <div class="spinner-line"></div> <div class="spinner-line"></div> <!--Chrome renders little circles malformed :(--> <div class="spinner-circle">●</div> </div> </DIV> <?php // spec-8 ローディング中表示javascript 上2つDIV域の後に配置 if(isset($_REQUEST['keyword'])){ print "<script>\n"; print "document.getElementById('nowLoading').style.visibility='visible';\n"; //ローディングアニメ画像表示 print "document.getElementById('fadeLayer').style.visibility='visible';\n"; //ローディングアニメ表示中のフェード画面(うす暗くする) print "</script>"; } ?></body> </html>
<html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/module/include/strm/youtubedataapi_v3_list/style.css"> <title>YouTubeAPIv3サンプル | 再生リストの動画検索(認証なし)</title> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script><?php //spec-1 YouTube検索javascript if(isset($_REQUEST['keyword'])){ $keyWord = $_REQUEST['keyword']; // 検索キーワード print <<<YOU<script> /* 開発キー https://code.google.com/apis/console */ var APIKEY="AIzaSyDFNkPw-ics1W_-x0x3tYqNpsEcEIf9r-8"; // ←元11行目 YuTube API KEY 要変更 function onJSClientLoad() { dbg("★onJSClientLoad"); gapi.client.setApiKey(APIKEY); gapi.client.load('youtube', 'v3', function(){ $.getYouTubeResults({ query:"$keyWord", // ←元18行目 "ハムスター hamster"を"$keyWord"に変更 order:"date", limit:50, maxResults:10 }); }); } (function($){ $.getYouTubeResults=function(options){ dbg("★getYouTubeResults"); var opt=$.extend({ query:"", type:"video", maxResults:10, limit:0, channelId:"", regionCode:"JP", /* 国コード */ order:"viewCount", /* 検索順 */ part:"id, snippet, status", fields:"" },options); var pageToken="",s=""; var allcnt=0,j=0,totalResults=0,resultsPerPage=0,total=0; var requestOptions = { maxResults:opt.maxResults, //1ページ当たりの結果数最大値(0-50)デフォルト10 q:opt.query, /* 検索キーワード */ regionCode:opt.regionCode, type:opt.type,//video,channel,playlist order:opt.order, /* publishedAfter publishedBefore topicId videoCaption videoCategoryId videoDefinition videoDimension videoDuration videoEmbeddable videoLicense "relatedToVideoId:"0f1SLJEY6iY",//指定した動画の関連動画のみ検索対象とする videoSyndicated youtube.com外で再生できる動画のみ検索 channelId チャンネル固有ID(ユーザー名ではない)を指定すると、そのチャンネル内での検索となる */ "part":"id,snippet" }; if(opt.fields!="") requestOptions.fields=opt.fields; makeRequest(); /* APIリクエスト */ function makeRequest(){ dbg("★makeRequest:"+pageToken); if(pageToken){ requestOptions.pageToken=pageToken; } var request=gapi.client.request({ mine:"", path:"/youtube/v3/search", params:requestOptions }); request.execute(function(resp) { dbg(resp); if(resp.error){ $("#message").html(resp.error.message); }else{ output(resp,pageToken); } }); } /* HTML出力 */ function output(resp,pageTokenFLG){ pageToken=resp.nextPageToken; /* dbg("output");dbg("pageToken:"+pageToken); */ if(pageTokenFLG==""){ var pageInfo=resp.pageInfo; resultsPerPage=resp.pageInfo.resultsPerPage; /* APIレスポンスに含まれる結果の数 */ totalResults=resp.pageInfo.totalResults; /* 結果セット内の結果の合計数 */ if(opt.limit>0 && totalResults> opt.limit){ totalResults=opt.limit; } total=Math.floor(totalResults/resultsPerPage); if(totalResults<=resultsPerPage){ total=1; }else if(totalResults%resultsPerPage!=0){ total++; } dbg("total:"+total+"/resultsPerPage:"+resultsPerPage+"/totalResults:"+totalResults); s+="<li>結果数最大値の指定:"+opt.maxResults+"</li>"; s+="<li>結果セット内の結果合計数:"+pageInfo.totalResults+"</li>"; s+="<li>1レスポンスに含まれる結果数:"+pageInfo.resultsPerPage+"</li>"; s+="<li>取得数上限:"+((opt.limit==0)?"∞":opt.limit)+"</li>"; s+="<li>リクエスト回数:"+total+"</li>"; $("#results").append("<h2>Results</h2>"+s); s=""; if(totalResults==0){ $("#message").html("検索条件に一致するデータがありませんでした"); } } itemOutput(resp.items); allcnt++; if(allcnt<total){ makeRequest(); }else{ $("#results").append("<h2>Search Results</h2>"+s); } } function itemOutput(items){ //dbg("allcnt:"+allcnt+"/j:"+j); $.each(items, function(i, item){ if(j>=opt.limit) return; j=(allcnt*resultsPerPage)+i+1; if(item.id && item.snippet){ s+="<dl>"; /* id */ var id=item.id.videoId; var kind=item.id.kind; var thumbnails_default="no thumbnails"; var snippet=item.snippet; var title=(snippet.title)?snippet.title:"no title"; var channelId=(snippet.channelId)?snippet.channelId:"no channelId"; var channelTitle=(snippet.channelTitle)?snippet.channelTitle:"no channelTitle"; var pubdatedAt=(snippet.publishedAt)?formatDate(snippet.publishedAt):"no publishedAt"; var description=(snippet.description)?snippet.description:"no description"; if(snippet.thumbnails){ $.each(snippet.thumbnails, function(y, ytem){ //default, medium, height if(y=="default"){ thumbnails_default=ytem.url; } }); } s+="<dt>"; s+="<a href='http://www.youtube.com/watch?v="+id+"'><img src='"+thumbnails_default+"'></a>"; s+="</dt><dd>【"+j+"】"; s+="<p>種類:"+kind+"</a></p>"; s+="<p>動画タイトル(ID):<a href='http://www.youtube.com/watch?v="+id+"'>"+title+"("+id+")</a></p>"; s+="<p>動画が属するチャンネルのタイトル(ID): <a href='http://www.youtube.com/channel/"+channelId+"'>"+channelTitle+"("+channelId+")</a></p>"; s+="<p>動画の公開日: "+pubdatedAt+"</p>"; s+="<p>動画の説明文:"+description+"</p>"; /* if(snippet.resourceId && snippet.resourceId.videoId){ s+="<p>resourceId.videoId:<a href='http://www.youtube.com/watch?v="+snippet.resourceId.videoId+"'>"+snippet.resourceId.videoId+"</a></p>"; } */ s+="</dd></dl>"; } }); } return this; } })(jQuery); var formatDate=function(str){ var tmp=str.split("T"); var ymd=tmp[0].split("-"); var hms=tmp[1].split(":"); var sec=hms[2].split(".")[0]; var d=new Date(new Date(ymd[0], ymd[1]-1, ymd[2], hms[0], hms[1], sec).getTime()+(1000*60*60*9)); //+9h var year=d.getFullYear(); var month=d.getMonth()+1; var day=d.getDate(); var hour=(d.getHours() < 10 ) ? '0'+d.getHours() : d.getHours(); var min =(d.getMinutes() < 10 ) ? '0'+d.getMinutes() : d.getMinutes(); var sec =(d.getSeconds() < 10 ) ? '0'+d.getSeconds() : d.getSeconds(); return year+"/"+month+"/"+day+" "+hour+":"+min;//+":"+sec; } var dbg=function(str){ try{ if(window.console && console.log){ console.log(str); } }catch(err){ //alert("error:"+err); } } </script>YOU; } ?> <style> /* spec-3 ローディングアニメ表示域CSS */ #nowLoading { position: absolute; left: 0px; top: 0px; visibility: hidden; } </style> <!-- spec-10 横線アニメーション --> <script> //*************** 横線アニメーション ***************// var drawHorizontalLineAnim = function() { // 変数定義(共通設定) var cs = document.getElementById('nowLoading'), ctx = cs.getContext('2d'), csWidth = cs.width, csHeight = cs.height, center = { x: csWidth / 2, y: csHeight / 2 }; // 線の基本スタイル(共通設定) ctx.strokeStyle = "red"; //'#666'; ctx.lineWidth = 10; // 横線アニメーション処理 var beginPos = 0, // スタート位置 movePos = beginPos, // 移動位置(現在位置) addVal = 30, // 加算量 10 endPos = csWidth - 10, // 終了位置 isAnim = function() { // アニメーションを終了する条件 return (movePos < endPos); }; var render = function() { ctx.beginPath(); ctx.moveTo(beginPos, center.y); ctx.lineTo(movePos, center.y); ctx.closePath(); ctx.stroke(); if (isAnim() === true) { movePos += addVal; // ↑のaddで終了点を超えることがあるため上限を決める movePos = (isAnim() === false) ? endPos : movePos; requestAnimationFrame(render) } }; render(); }; </script> <script> // spec-4 ローディング中非表示javascript window.onload = function() { document.getElementById("nowLoading").style.visibility="hidden"; //ローディングアニメ画像非表示 document.getElementById("keyWord").value = "<?php echo $_REQUEST['keyword'] ?>"; //"<?php echo $_REQUEST['keyword'] ?>"; }; </script><script src="https://apis.google.com/js/client.js?onload=onJSClientLoad"></script> <link rel="stylesheet" type="text/css" href="/common/css/example.css"></head> <body id='example3' class='example'><div class="ads" style="margin:32px auto;text-align:center;"></div><h1 class='h'><a href='/'>PHP & JavaScript Room</a> :: 設置サンプル - 線画アニメ</h1><!-- spec-5 YouTube検索フォーム --> <form name="sform" ACTION="#" method=post> <input type="search" value="" name="keyword" size=50 id="keyWord"> <input type="submit" value="YouTube検索"> </form><h3 class='h'>実行結果</h3> <h1>設置サンプル:[YouTube API(v3) - 動画検索(認証なし)</h1> <p> 'ハムスター'または'hamster'がタイトルに含まれる動画を、新着順に上限50まで取得するサンプル。 取得制限数は、スクリプト側でかけてます。</p> <div id="message"></div> <div id="results"></div><!-- spec-7 ローディングアニメ画像配置CANVAS域 --> <canvas id="nowLoading" width="1600" height="2"></canvas> <?php // spec-8 ローディング中表示javascript 上2つDIV域の後に配置 if(isset($_REQUEST['keyword'])){ print "<script>\n"; print "document.getElementById('nowLoading').style.visibility='visible';\n"; //ローディングアニメ画像表示 print "drawHorizontalLineAnim();"; //横線アニメ関数起動 print "</script>"; } ?></body> </html>
<!-- ローディングアニメ動作確認用 sleep関数 --> <script> //引数にはミリ秒を指定します。(例:5秒の場合は5000) function sleep(a){ var dt1 = new Date().getTime(); var dt2 = new Date().getTime(); while (dt2 < dt1 + a){ dt2 = new Date().getTime(); } return; } </script>
1. 準備 | 2. ローディングアニメ実装方法 | 2-1 ローディング中表示、非表示の方法| 2-2 ローディングアニメ実装方法 - 4パターン
 ソーシャルボタン関連サイト内リンク
|
最終更新日:2020.12.07 |
| |