ここであなたが何をしているのかをある程度推測したので、それを機能させようとして対応するためにいくつかの変更を加えました. ですから、私が何かをした理由について質問がある場合は、お知らせください。
これが私のモック要素で、コードにあるものと一致させようとしています:
<div id="selector">
<select id="appList">
<option value="1">Application List - App 1</option>
<option value="2">Application List - App 2</option>
<option value="3">Application List - App 3</option>
<option value="4">Application List - App 4</option>
</select>
</div>
<div id="id"></div>
#id
要素の適切な識別子ではないことに注意してください。何度か改名しそうになりまし#loader
た。id
この要素のこの属性をより説明的にすることを検討してください。
を に変更し$.live
ました$.on
。あなたが実際に取り組んでいる要素がselect
本物の出来事を伴う や何かのようなものである場合は、の代わりにchange
固執してください。は非推奨であり、完全に削除される前にこれ以上のバージョンはおそらくないでしょう。$.on
$.live
$.live
また、 ;を使用できるように切り替えまし$.load
た。jsFiddle は、何かを操作して返すオプションを実際には与えてくれません。そのため、代わりにログステートメントを使用して置き換えました。$.get
callback
$.load
$.get
わかりましたので、jQuery();
すべてのRecurringTimer()
関数とcallback
、timer
、および$.on
. これが行うことは、「クロージャースコープ」を作成することです(含まれているコードを囲んでいるように考えてください)ので、私はもはやwindow
グローバルスコープではありません。window
を呼び出してアクセスできますwindow
が、this
に属します。jQuery.ready()
これは を意味しdocument
ます。
上部に次のように表示されます。
jQuery(function run($){
var $id = $('#id'),
$applist = $('#appList'),
timerId,
start,
remaining = 0,
newval,
select;
これらはすべて、このスコープに属する関数とコールバックのスコープ内に留まるプライベート変数です。したがって、この「最上位のプライベート」スコープにある場合は、それらを共有できます。このスコープ内の他の関数内で呼び出された場合、それらはvar
そのスコープにのみ属します。Likeは、そのハンドラvar select = $(this);
内でのみアクセスできます。$.on
したがって、var newval;
簡単に共有できるように、その最上位に最もプライベートなスコープが必要です。もちろん、そのスコープまですべてを押し込みたくない場合があるため、注意する必要があります( のようにvar select
)。
おそらく、残りの部分は自明です。は必要ありませwindow.setTimeout
んsetTimeout
。ほとんどのwindow
スコープのプロパティとメソッドでは、先頭に を追加する必要はありませんwindow
。ただし、スコープ内window
に local がある場合など、 local と global/ プロパティのあいまいさを解消するために、そうする必要がある場合があります。その場合はそれを取得var location = 'http://...';
する必要があります。window.location
ご不明な点がございましたら、お知らせください。
jQuery(function run($){
var $id = $('#id'),
$applist = $('#appList'),
timerId,
start,
remaining = 0,
newval,
select;
$applist.on('change', function(){
var select = $(this);
$id.prepend('<p>App List change event fired</p>');
newval = select.val();
if (newval != '') {
var timer = new RecurringTimer(function() {
$.get('/echo/html/?id=' + newval, callback);
}, 5000);
}
function callback(msg, status){
var report = '<p>Callback returned ' + status +
' for ' + this.url + '.</p>';
$id.prepend(report);
}
});
function RecurringTimer(callback, delay) {
remaining = delay;
$id.prepend('<p>RecurringTimer initialized.</p>');
this.pause = function() {
clearTimeout(timerId);
remaining -= new Date() - start;
};
var resume = function() {
start = new Date();
timerId = setTimeout(function() {
remaining = delay;
resume();
callback();
}, remaining);
};
this.resume = resume;
this.resume();
}
});
http://jsfiddle.net/userdude/zU5b3/
CSSもありますが関係ないと思うので割愛します。