2015-03-28 2 views
1

Я попытался удалить обработчик событий с .off(), но он не работает.jQuery Проблемы с удалением обработчика событий с .off()

Я хочу, чтобы удалить все обработчик событий из одного определенного входа:

<input type="file" id="file_upload" name="file_upload" size="50" /> 

Вот что я пробовал:

$('#form').on('keyup change', ':input', function() { 
    registerChange(); 
}); 
$('#form input[name=file_upload]').off(); 
$('#file_upload').off(); 

ответ

1

Вы можете использовать селектор not для кнопки загрузки файла

$('#form').on('keyup change', 'input:not([name=file_upload])', function() { 
 
    registerChange($(this).val()); 
 
}); 
 

 
function registerChange(value) { 
 
    // notice that typing into the upload textbox does not log anything to the console 
 
    console.log(value); 
 
} 
 

 
$('#form').on('click', 'input[name=file_upload]', function() { 
 
    alert('In Click Event Handler, Now Removing Myself'); 
 
    // here is how you can remove an event handler 
 
    $('#form').off('click', 'input[name=file_upload]'); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<form id="form"> 
 
    <input type="text" /> 
 
    <input type="text" /> 
 
    <!-- just changeing this to a textbox for demo --> 
 
    <input type="text" id="file_upload" name="file_upload" size="50" value="Choose file" /> 
 
</form>

Откройте окно консоли (CTRL + SHIFT + J в хроме) и введите во все текстовые поля. Обратите внимание, как только первые 2 текстовых поля пишут на консоль. Также обратите внимание, что последнее текстовое поле определяет обработчик щелчка, а затем удаляет его, поэтому предупреждение появляется только один раз.

+0

Большое спасибо! – Phantom

1

Вы связывание события для формирования элемента. Поэтому для того, чтобы удалить его вам снова нужно использовать тэг формы:

// bind delegated events to form element 
$('#form').on('keyup change', ':input', function() { 
    registerChange(); 
}); 

// remove events later 
$('#form').off(); 

Вы, вероятно, путают с event delegation: это использование on метода придает события к элементу формы, где они захватываются после барботирования от детей :input.

+0

Большое спасибо за ваш ответ. Проблема в том, что я хочу присоединить событие ко всем другим входам формы (около 200), и только один элемент не требует события. Я знаю, что я могу исключить его раньше, но, похоже, это не самый эффективный способ. – Phantom

+0

@Phantom Затем вы можете специально остановить распространение этих событий на этом элементе или отфильтровать его внутри обработчика '# form', используя событие event.target или unbind на уровне FORM и переустановить его, исключая конкретный элемент, используя в качестве параметра выбора' on() 'method': input: not (#file_upload) ' –

+0

@Wolff Большое спасибо. Предполагая, что форма имеет 200 входов. Это было бы самым эффективным способом: '$ ('#' + case_formname) .on ('keyup change', ': input: not (input [type = file])', function() \t { \t \t registerИзменить(); \t}); ' – Phantom

0

Попробуйте это:

$('#file_upload').off('keyup change', ':input', function() 
{ 
    registerChange(); 
}); 
Смежные вопросы