绑定到窗口调整大小导致在flexslider上调用resize时出现循环
Binding to window resize causing a loop when calling resize on flexslider
在网站上工作时使用flexrooper插件。
我想检测浏览器的大小,然后重新启动滑块,以便它可以调整大小/其他参数。
为此,我发现:
var slider = $('.flexslider').data('flexslider');
slider.resize();
这是有效的,但我现在已经创建了一个函数来调用它,并将其与窗口大小调整上的绑定一起使用:
$(window).bind('resize', function() {
console.log('window resized');
resizeSlider();
});
// resize the slider
function resizeSlider()
{
var slider = $('.flexslider').data('flexslider');
slider.resize();
console.log('slider-resized');
}
问题是,当我调整浏览器大小时,我会得到源源不断的"浏览器调整大小"日志,然后是一堆600条:
Uncaught RangeError: Maximum call stack size exceeded
我该怎么解决这个问题?
听起来有一个我们一无所知的潜在问题。也许窗口大小调整事件是在其他地方触发的?
这是我在很多项目中使用的一个小功能,每次都能帮助我。
/**
* @description delay events with the same id, good for window resize events, keystroke, etc ...
* @param {Function} func : callback function to be run when done
* @param {Integer} wait : integer in milliseconds
* @param {String} id : unique event id
*/
var delayedEvent = (function () {
var timers = {};
return function (func, wait, id) {
wait = wait || 200;
id = id || 'anonymous';
if (timers[id]) {
clearTimeout(timers[id]);
}
timers[id] = setTimeout(func, wait);
};
})();
要应用于您的调整大小功能,只需将其包装起来:
function resizeSlider() {
delayedEvent(function() {
var slider = $('.flexslider').data('flexslider');
slider.resize();
console.log('slider-resized');
}, 200, 'flexslider-resize');
}
现在,每当调用resizeSlider()
时,您将每200ms执行一次该函数。这样可以防止范围错误。
要检查潜在的问题,请在$(window).bind('resize')
中使用它。现在我注意到,你尝试过$(window).on('resize')
吗?或者这里使用bind
的原因是什么?您使用的是较旧的jQuery版本吗?
还要注意,$('.flexslider').data('flexslider')
每次都会被调用。如果这个变量没有改变,它应该在函数范围之外,也许是一个参数。=>脑海中浮现出"委派"或"lambda"。
你能试一下吗,你的代码性能很差,因为即使你稍微移动一下窗口,它也会被永久调用。这可能导致您的错误。
在resize
方法中添加一个延迟,这样您的客户端就可以处理所有的大小调整。
我不确定这是否会立即解决你的问题,但无论如何使用它都是非常明智的,即使它不会解决你的麻烦!
相关文章:
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何从Java/scala调用js美化程序
- 如何调用这个匿名 JavaScript 函数
- 如何从模块链中调用函数.导出到节点中
- 我需要从php调用javascript或jquery
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 单击按钮后如何逐个调用分区,上一个分区将隐藏
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- node.js:setInterval()正在跳过调用
- 如何在单击复选框后调用控制器方法
- 如何在JQuery函数中定义一个值,然后调用另一个函数并使用该值
- 无法从 .resize() 中调用 jQuery 函数
- 绑定到窗口调整大小导致在flexslider上调用resize时出现循环
- Jquery(Window).Resize()调用函数不正确
- 在jQuery UI中调用resize事件
- 调用(window).resize中的函数
- 向事件添加javascript函数调用(如'window.resize'),而不是覆盖已经存在的内容
- 在调整大小的过程中,jQuery resize事件会被调用很多次