jQuery插件没有在窗口调整大小时被调用

时间:2013-02-15 13:29:18

标签: jquery jquery-plugins window-resize

在网页上我有很多表格,所有表格都是class ='gsresponsive'。

我有一个jQuery插件,我可以使用类gsresponsive指向多个表,并将它们包装在2个div中,如下所示。如果屏幕宽度> 1,则第二div宽度将设置为100%。 767px否则宽度将设置为1024px(除非被覆盖)。当页面加载时,将应用适当的宽度,但我希望在窗口大小调整时再次调用插件。但这种情况并没有发生。

为什么我的插件不会在窗口上重新运行并且当屏幕出现在767px的任一侧时应用新的宽度?

<div style="overflow:auto;">
    <div style="width:100%"> <!-- screen size dependant-->
        <table> ....</table>
    </div>
<div>

我的插件就像这样调用......

$(document).ready(function() {
    $("table.gsresponsive").gstable();
});

我的插件看起来像这样......

(function($) {
$.fn.extend({
    gstable: function(options) {

        //Define default options.
        var defaults = {
            scrsplit : 767,         //Modify table when screen gets to this size.
            tblwidth : "1024px"     //Default table width when on a small screen (screen width < scrsplit).
        }

        var o = $.extend(defaults, options);
        var $obj = $(this);

        return this.each(function() {

            $obj.wrap("<div class=\"table-wrapper\" style=\"overflow:auto;\" />");
            if ($(window).width() < o.scrsplit){
                $obj.wrap("<div style=\"width:"+o.tblwidth+"\" />");
            } else {
                $obj.wrap("<div style=\"width:100%;\" />");
            }

            $(window).load(updateOvalTables);
            $(window).bind("resize", updateOvalTables);

        });

        var switched = false;
        var updateOvalTables = function() {
            alert('updating');
            if (($(window).width() < o.scrsplit) && !switched ){
                switched = true;
                splitOvalTable($obj);
                //return true;
            }   else if (switched && ($(window).width() > o.scrsplit)) {
                switched = false;
                unsplitOvalTable($obj);
            }
        };

        function splitOvalTable(elem) {
            elem.parent().css("width", o.tblwidth);   
        }

        function unsplitOvalTable(original) {
            elem.parent().css("width", "100%");   
        }

    }
});
})(jQuery);

2 个答案:

答案 0 :(得分:0)

函数表达式,即变量updateOvalTables$.each函数之后声明。它仍然被提升,但在.each循环中updateOvalTables未定义。您还在return语句之后声明了变量,这有点晚了。

所以这个:

$(document).on('click', foo);

var foo = function() { alert(); }

将无法正常工作,因为foo尚未定义,但是:

var foo = function() { alert(); }

$(document).on('click', foo);

有效,因为foo已定义!

因此将函数表达式移到$.each循环上方(或将其更改为函数声明):

(function($) {
$.fn.extend({
    gstable: function(options) {

        //Define default options.
        var defaults = {
            scrsplit : 767,         //Modify table when screen gets to this size.
            tblwidth : "1024px"     //Default table width when on a small screen (screen width < scrsplit).
        }

        var o                = $.extend(defaults, options),
            $obj             = $(this),
            switched         = false;
            updateOvalTables = function() {
                alert('updating');
                if (($(window).width() < o.scrsplit) && !switched ){
                    switched = true;
                    splitOvalTable($obj);
                    //return true;
                }   else if (switched && ($(window).width() > o.scrsplit)) {
                    switched = false;
                    unsplitOvalTable($obj);
                }    
            };

        return this.each(function() {

            $obj.wrap("<div class=\"table-wrapper\" style=\"overflow:auto;\" />");
            if ($(window).width() < o.scrsplit){
                $obj.wrap("<div style=\"width:"+o.tblwidth+"\" />");
            } else {
                $obj.wrap("<div style=\"width:100%;\" />");
            }

            $(window).load(updateOvalTables);
            $(window).bind("resize", updateOvalTables);
        });

        function splitOvalTable(elem) {
            elem.parent().css("width", o.tblwidth);   
        }

        function unsplitOvalTable(original) {
            elem.parent().css("width", "100%");   
        }

    }
});
})(jQuery);

答案 1 :(得分:0)

您是否尝试使用单独的调整大小功能?

 $(document).ready(function(){
    console.log("window inizialized");
    $("table.gsresponsive").gstable();
    $(window).resize(function(){
        console.log("resize event fired");
        $("table.gsresponsive").gstable().updateOvalTables();
    });
  });