代码之家  ›  专栏  ›  技术社区  ›  Harmen

除非之前使用了变量,否则push方法只能工作一次

  •  0
  • Harmen  · 技术社区  · 16 年前

    这可能是个奇怪的问题。无论如何,我正在开发一个jquery插件,对于这个问题,这是一段很有用的代码,请注意并不是全部;):

    Javascript:

    (function($){
        $.fn.newPlugin = function(){
            var ranges = [], selectableRange = this;
    
            function init(){
                selectableRange.live('mousedown', function(){
                    selectableRange.live('mouseup', function(){
                        addRange(Math.random(), Math.random());
                        selectableRange.die('mouseup');
                    });
                });
            }
    
            function addRange(a, b){
                // console.log(ranges);
                ranges.push({start: Math.min(a,b), end: Math.max(a,b)});
                console.log(ranges);
            }
    
            return { init: init };
        };
    })(jQuery);
    
    $(document).ready(function(){
        var instance = $('#element').newPlugin();
        instance.init();
    });
    

    HTML:

     <div id="element" style="width:200px;height:200px;background:grey;"> </div>
    

    它所做的似乎毫无用处;不管怎样,每当有人把鼠标放在一个元素上,一个新的对象就会添加到 ranges . 不幸的是,在我的控制台中,ranges数组只包含 对象,无论单击多少次 $('#element') .

    我试着弄清楚发生了什么事,然后取消了对白 console.log(ranges); 在对象被推到ranges数组的后面之前。然后,令人惊讶的是,它成功了。范围数组增长…

    有人能告诉我为什么 .push 只有当 范围 以前用过吗?

    2 回复  |  直到 16 年前
        1
  •  0
  •   Pointy    16 年前

    我很难理解你想在这里做什么。这个返回值意味着什么?

    我唯一能想到的是,你真正想要做的是在你的插件被定义的时候运行一个函数,这样这个函数本身就返回了实现插件的实际函数。实际上,在我看来,数组中只有一个元素的原因是每次调用插件时都会创建一个新数组。看起来您正在尝试创建一个闭包,但是没有函数调用,因此没有创建闭包。

    尝试更改插件定义:

    $.fn.newPlugin = (function() {
       // ...
       // all the code you currently have, though I still don't know
       // exactly what that return value is supposed to mean
       // ...
    })();
    
        2
  •  0
  •   Harmen    16 年前

    很抱歉我问了这个问题…

    不知怎么的,chrome的控制台缓存了它的日志,并在日志的左侧显示了一个不断增加的数字。一切正常…