如何从setTimeout中的另一个范围中获取变量集?

时间:2012-09-30 04:59:41

标签: javascript jquery

我有一个计时器功能,我离开了这个网站,并试图修改它以适应我的需要。在大多数情况下,它按照我的意愿工作,但我无法将参数传递给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.

    }
  });
});

3 个答案:

答案 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);