2015-01-02 3 views
2

Я создаю плагин jquery, в котором вы можете установить событие, чтобы что-то произошло.JQuery.one() событие, которое немедленно срабатывает

$.fn.makeSomething = function(options) { 
    var defaults = { 
     activationEvent: "mouseover" 
    }; 
    options = $.extend(defaults, options); 

    this.each(function() { 
     var elem = $(this); 
     elem.one(options.activationEvent, function(){ 
      // some code to be called at the event (in which I use elem) 
      // but by default should be called immediately on load 
     }); 
    }); 

    return this; 
} 

Я хотел бы, чтобы по умолчанию было так, что это происходит без какого-либо взаимодействия. Это возможно?

Чуть подробнее:

У меня есть несколько дивы, в котором должны быть загружены некоторые дополнительный контент. По умолчанию я хочу, чтобы содержимое загружалось при загрузке страницы. Однако на некоторых страницах я не хочу, чтобы все содержимое загружалось на страницу, но я хочу, чтобы каждая часть загружалась только тогда, когда вы наводили указатель мыши на свой div.

Спасибо!

+0

Вы можете вызвать функцию, когда страница загружается. –

+2

'if (options.activationEvent) {$ (this) .one (options.activationEvent, function() {}} else {$ (this) .fireEvent()}'. Если вы хотите, чтобы это произошло, когда пользователь включил Просто выполните то, что @JayBlanchard сказал, и назовите его без параметров. – user1167442

+0

Вам нужно что-то, что запускается при загрузке страницы, а затем снова, когда событие происходит, но только один раз для элемента? –

ответ

3

Если отделить function определение от связывания:

$.fn.makeSomething = function(options) { 
    // ... 

    function doSomething() { 
     // ... 
    } 

    $(this).one(options.activationEvent, doSomething); 
}; 

Вы можете проверить activationEvent для значения по умолчанию, который не является событием, таким как null, обеспечивая ту же самую функцию .each():

$.fn.makeSomething = function(options) { 
    var defaults = { 
     activationEvent: null 
    }; 
    options = $.extend(defaults, options); 

    function doSomething() { 
     var $elem = $(this); 
     // ... 
    } 

    if (!options.activationEvent) 
     this.each(doSomething); 
    else 
     this.one(options.activationEvent, doSomething); 
}; 
// act immediately 
$('...').makeSomething(); 
// act on mouseover 
$('...').makeSomething({ activationEvent: 'mouseover' }); 

Оба .one() и .each() будет вызывать doSomething() с this ссылкой на DOM Element. (Примечание: аргументы, предоставленные doSomething(), будут, однако, отличаться.)

+0

Это работает: D Это то, что предложил user1167442. –