Javascript, объекты Protoype, JQuery и таймеры - PullRequest
3 голосов
/ 21 февраля 2012

Я думал, что исправил это в пятницу с помощью коррекции типа, но я этого не сделал: (

Я бился головой, пытаясь найти решение этой проблемы (если есть такая, которая должна бытьВозможно, я не ищу нужную вещь, но я просто не могу найти решение этой проблемы ...

Настройка:

$.myPlugin = function(element, options){
    this.myElement = $(element);
    this.myElement.data('rotator', '');
    this.myElement.data('settings', $.extend({}, $.myPlugin.defaultOptions, options));
    this.mainFunction(this.myElement);
};

$.myPlugin.defaultOptions = { // yadda yadda };


$.myPlugin.prototype = {
    mainFunction : function(myself){
        // establish initial parameters
        var TEST = Math.rand();

        // do a bunch of stuff
        $(myButton).live('click', function(){               
            alert(TEST) //<---FOR TESTING PURPOSES

            // do other things
            myself.data('rotator', setTimeout(function(){               
                // click button after x period
                myButton.click();   
            }, x ));    
        });
    },

    destroy : function(){
        myself = $(this);
        myself.myElement.removeData('settings');
        clearTimeout(myself.data('rotator'));
    }
};

$.fn.myPlugin = function(options) { 
    // parse options
    this.each(function(){
        var instance = $(this).data('myPlugin');

        // blah blah blah ... on create
        $(this).data('myPlugin', new $.myPlugin(this, args));

        // blah blah blah ... on destroy
        instance['destroy'].apply(this);
        $(this).data('ddGallery', null);
    };
    return this;
};

Желаемая функция:

В моей логике я хочу создать объект для элемента. Затем плагин сохраняет содержимое элемента в переменной и помещает новый контент вЭто есть автоматически синхронизируемое событие, которое вызывается при щелчке с помощью прослушивателя щелчков .live (); событие щелчка сбрасывает таймер, приводящий к циклу (в отличие от использования setInterval). При уничтожении я заменяю сохраненный оригиналhtml-содержимое и хотят убить объект. Пока что все это работает. Я хочу затем иметь возможность воссоздать объект на элементе (возможно, передавая другие настройки).

Здесь все идет не так:

Когда я воссоздаю объект на том же элементе после уничтожения, оригинальный таймер продолжает работать. Я не могу избавиться от вонючего таймера, и я собираюсь вырвать мои волосы!

Чтобы проверить, я устанавливаю случайное число при инициализации и предупреждаю это числопо щелчку.Первоначально я мог бы получить предупреждение, например, «0,1234».Затем я могу уничтожить объект (я просто использую слушатель на кнопку формы для создания и уничтожения).Элемент вернется в свое исходное состояние и счастливо посидит бесконечно.Однако, как только я снова запускаю плагин для элемента, сразу же без задержки появляется исходное предупреждение «0.12345» (и все анимации запускаются).Затем следует другое новое всплывающее окно, например, «0,5678».Теперь оба таймера продолжают стрелять по стихии, нанося ущерб.

Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Вы не отменяете исходное событие нажатия на кнопку в вашем методе уничтожения. Вам нужно добавить звонок как:

   myself.die('click');

в вашем методе уничтожения. Причина, по которой вы видите исходное случайное число, предупрежденное о будущем щелчке, заключается в том, что вы связали закрытие с событием щелчка в первый раз. Вы убиваете таймер, но не отвязываете обработчик щелчков.

При следующем нажатии кнопки вы привязываете новый обработчик кликов; теперь у вас есть ДВА обработчика кликов, каждый из которых является замыканием, которое запоминает случайное число, которое было сгенерировано во время его создания. Теперь один таймер запускает многократное нажатие на элемент, и каждый раз, когда он щелкает, он запускает оба обработчика щелчка.

0 голосов
/ 21 февраля 2012

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

 this.rotator = setTimeout(...

против

 $(this).data('rotator', setTimeout(...

, и очистка будет выглядеть следующим образом:

clearTimeout(this.rotator);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...