Невозможно отменить привязку события, привязанного к $ (документ) - PullRequest
2 голосов
/ 16 марта 2011

У меня есть обработчик событий, связанный с каждым элементом страницы через $ (document) .bind ().

Кто-нибудь знает, как отвязать этот обработчик для конкретного элемента?

Вот мой пример кода, который работает не так, как я хочу:

<html><head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js">    </script>
</head>
<body>
    <div id="mid" style="cursor:pointer" >click me</div>
    <div>sample</div>
    <script type="text/javascript">
        var fun = function() {
            alert('default handler');
        };
        $(document).bind('click.custom', fun);
        //trying to unbind the handler but it remains there
        $("#mid").unbind('click.custom');
    </script>
</body>
</html>

Принимая во внимание ответ Даниэля, снова возникает проблема:

var ff = function() {
    alert('additional');
}

$(document).bind('click.custom', fun);
$(document).bind('click.custom2', ff);
$("#mid").bind('click.custom', false); 

здесь забавный обработчик событий совершенно не привязан к элементу #mid, но обработчик событий ff тоже не связан, и это проблема для меня.

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Это называется пузырьковым событием.События вложенных элементов доходят до родителей.

Вы должны bind до #mid и вернуть false из этого обработчика.

0 голосов
/ 16 марта 2011

С документом связано только одно событие. Из-за пузырей событие будет отправлено вверх по иерархии DOM, пока его распространение не будет остановлено или не достигнет документа.

Вы можете либо изменить обратный вызов, чтобы игнорировать это событие, если оно пришло из #mid, либо использовать встроенный делегат / live для достижения того же эффекта.

$(document).delegate('[id!="mid"]', 'click.custom', fun);

Это будет игнорировать события, исходящие от элемента с идентификатором "mid". Другой альтернативой является изменение самой функции.

function fun() {
    if (this.id == "mid") { 
        return; // if event came from #mid, ignore it.
    }
    // continue processing as normal
}
...