Метод Push работает только один раз, если переменная не использовалась ранее - PullRequest
0 голосов
/ 28 февраля 2010

Это может быть странный вопрос. В любом случае, я работаю над плагином 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. К сожалению, в моей консоли массив диапазонов содержит только один объект, независимо от того, сколько раз нажали на $('#element').

Я попытался выяснить, что происходит, и раскомментировал строку console.log(ranges);, прежде чем объект был помещен в конец массива диапазонов. Тогда, как ни странно, это сработало. Массив диапазонов вырос ...

Может кто-нибудь сказать мне, почему это .push работает только тогда, когда ranges используется раньше?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2010

Извините, что задал этот вопрос ...

Каким-то образом консоль Chrome кэшировала свои журналы и показала все большее число в левой части журнала. Все работало нормально ...

0 голосов
/ 28 февраля 2010

Мне трудно понять, что вы пытаетесь сделать здесь. Что должно означать это возвращаемое значение?

Единственное, о чем я могу думать, это то, что вы действительно пытаетесь сделать, это запустить функцию во время определения вашего плагина, так что эта функция сама возвращает фактическую функцию, которая будет реализовывать плагин. На самом деле, мне кажется, что причина того, что в вашем массиве есть только один элемент, заключается в том, что новый массив создается каждый раз, когда вы вызываете плагин. Похоже, вы пытаетесь создать замыкание, но нет вызова функции, поэтому замыкание не сделано.

Попробуйте изменить определение вашего плагина:

$.fn.newPlugin = (function() {
   // ...
   // all the code you currently have, though I still don't know
   // exactly what that return value is supposed to mean
   // ...
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...