2009-04-24 4 views
12

Я собираюсь орехи, просто пытаясь отвязать обработчик onclick от события в jQuery, чтобы впоследствии связать его с другой функцией.jquery unbind click

Я изолировал код в тестовой странице, так что нет ничего, кроме мяса, просто кнопки, которая вызывает функцию и сценарий, который пытается развязывать его:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
    <script src="../../Scripts/jquery-1.3.2.min.js" type="text/javascript"> 
    </script> 

    <script src="../../Scripts/jquery-1.3.2.js" type="text/javascript"> 
    </script> 

    <script type="text/javascript" language="javascript"> 
     $(document).ready(function() { $("#btnNext").unbind('click'); }); 
     function hi() {window.alert("hi");} 
    </script> 
</head> 

<body> 

    <input id="btnNext" type="button" value="Next" onclick="hi();" /> 
</body> 
</html> 

Кто знает, почему щелчок событие продолжает вызывать функцию hi() независимо от того, что я сказал в документе.

Благодаря

ответ

21

Потому что вы поместите его в атрибут HTML, он остается там. Он не был связан с jQuery, поэтому jQuery не отслеживает его использование.

$("a").bind('click',hi); 
$("a").unbind('click',hi); 

http://docs.jquery.com/Events/bind

+0

Вы имеете в виду что-либо, установленное в декларативном режиме, нельзя отменить? – antonioh

+3

Правильно, возможно, вы сможете отвязать его с помощью $ ("# btnNext"). Attr ('onclick', '') ... но лучше сделать все свое привязку к jQuery. Это намного чище и менее запутанно. Легко забыть о javascript, который вы добавили в свои атрибуты. ;) –

+0

Ницца, теперь я понимаю, почему это не сработало. Я сделаю привязку, как вы говорите. Благодаря! – antonioh

9

Просто для записи, вы можете использовать функцию removeAttr JQuery для удаления первоначально указанный onclick атрибута.

$('#btnNext').removeAttr("onclick"); 

Кроме того, в ответ на Чад, я согласен, что это, как правило, лучше, чтобы сделать все ваши связываясь с JQuery, но я нахожусь в ситуации (с использованием ASP.NET MVC), который требует отдельные звенья, чтобы иметь некоторые параметры модели в обработчиках событий кликов. Было бы более запутанным IMO попытаться подключить эти обработчики событий через jQuery.

+0

это не работает в IE (конечно). Кто-нибудь знает способ отменить события onclick в IE? –

0

я не мог получить removeAttr работать, но это делает:

$("#btnNext").click(function(){ return false; }); 

Я хотел, чтобы удалить ASP.NET, поставляемые onclicks (только для SelectedNodeChanged) в моем TreeView, так что я мог бы справиться с событие на клиенте. Конечно, моя функция щелчка включала больше, чем «return false».

0

Допустим, у вас есть

$(elem).on("click", function() { ... }); 

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

$(elem).unbind(); 

, и это удалит обработчики независимо от типа. Если вы хотите быть более конкретным, вы всегда можете передать тип события, например «щелчок».