如何通过引用传递超时?或者更好的实施方式
How to pass timeout by reference? Or a better way to implement?
我以前使用过这段代码,但现在我不太确定我是否已经将HTML控件与jQueryUI Widget分离。
目前,计时器启动正确,但在一次勾选后,我失去了对_refreshTimeout的引用。也就是说,在第一次勾选后,取消勾选PlanViewRefresh复选框不会停止计时器的运行。
我有两个JavaScript文件,PlanView.js和PlanViewCanvas.js。
PlanView.js看起来像这样:
(function ($) {
var _minZoom = -2.0;
var _maxZoom = 2.0;
var _stepZoom = (_maxZoom - _minZoom) / 100;
var _refreshTimeout = null;
var _refreshInterval = 60000; //One minute
$(document).ready(function () {
//Initialize Refresh combo box.
$('#PlanViewRefreshCheckbox').click(function () {
if ($(this).is(':checked')) {
var planViewCanvas = $('#PlanViewCanvas');
//Binding forces the scope to stay as 'this' instead of the domWindow (which calls setTimeout).
_refreshTimeout = setTimeout(function(){planViewCanvas.PlanViewCanvas('refresh', _refreshInterval, _refreshTimeout)}.bind(planViewCanvas), _refreshInterval)
}
else {
clearTimeout(_refreshTimeout);
}
});
}
})(jQuery);
PlanViewCanvas.js包含一个jQueryUI小部件:
(function ($) {
$.widget("ui.PlanViewCanvas", {
//other properties and methods not-relevant to problem declared here.
refresh: function (refreshInterval, refreshTimeout) {
var self = this;
_stage.removeChildren();
self.initialize();
//Binding forces the scope to stay as 'this' instead of the domWindow (which calls setTimeout).
refreshTimeout = setTimeout(function () { self.refresh(refreshInterval, refreshTimeout) }.bind(self), refreshInterval);
},
}
})(jQuery);
看起来我做事情不对吗?
编辑:我认为答案可能是使用setInterval而不是setTimeout。
第一个问题是您忘记了下划线
refreshTimeout
应为_refreshTimeout
其次,您的变量需要是全局的,才能在两个文件中访问,所以在函数之外声明它:
var _minZoom = -2.0;
var _maxZoom = 2.0;
var _stepZoom = (_maxZoom - _minZoom) / 100;
var _refreshTimeout = null;
var _refreshInterval = 60000; //One minute
(function ($) {
....
})(jQuery)
不能通过引用传递值。我看到两个选项:
- 传递对象。如果从两个变量引用它,则可以在两个作用域中访问它的属性
- 将您的功能划分为两个函数,它属于两个函数:一个负责间隔循环并触发刷新函数,另一个负责刷新。
refreshTimeout
变量只属于第一个变量的范围。指向如果经常需要,您可以将interval函数添加到小部件中
答案非常"哦,derp"
//Initialize Refresh combo box.
$('#PlanViewRefreshCheckbox').click(function () {
if (this.checked) {
_refreshTimeout = setInterval(function(){$('#PlanViewCanvas').PlanViewCanvas('refresh')}, _refreshInterval)
}
else {
clearTimeout(_refreshTimeout);
}
});
相关文章:
- 您有更好的动态方式来缩短复杂的代码jquery吗
- 如何创建更好的方式来维护基于我的代码访问的最后一个页面
- Javascript数学不起作用,更好的方式来执行操作
- jquery悬停后恢复到原始图像是更好的方式
- 在创建 toLowerCase 函数时,一种方式比另一种方式更好
- 可能是更好的方式来编码这个棘手的切换按钮
- 哪种方式在Javascript,字符串连接或数组中更好
- 我正在设置计时器,但我以错误的方式进行.所以请给我更好的方法来做到这一点
- 用Javascript更好的方式编写这个动画
- 如何通过引用传递超时?或者更好的实施方式
- 对自定义事件作出反应的更好方式
- Backbone js路由器-组织视图的更好方式
- 如果一个函数的大部分执行是以输入为条件的,那么下面哪一种是更好的实现方式
- 实时更新的Facebook页面点赞数-->任何更好的方式
- 更好的处理方式'这'在Javascript的闭包中
- 更好的方式导入JavaScript和CSS文件使用CDN或从本地机器
- 组合优于继承,这是向视图添加额外功能而不诉诸继承的更好方式
- 在我的例子中,这是显示动态单选按钮的更好方式
- 写回退选择器的更好方式
- 子对象访问父对象的更好方式