2016-03-22 3 views
-1

Добрый вечер, все, здесь я снова с очень конкретным вопросом, на который я не мог найти ответа. Рассмотрите следующую ситуацию: У меня есть объект jQuery, $wrapper = $(this);. Это происходит при вызове init, например, $('#unique-wrapper-id').initWrapper()'. Как вы уже представляете, initWrapper() является функцией в jQuery.fn.jQuery добавить метод к объекту, затем вызвать событие на нем

Теперь, по-прежнему в initWrapper() вызова добавить функцию $wrapper как этот

$wrapper.getValue = function() { /* typical wrapper function */}

, а затем, в функции обратного вызова, который выполняется при нажатии на элемент внутри обертки я называю $wrapper.trigger('change'). С другой стороны, я слушаю обычное событие изменения jQuery и здесь, где он больше не работает.

$('#unique-wrapper-id').change(function() { 
    var $wrapper = $(this); 
    $wrapper.getValue(); // $wrapper.getValue() is not a function 
}); 

Итак, где-то в процессе проведения изменений JQuery getValue() теряется. Нет проблем, я не буду просто прикрепить его к самому DOMElement в вызове инициализации с

$wrapper[0].getValue = function { /* typical wrapper function */ }

Это работает, как ожидалось, и я могу выполнить метод getValue() на DOMElement позади объекта JQuery на конце прослушивания.

Однако, есть две вещи, которые меня ошибка:

  • Почему getValue() на объект JQuery теряться в процессе проведения изменений?
  • Почему конструктор jQuery (var $wrapper = $(this);) не копирует функцию DOMElement getValue() в объект jQuery?

Спасибо заранее, если запрошенный я попытаюсь сделать jsfiddle (или что-то проще, применимый JQuery, я просто не могу jsfiddle работать, как ожидалось -.-)

+0

Каждый раз, когда вы звоните '$ (элемент)' это Ĉ создает новый ** объект jQuery, который обертывает элемент DOM. Таким образом, свойства, добавленные в исходный объект jQuery, теряются. – Barmar

+0

@Barmar Хорошая точка. Если '$ wrapper':' $ ('# unique-wrapper-id') 'определяется перед' .change() 'событием, должен иметь возможность использовать' $ wrapper' внутри обработчика, не вызывая 'jQuery()' снова. Также может быть настроено на делегирование событий '$ (document) .on (" change ", '# unique-wrapper-id')' или '$ wrapper.change (handler)' then '$ (this) .data(). getValue() 'внутри' handler' – guest271314

+0

Да, вы можете это сделать. Но он не масштабируется для нескольких элементов. – Barmar

ответ

1

$wrapper Если это тот же элемент, который вы должны быть в состоянии хранить getValue в .data()

var getValue = function() { /* typical wrapper function */}; 
$wrapper.data("getValue", getValue); 

$("#unique-wrapper-id").change(function() { 
    var $wrapper = $(this); 
    $wrapper.data().getValue(); 
}); 
+0

спасибо, я попробую это завтра, однако это так же интуитивно для меня, как обходной путь с добавлением функции в DomElement.но хороший пойнт, полностью забыл о данных. –