Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在setTimeout内获取另一个作用域中的变量集?_Javascript_Jquery - Fatal编程技术网

Javascript 如何在setTimeout内获取另一个作用域中的变量集?

Javascript 如何在setTimeout内获取另一个作用域中的变量集?,javascript,jquery,Javascript,Jquery,我有一个定时器功能,我离开这个网站,并试图修改它一点,以满足我的需要。在大多数情况下,它可以按照我的意愿工作,但我无法将参数传递给JavaScript函数 我想使用select来更改id值,然后将该值传递到JQuery加载函数中。有人能告诉我怎么做吗 值得一提的是,当定时器刷新时,选择值需要“粘住”,不能重置 以下是我到目前为止的情况: function RecurringTimer(callback, delay) { var timerId, start, remaining = del

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

    }
  });
});
好吧,你可以:

if(newVal != ''){
    window.newVal = newVal;
}
并在需要时使用
window.newVal

$('#id').load('load.asp?id=' + window.newVal);
好吧,你可以:

if(newVal != ''){
    window.newVal = newVal;
}
并在需要时使用
window.newVal

$('#id').load('load.asp?id=' + window.newVal);
试试这个

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);
试试这个

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

我在一定程度上推测了你在做什么,所以我做了一些改变来适应,只是为了让它工作。如果你对我为什么要做什么有任何疑问,请告诉我

下面是我的模拟元素,试图匹配代码中的内容:

<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>
这些都是将保留在函数范围内的私有变量,以及属于此范围的回调。所以,如果我把它们放在这个“最私密”的范围内,我们可以共享它们。如果在此范围内的其他函数中使用
var
调用它们,则它们将只属于该范围。像
var select=$(这个)$中访问code>

因此,我想要
var newval位于最顶层的私有范围,因此我们可以轻松地共享它。当然,您必须小心,因为有时您不想将其全部推到该范围内(如
var-select

可能其余的都是不言自明的。您不需要
window.setTimeout
,只需要
setTimeout
。大多数
窗口
-作用域属性和方法不要求您预先添加
窗口
。但是,您可能需要这样做来消除本地和全局/
窗口
属性的歧义,例如,如果您有一个本地
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();
    }
});
jQuery(函数运行($){
变量$id=$('#id'),
$applist=$(“#applist”),
蒂梅丽德,
开始
剩余=0,
纽瓦尔,
选择;
$applist.on('change',function()){
var select=$(此值);
$id.prepend(“应用程序列表更改事件已激发”);
newval=select.val();
如果(newval!=''){
var timer=新的递归计时器(函数(){
$.get('/echo/html/?id='+newval,回调);
}, 5000);
}
函数回调(消息,状态){
var report='回调返回'+status+
'用于'+this.url+'。

'; $id.prepend(报告); } }); 函数递归计时器(回调、延迟){ 剩余=延迟; $id.prepend('RecurringTimer已初始化。

'); this.pause=函数(){ 清除超时(timerId); 剩余-=新日期()-开始; }; var resume=函数(){ 开始=新日期(); timerId=setTimeout(函数(){ 剩余=延迟; 恢复(); 回调(); },其余); }; this.resume=恢复; 这个是resume(); } });


也有一些CSS,但我认为它不相关,所以我省略了它。

我在一定程度上推测了你在做什么,所以我做了一些更改,以适应它的工作。如果你对我为什么要做什么有任何疑问,请告诉我

下面是我的模拟元素,试图匹配代码中的内容:

<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>
这些都是将保留在函数范围内的私有变量,以及属于此范围的回调。所以,如果我把它们放在这个“最私密”的范围内,我们可以共享它们。如果在此范围内的其他函数中使用
var
调用它们,则它们将只属于该范围。像
var select=$(这个)$中访问code>

因此,我想要
var newval位于最顶层的私有范围,因此我们可以轻松地共享它。当然,您必须小心,因为有时您不想将其全部推到该范围内(如
var-select

可能其余的都是不言自明的。您不需要
window.setTimeout
,只需要
setTimeout
。大多数
窗口
-作用域属性和方法不要求您预先添加
窗口
。但是,您可能需要这样做来消除本地和全局/
窗口
属性的歧义,例如,如果您有一个本地
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();
    }
});
jQuery(函数运行($){
变量$id=$('#id'),
$applist=$(“#applist”),
蒂梅丽德,
开始
剩余=0,
纽瓦尔,
选择;
$applist.on('change',function()){
var select=$(此值);
$id.prepend(“应用程序列表更改事件已激发”);
newval=select.val();
如果(newval!=''){
var timer=新的递归计时器(函数(){
$.get('/echo/html/?id='+newval,回调);
}, 5000);
}
函数回调(消息,状态){
var report='回调返回'+status+
'用于'+this.url+'。

'; $id.prepend(报告); } }); 功能