Ответ 1
Поскольку вы помещаете его в атрибут html, он остается там. Он не был связан с jQuery, поэтому jQuery не отслеживает его использование.
$("a").bind('click',hi);
$("a").unbind('click',hi);
Я собираюсь отключиться, просто пытаясь отвязать обработчик onclick из события в jQuery, чтобы впоследствии связать его с другой функцией.
Я изолировал код на тестовой странице, поэтому ничего, кроме мяса, просто кнопка, вызывающая функцию, и script, что пытается отменить его:
<%@ 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>
Кто-нибудь знает, почему событие click продолжает вызывать функцию hi() независимо от того, что я сказал в документе. Уже?
Спасибо
Поскольку вы помещаете его в атрибут html, он остается там. Он не был связан с jQuery, поэтому jQuery не отслеживает его использование.
$("a").bind('click',hi);
$("a").unbind('click',hi);
Только для записи вы можете использовать функцию removeAttr
jQuery для удаления изначально указанного атрибута onclick
.
$('#btnNext').removeAttr("onclick");
Кроме того, в ответ на Чад я согласен с тем, что, как правило, лучше выполнять всю вашу привязку с jQuery, но я в ситуации (используя ASP.NET MVC), которая требует, чтобы отдельные ссылки имели некоторые параметры модели в их щелкните обработчики событий. Было бы более запутанным IMO попытаться подключить эти обработчики событий через jQuery.
Я не мог заставить removeAttr работать, но это делает:
$("#btnNext").click(function(){ return false; });
Мне нужно было удалить поставляемые ASP.NET onclicks (только для SelectedNodeChanged) в моем TreeView, чтобы я мог обработать событие на клиенте. Конечно, моя функция щелчка включала больше, чем "return false".
Скажем, у вас есть
$(elem).on("click", function() { ... });
вам даже не нужно связывать его, если вы хотите отвязать его позже. Сделать это можно просто:
$(elem).unbind();
и это приведет к удалению обработчиков независимо от типа. Если вы хотите быть более конкретным, вы всегда можете передать тип события, например "click".