2012-03-03 1 views
0

У меня есть код, который использует делегатский метод jquery.jquery undelegate не работает

.: например

$(document).delegate('.forImg','dblclick',function(event){. 
    . 
    . 
    . 
} 

У меня есть несколько элементов с одинаковым классом, но разные идентификаторы (уникальные). Мое приложение требует, чтобы я остановил событие для какого-либо элемента. Если я использую тот же синтаксис, что и делегат для undelegate, он удаляет событие для всех элементов с этим классом. например,

$(document).undelegate('.forImg','dblclick'); 

Но я действительно хочу удалить событие только для определенного элемента с определенным идентификатором. Я пробовал много комбинаций, в которых я передаю селектор в качестве этого идентификатора. Но никакого эффекта элементы все еще продолжают реагировать на событие.

Я прочитал, что для документа, в котором установлен селектор, создан один обработчик. Думаю, именно поэтому, даже если я попрошу удалить undelegate, обработчик продолжает выполнять.

Как я могу это сделать, не предоставляя делегата для каждого элемента? Именно поэтому даются классы. Но мне нужно контролировать каждый элемент событий.

Любая помощь/предложения приветствуются.

Благодаря

+0

Обязательно ли вы делегируете? Другими словами, ваш контент динамичен? Если ваша страница статична для нагрузки, вам не нужно делегировать документ в качестве слушателя. –

ответ

3

Alrighty, я думал о чем-то все-таки ...

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

Но если вы свяжете еще раз кликнуть слушателя поверх него, и остановить распространение, он больше не будет пузыриться:

$('#SOMEID').bind('dblclick', function(e) { 
    e.preventDefault(); 
    e.stopImmediatePropagation(); 
}); 

Fiddle: http://jsfiddle.net/p5e2e/7/

Примечание: Я использую ' bind, потому что OP, по-видимому, использует старый синтаксис по любой причине (не все используют jQuery 1.7+), но если используется последний jQuery, замените on вместо bind.

+0

как бы я снова получил исходное поведение ??? – kavita

+0

Должен ли я делегировать снова, когда я хочу, чтобы поведение было отменено? – kavita

+0

Я обновил скрипку, чтобы отменить привязку в случае нажатия другой кнопки, а затем восстановление будет восстановлено. Большое спасибо! – kavita

2

При делегировании обработчика в первый раз, вы можете использовать не(), чтобы исключить один ID и использовать отдельный вызов делегировать этот идентификатор, так что вы можете удалить независимо от обработчика класса

$(document).delegate('.forImg:not(#SOMEID)','dblclick',function(event)...... 

$(document).delegate('#SOMEID','dblclick',function(event)...... 
+0

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

+1

@kavita, но вы ДОЛЖНЫ уже знать ID! Вся ваша предпосылка заключается в том, что вы выбираете исключенный элемент на основе идентификатора. Динамический или нет, вы должны знать ID. –

+0

есть еще одна возможность ... тестирование 'event.target', но каким-то образом для того, чтобы один элемент нуждался в отдельном добавленном классе или способ идентифицировать его с каким-то атрибутом – charlietfl

0

Вы не можете использовать только пространство имен в .undelegate(), как .unbind(). Поэтому вы должны использовать имя тега вместе с именем класса, например div.forImg.

Демо: http://jsfiddle.net/p5e2e/

+0

Я думаю, что один из нас не понимает вопрос. Учитывая какой-то конкретный класс, kativa не хочет делить их всех, а всего лишь один, основанный на ID. Вот пример (нефункциональной) скрипки, чтобы служить в качестве примера: http://jsfiddle.net/p5e2e/2/ –

+0

тэг также не имеет значения ... для undelegate, селектор должен быть таким же, как оригинал – charlietfl

+0

greg is right. Я устанавливаю делегат для всех сразу, но вам нужно удалить один за раз. Так что для моей ситуации нет выхода !!! – kavita

0

Вы должны использовать .on() method. Начиная с jQuery 1.7, .delegate() был заменен на .on(). В общем, эти эквивалентные шаблоны для двух методов:

$(document).delegate('.forImg:not(#SOMEID)','dblclick',function(event)); // jQuery 1.4.3+ 
$(document).on('.forImg:not(#SOMEID)','dblclick',function(event));  // jQuery 1.7+` 

И вам нужно знать идентификатор. Если содержание является динамическим & вы используете PHP, то вы можете использовать:

<div class='something' id='<?php echo "dynamic".$i;?>' > 

в то время как $ я увеличивается в пределах цикла (MySQL в то время и т.д ...).

+0

Это не отвечает на вопрос. –

+0

@GregPettit, я отредактировал мой вопрос, чтобы предложить решение для искателя. Первоначально я разместил только «необходимую» информацию, потому что я только начал использовать SO, и я не знаю, как размещать ссылки в комментариях :) –

Смежные вопросы