0

我应该首先说我的 jQuery 技能几乎没有。我可以阅读大部分内容,但我求助于在 stackoverflow 中搜索我的大多数问题的答案。不幸的是,经过一天半的反复试验,我无法弄清楚这一点。

我正在修改一个 Wordpress 主题以获得一些响应能力。此主题使用两个脚本(columnize.js 和 columnizer.js)在三列中显示帖子。

我的目标之一是根据窗口的大小在 1、2 或 3 列之间进行主题交换。

我可以在 document.ready 上做到这一点,但由于某种原因,我无法在我的两个条件下触发 window.resize 的更改(我可以通过更改宽度大小来触发它,但它会不停地进行并且计时器不是我要找的)。

我对 columnize.js 进行了这些更改,它在 .

这是我最近尝试的样子:

    //jQuery.noConflict();
var smallWindow;
var windowsize = jQuery(window).width(); //need to use jQuery instead of $

jQuery(document).ready(function($){
    if (windowsize < 868) { //if page opens on a small window
        jQuery('.mcol').makeacolumnlists({cols: 2, colWidth: 305, equalHeight: 'ul', startN: 1}); //creates the columns
        jQuery('.mcol2').makeacolumnlists({cols: 3, colWidth: 293, equalHeight: 'ul', startN: 1});
        smallWindow = true; //for the next if condition on resize
        alert(smallWindow); //just to check if it works
    }
    else { //if page opens on a big window
        jQuery('.mcol').makeacolumnlists({cols: 3, colWidth: 305, equalHeight: 'ul', startN: 1});
        jQuery('.mcol2').makeacolumnlists({cols: 3, colWidth: 293, equalHeight: 'ul', startN: 1});
        smallWindow = false;
        alert(smallWindow);
    }
});

jQuery(window).resize(function() {
    if ((windowsize < 868) && (smallWindow == false)){
//nothing works here, these conditions were here to keep the function from
//triggering when not necessary, i.e. would only trigger below a certain
//width if window above that width
        jQuery('.mcol').uncolumnlists(); //removes old columns
        jQuery('.mcol').makeacolumnlists({cols: 2, colWidth: 305, equalHeight: 'ul', startN: 1}); //creates new columns
        smallWindow = true; //changes to stop the function from triggering on further resize down
        alert(smallWindow);
    }
    else if ((windowsize > 867) && (smallWindow == true)){
        jQuery('.mcol').uncolumnlists();
        jQuery('.mcol').makeacolumnlists({cols: 3, colWidth: 305, equalHeight: 'ul', startN: 1});
        smallWindow = false; //changes to stop the function from triggering on further resize up
        alert(smallWindow);
    }
    else !false;
});

我不知道我做错了什么。任何帮助将不胜感激。

编辑 1

谢谢您的帮助。对 adeneo 的代码进行了小修改,以防止函数不停地触发:

jQuery(document).ready(function ($) {
var smallWindow = false;
$(window).on('resize', function () {
    var windowsize = $(window).width();

    if (windowsize < 868 && smallWindow == false) { // did the ! meant false?
        $('.mcol').uncolumnlists();
        $('.mcol').makeacolumnlists({ cols: 2, colWidth: 305, equalHeight: 'ul', startN: 1 });
        smallWindow = true;
        //alert(smallWindow);
    } else if (windowsize >= 868 && smallWindow == true) { //now won't trigger unless smallWindow is true
        $('.mcol').uncolumnlists();
        $('.mcol').makeacolumnlists({ cols: 3, colWidth: 305, equalHeight: 'ul', startN: 1 });
        smallWindow = false;
        //alert(smallWindow);
    }
}).trigger('resize');
});

只剩下一件事,因为 smallWindow 是从一开始就定义的,如果页面加载在一个 >=868 的窗口中,则该函数不会触发。我不得不对此挠头,但我会在这里分享我的问题,因为你比我快。:)

编辑 2

好的,我明白了。当 smallWindow 变量应该为真时,我必须将其设置为假,反之亦然,因此我可以强制调整大小函数在加载时触发。尽管如此,我还是觉得很愚蠢,因为我尝试了多种方法,但我仍然无法声明全局变量......所以我用 windowssize var 重复自己......

jQuery(document).ready(function ($) {
var windowsize = $(window).width();
if (windowsize <868) {
    var smallWindow = false;
}
else {
    var smallWindow = true;
};

$(window).on('resize', function () {
    var windowsize = $(window).width();

    if (windowsize < 868 && !smallWindow) {
        $('.mcol').uncolumnlists();
        $('.mcol').makeacolumnlists({ cols: 2, colWidth: 305, equalHeight: 'ul', startN: 1 });
        smallWindow = true;
    } else if (windowsize >= 868 && smallWindow) {
        $('.mcol').uncolumnlists();
        $('.mcol').makeacolumnlists({ cols: 3, colWidth: 305, equalHeight: 'ul', startN: 1 });
        smallWindow = false;
    }
}).trigger('resize');
});

谢谢您的帮助!

4

2 回答 2

2

您应该将调整大小函数放在ready处理程序中,并且您还需要windowSize在调整大小时更新变量,否则它将始终相同。无需输入两次相同的内容,只需在页面加载时触发 resize 事件:

jQuery(document).ready(function ($) {
    var smallWindow = false;
    $(window).on('resize', function () {
        var windowsize = $(window).width();

        if (windowsize < 868 && !smallWindow) {
            $('.mcol').uncolumnlists();
            $('.mcol').makeacolumnlists({ cols: 2, colWidth: 305, equalHeight: 'ul', startN: 1 });
            smallWindow = true;
        } else if (windowsize > 868 && smallWindow) {
            $('.mcol').uncolumnlists();
            $('.mcol').makeacolumnlists({ cols: 3, colWidth: 305, equalHeight: 'ul', startN: 1 });
            smallWindow = false;
        }
    }).trigger('resize');
});
于 2013-03-05T17:01:20.303 回答
0

smallWindow 必须首先设置为某个值(true 或 false)

于 2013-03-05T17:03:17.327 回答