我有一个计时器功能,我离开了这个网站,并试图修改它以适应我的需要。在大多数情况下,它按照我的意愿工作,但我无法将参数传递给JavaScript函数。
我想使用select来更改id值,然后将该值传递给JQuery加载函数。有人可以告诉我该怎么做吗?
值得一提的是,当计时器刷新时,选择值需要“坚持”,它无法重置。
这是我到目前为止所做的:
function RecurringTimer(callback, delay) {
var timerId, start, remaining = delay;
this.pause = function() {
window.clearTimeout(timerId);
remaining -= new Date() - start;
};
var resume = function() {
start = new Date();
timerId = window.setTimeout(function() {
remaining = delay;
resume();
callback();
},remaining);
};
this.resume = resume;
this.resume();
}
var timer = new RecurringTimer(function() {
$('#id').load('load.asp?id=1'); // The "id" should be "newVal" from JQuery below.
}, 5000);
$(document).ready(function(){
$('#appList').live('change',function(){
var select = $(this);
var newVal = select.val();
if(newVal != ''){
// This is where the var newVal needs to be passed into the JavaScript.
}
});
});
答案 0 :(得分:1)
我已经在某种程度上推测了你所做的事情,所以我做了一些改变以适应只是试图让它发挥作用。因此,如果您对我做某事的原因有任何疑问,请告诉我。
这是我的模拟元素,试图匹配代码中的内容:
<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
切换了$.get
,因此我可以使用callback
; jsFiddle并没有真正让我选择使用$.load
并返回任何内容。所以我使用$.get
代替了日志语句。
好的,所以你会看到围绕所有jQuery();
函数以及RecurringTimer()
,callback
和{{1}的包裹timer
}。这样做是创建一个“闭包范围”(想想它包含包含它包含的代码),所以我不再在$.on
或全局范围内。我可以通过致电window
来访问window
,但window
将属于this
,这意味着jQuery.ready()
。
在顶部你会看到:
document
这些都是私有变量,它们将保留在属于此范围的函数和回调的范围内。如果我把它们放在这个“最私密”的范围内,我们就可以分享它们。如果在此范围内的其他函数内部使用jQuery(function run($){
var $id = $('#id'),
$applist = $('#appList'),
timerId,
start,
remaining = 0,
newval,
select;
调用它们,则它们将仅属于该范围。与var
类似,只能在var select = $(this);
处理程序中访问。
因此,我希望$.on
位于最顶级的私有范围内,因此我们可以轻松地分享它。当然,你必须要小心,因为有时候你不想把它全部推到那个范围(比如var newval;
)。
其余部分可能是不言自明的。您不需要var select
,只需window.setTimeout
。大多数setTimeout
- 范围属性和方法不要求您添加window
。但是,您可能需要这样做以消除本地和全局/ window
属性的歧义,例如,如果您在范围内有本地window
。在这种情况下,你需要var location = 'http://...';
来获得它。
如果您有任何问题,请与我们联系。
window.location
http://jsfiddle.net/userdude/zU5b3/
还有一些CSS,但我认为它不相关,所以我把它留了出来。
答案 1 :(得分:0)
嗯,你可以这样做:
if(newVal != ''){
window.newVal = newVal;
}
并在需要时使用window.newVal
:
$('#id').load('load.asp?id=' + window.newVal);
答案 2 :(得分:0)
试试这个
function RecurringTimer(callback, delay) {
var timerId, start, remaining = delay;
var newValue;
.....
.....
.....
然后在你的jquery
if(newVal != ''){
newValue = newVal;
}
然后你可以在你的计时器中引用它
var timer = new RecurringTimer(function() {
$('#id').load('load.asp?id='+newValue); // The "id" should be "newVal" from JQuery below.
}, 5000);