我已经在一定程度上推测了你在做什么,所以我做了一些改变来适应只是试图让它发挥作用。因此,如果您对我为什么做某事有任何疑问,请告诉我。
这是我的模拟元素,试图匹配您在代码中的内容:
<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
; 如果您在现实中使用的元素类似于 aselect
或具有真实change
事件的东西,请坚持使用$.on
而不是$.live
. $.live
已弃用,并且在完全删除之前可能不会有太多版本。
我也换掉了$.load
,$.get
所以我可以使用callback
; jsFiddle 并没有真正让我选择使用$.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
在此范围内的其他函数内部调用它们,则它们将仅属于该范围。Likevar select = $(this);
只能在该$.on
处理程序中访问。
因此,我想要var newval;
在最私密的范围内,以便我们可以轻松地共享它。当然,您必须小心,因为有时您不想将其全部推到该范围(例如var select
)。
可能其余部分是不言自明的。你不需要window.setTimeout
,只要setTimeout
。大多数window
范围的属性和方法不需要您预先添加window
. 但是,您可能需要这样做以消除本地和全局/window
属性的歧义,例如,如果您有一个本地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,但我认为它不相关,所以我把它省略了。