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 |
![]() |
![]() |
|![]() |