人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP から外部ファイルの JavaScript へパラメーターを渡し、リダイレクトさせるには?という質問です。
PHP バージョンは関係ないと思いますが 5.2.17 で smarty を使用しています。

以下のコードはネットに散らばっている参考コードを寄せ集めて作ってみました。
カウントダウンで表示を変えているのですが、本来はタイムアウトしたら http://ほげ.com?aid={$aid}&xid={$xid} にリダイレクトしたいのです。
どのように書けばいいのかいろいろ調べてみますが皆目見当がつきません。

また jquery.countdown.js という外部ファイルに PHP から引数を渡したいのですが可能ですか?
例えば、 m = getFinishTime(parseInt(21)); の (21) を PHP 側でコントロールしたいのです。
また、リダイレクトURLも jquery.countdown.js に書くとするならば、これもパラメーターの渡し方がわかりません><

JavaScript は全然といっていいほど経験がないのでチンプンカンプンな質問かもしれませんが、どなたかよろしくお願いしますm(_ _)m

●質問者: appfb
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

質問者から

jquery.countdown.js

$(function(){
m = getFinishTime(parseInt(21));
function getFinishTime(e){
var datetime = new Date();
return datetime.setTime(datetime.getTime() + ((e) * 1000)); // 秒
}
countDown();
});
function countDown(){
var startTime = new Date();
var endTime = new Date(m);
var diff= endTime - startTime;
var times= 24 * 60 * 60 * 1000;
var day= Math.floor(diff / times)
var hour= Math.floor(diff % times / (60 * 60 * 1000))
var min= Math.floor(diff % times / (60 * 1000)) % 60
var sec= Math.floor(diff % times / 1000) % 60 % 60
var ms= Math.floor(diff % times / 10) % 100
if(diff > 0){
$("#Timer").text(sec +'秒');
setTimeout('countDown()', 10);
document.getElementById("intime").style.display = "block";
document.getElementById("timeover").style.display = "none";
}else{
//終了した時のテキスト
$("#Timer").text('Time Over !!');
//location.href="http://hoge.com/";
document.getElementById("intime").style.display = "none";
document.getElementById("timeover").style.display = "block";
}
}

index.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<link href="{$root_surl}css/master.css" rel="stylesheet" type="text/css">
{literal}
<script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="/js/jquery.countdown.js" type="text/javascript"></script>
{/literal}
</head>

<body>
<div id="Timer"></div>
<div id="intime">
<p>ハロー(*^。^*)</p>
</div>
<div id="timeover" style="display:none;">
<p>タイムオーバーとなりました(・_・;)</p>
</div>
</body>
</html>

1 ● a-kuma3
●100ポイント ベストアンサー

こんな感じになると思います。

index.php (抜粋)

 ...
 <script>
 <?php
 echo 'var finish = ' . $finish . ';';
 echo 'var url = "' . $url . '";';
 /*
 var finish = 21;
 var url = "http://hoge.com/";

 というふうに出力されることを期待する。
 */
 ?>
 </script>
{literal}
 <script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
 <script src="/js/jquery.countdown.js" type="text/javascript"></script>
 <script>
 // ★php のコードで展開された javascript の変数を使って、関数を呼び出す
 $(function(){
 m = getFinishTime(parseInt(finish));
 countDown(url);
 });
 </script>
{/literal}
 ...

jquery.countdown.js (抜粋)

function getFinishTime(e){ // ★関数として定義
 var datetime = new Date();
 return datetime.setTime(datetime.getTime() + ((e) * 1000)); // 秒
}

function countDown(url){ // ★引数で受け取る
 ...
 if(diff > 0){
 ...
 }else{
 //終了した時のテキスト
 $("#Timer").text('Time Over !!');
 location.href=url; // ★引数を使う
 document.getElementById("intime").style.display = "none";
 document.getElementById("timeover").style.display = "block";
 }
}




追記です。

終了時刻を計算した m が、うまく渡せていないことに気が付きました。
名前空間の汚染も抑えた形で、ちょっと書き直してみました。
index.php (抜粋)

 ...
{literal}
 <script src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
 <script src="/js/jquery.countdown.js" type="text/javascript"></script>
{/literal}
 <script>
 // ★php のコードで展開された javascript の変数を使って、関数を呼び出す
 $(function(){
 <?php
 echo 'var finish = ' . $finish . ';';
 echo 'var url = "' . $url . '";';
 /*
 var finish = 21;
 var url = "http://hoge.com/";

 というふうに出力されることを期待する。
 */
 ?>
 var m = getFinishTime(parseInt(finish));
 countDown(url, m);
 });
 </script>
 ...

jquery.countdown.js (抜粋)

function getFinishTime(e){ // ★関数として定義
 var datetime = new Date();
 return datetime.setTime(datetime.getTime() + ((e) * 1000)); // 秒
}

function countDown(url, m){ // ★引数で受け取る(終了時刻も)
 ...
 if(diff > 0){
 $("#Timer").text(sec +'秒');
 setTimeout(function() {
 countDown(url, m); // ★引数として渡す
 }, 10);
 document.getElementById("intime").style.display = "block";
 document.getElementById("timeover").style.display = "none";
 }else{
 //終了した時のテキスト
 $("#Timer").text('Time Over !!');
 location.href=url; // ★引数を使う
 document.getElementById("intime").style.display = "none";
 document.getElementById("timeover").style.display = "block";
 }
}

appfbさんのコメント
ご回答ありがとうございます。 なるほどですね? jquery.countdown.js は関数だけにして、呼び出す部分をhtml側に持ってきてるのですね?。 今から早速やってみます!

a-kuma3さんのコメント
今どきの javascript 事情だと、いろいろなライブラリを組み合わせて使うので、名前空間を汚すことを嫌う風潮があります。 このコードで言うと、関数名の getFinishTime() や countDown()、変数の finish と url です。 書き方を工夫すれば、もっと減らすことはできますが、php で javascript のコードの一部を吐き出す、というところは変わらないです。 あ、終了時間の m が渡せてない...

a-kuma3さんのコメント
すみません。 終了時刻をうまく渡せていないと思うので、回答に修正したコードを追記しました。

appfbさんのコメント
できました! 教えていただいたことは先日中に希望通り動くことを確認していたのですが、smartyの変数受け取りにスマートな方法はないかと手間取っていました。 > 今どきの javascript 事情だと、いろいろなライブラリを組み合わせて使うので、名前空間を汚すことを嫌う風潮があります。 なるほど・・・。 勉強になります、ありがとうございました!

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ