2013-12-19 3 views
3

Я выбрал плагин под названием HeapBox, чтобы создать несколько выпадающих меню select.jQuery HeapBox «this» внутри событий

Этот плагин не добавляет никакой информации о состоянии коробки (открытой или закрытой), но в ней есть события, такие как openStart и closeCompleted.

Моя реализация выглядит следующим образом:

$('select').heapbox({ 
    'openStart' : function() { $(this).addClass('open'); }, 
    'closeComplete' : function() { $(this).removeClass('open'); } 
}); 

Однако this не определено. Я пытаюсь понять, почему this не ссылается на экземпляр объекта для пользовательского элемента select. Похоже, что это стандартный шаблон, но похоже, что в событиях нет ссылки на связанный с ним кусок.

Кто-нибудь еще использовал этот плагин раньше, и есть ли способ выполнить то, что я пытаюсь сделать, не изменяя их исходный код?

+0

@ m90 Хорошая идея, но нет ничего, чтобы связываться с здесь ... – zeroflagL

ответ

3

Если вы посмотрите на src для плагина heapbox, он использует call() без каких-либо параметров для вызова этих функций. Например:

this.options.openStart.call();

Если вы хотите this сослаться выбора элемента, он должен был бы быть изменен следующим образом:

this.options.openStart.call(this.element);

Вы можете модифицировать плагин самостоятельно и сделать эти изменения или запросить их у создателя

+0

Спасибо это именно то, что я был после. Я пытался избежать изменения источника, но иногда это неизбежно. Похоже, я должен также дать рекомендацию автору. Благодарим вас за ввод. – Quantastical

+0

Также, если кто-либо использует этот плагин, я передаю 'this' в вызов вместо' this.element' (который относится к исходному элементу select, а не к элементу heapBox). Затем в событиях я могу использовать '$ ('#heapbox_' + this.instance.heapId)', аналогично тому, как это делает источник плагина. – Quantastical

0

Если вы не хотите прикасаться к коду поставщика, вы можете использовать fn.bind, чтобы создать связанную версию вашего обработчика фикция. Обратите внимание, что вам нужно будет использовать $.fn.each перебрать ваших select с потом:

function openHandler(){ 
    $(this).addClass('open'); 
} 
function closeHandler(){ 
    $(this).removeClass('open') 
} 

$('select').each(function(){ 
    $(this).heapbox({ 
     'openStart' : openHandler.bind(this), 
     'closeComplete' : closeHandler.bind(this) 
    }); 
}); 
Смежные вопросы