我在jquery插件中清除间隔时遇到问题。以下是简化代码。如果我在Firefox控制台内部尝试运行
$('.banner').pluginName().stop()
它将继续记录console.log(1)。我甚至尝试使用window.interval
代替$wrapper.interval
,但仍然没有成功。我猜问题是关于范围,但为什么,不是window.interval全局范围?用公共方法清除间隔的正确方法是什么?
<html lang="en">
<body>
<div class="banner"></div>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
;(function($, f) {
$.fn.pluginName= function(o) {
var $wrapper = this;
var init = function(o) {
$wrapper.start();
return $wrapper;
};
this.start = function() {
$wrapper.interval = setInterval(function() {
console.log(1)
}, 1000);
};
// Stop autoplay
this.stop = function() {
console.log(2)
clearInterval($wrapper.interval);
return $wrapper;
};
return init(o);
};
})(window.jQuery, false);
$('.banner').pluginName();
</script>
</body>
</html>
答案 0 :(得分:1)
您的代码有几处错误。
不污染包装,它们可能会导致问题。例如。 如果以后,动画函数想要使用.stop()来停止动画,他们会发现他们无法停止
;(function($,f){ $ .fn.pluginName = function(o){ var $ wrapper = this;
/* don't save data on wrapper object directly*/
function interval (data) {
if (data) {
$wrapper.data('interval', data);
} else {
return $wrapper.data('interval');
}
}
var init = function(o) {
if (!o || o === 'start') {
start();
} else {
stop();
}
return $wrapper;
};
/*don't pollute wrapper, use option to switch instead*/
function start() {
/* you must stop old interval first*/
stop();
console.log('started')
interval(setInterval(function() {
console.log(1)
}, 1000));
};
// Stop autoplay
function stop() {
console.log('stoped')
clearInterval(interval());
return $wrapper;
};
return init(o);
}; })(window.jQuery,false); var i = $(&#39; .banner&#39;)。pluginName(); $(&#39; .banner&#39)。pluginName(&#39;停止&#39);
答案 1 :(得分:0)
尝试在this.interval
之外初始化this.start
,以便整个插件都可以访问$ wrapper.interval
,而不只是this.start
:
$.fn.pluginName= function(o) {
var $wrapper = this;
var init = function(o) {
$wrapper.start();
return $wrapper;
};
this.interval;
this.start = function() {
$wrapper.interval = setInterval(function() {
console.log(1)
}, 1000);
};
// Stop autoplay
this.stop = function() {
console.log(2)
clearInterval($wrapper.interval);
return $wrapper;
};
return init(o);