gpt4 book ai didi

jquery - 使用 window.resize (或其他方法)触发 jquery 函数并使 gridster.js 响应的有效方法

转载 作者:行者123 更新时间:2023-12-03 22:55:54 30 4
gpt4 key购买 nike

我一直在修改一些关于使 gridster.js 响应的迂回方式的想法。我在 gridster 的 github issues 中找到了一个代码片段,并意识到如果我在特定的窗口大小下运行它并销毁并重新运行 gridster,我可以获得 gridster 响应 responsivley 的效果。让我告诉你我的意思 -

$(window).resize(function(){
var width = $(window).width();
var columns = "";

if(Modernizr.mq('screen and (max-width:640px)')){
columns = 1;
gridster.destroy();
var tooFar = $('.gridster .gs-w').filter(function () {
return $(this).data('col') > columns;
});
$(tooFar).each(function () {
$(this).attr('data-col', '1');
});

var tooBig = $('.gridster li').filter(function () {
return $(this).data('sizex') > columns;
});
$(tooBig).each(function () {
$(this).attr('data-sizex', columns);

});
$(".gridster ul").gridster({
widget_base_dimensions: [300, 300],
widget_margins: [5, 5],
max_cols: 1,
resize: {
enabled: true
},
draggable: {
handle: '.dragDiv'
},
serialize_params: function ($w, wgd) {
return {
/* add element ID to data*/
id: $w.attr('id'),
/* defaults */
col: wgd.col,
row: wgd.row,
size_x: wgd.size_x,
size_y: wgd.size_y,
/* htmlContent: $($w).html() */
}
}
}).data('gridster');
}

});

因此,当 gridster 应该分成 1 列(它的基数为 4)时,它会销毁并以 1 列重新运行。这效果出奇的好,问题是这不是实现这一目标的好方法。我也没有显示所有断点(它根据窗口大小分为 3 -2 -1 列)。它运行得很差,因为它在每个窗口大小调整时都会触发,我想知道是否有一种更干净的方法来做到这一点,其中函数只会在达到窗口大小时触发一次。

另外 - 这只是为了调整 gridster 的大小向下,所以如果你调整大小它不会扩展,我还没有尝试构建这些功能。

使用可能不会监听窗口大小调整的每个实例的任何指示或建议都会非常有帮助。

谢谢!!

最佳答案

我从你的问题中得知,当用户调整窗口大小时,gridster 会不断重新运行;也就是说,如果您通过缓慢地逐像素拖动窗口来调整窗口大小,则每个像素更改都会重新运行 gridster。

尝试使用 setTimeout 限制 resize 事件。当 resize 触发时,您可以设置一个计时器来重新运行 gridster - 假设计时器持续时间为 200 毫秒。如果在 200 毫秒内,另一个 resize 触发,您将重置计时器。使用这种方法,仅当用户完成调整大小时(至少目前如此)才会重新运行。您可以调整计时器持续时间以获得更好的体验。

尝试:

var resizeTimeout;
$(window).resize(function(){
if(!!resizeTimeout){ clearTimeout(resizeTimeout); }
resizeTimeout = setTimeout(function(){
//do gridster re-run here
},200);
});

example fiddle (慢慢调整窗口大小时查看控制台)

<小时/>

编辑:对于任何对此模式感兴趣的人,我从上面的代码中提取了节流逻辑并将其放入 jQuery 插件中:

(function($){
$.fn.onDelayed = function(eventName,delayInMs,callback){
var _timeout;
this.on(eventName,function(e){
if(!!_timeout){
clearTimeout(_timeout);
console.log('timer being re-set: ' + eventName);
} else {
console.log('timer being set for the first time: ' + eventName);
}
_timeout = setTimeout(function(){
callback(e);
},delayInMs);
});
};
})(jQuery);

其用法如下

$(function(){
$(document).onDelayed('click',500,function(){
alert('clicking is done');
});
$(window).onDelayed('resize',1000,function(){
alert('resize is finished');
});
});

Fiddle with two example uses of onDelayed

关于jquery - 使用 window.resize (或其他方法)触发 jquery 函数并使 gridster.js 响应的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24460808/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com