- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 JavaScript 类:
<html>
<head>
<script src="MicrosoftAjax.js" type="text/javascript"></script>
<script src="jquery-1.6.4.min.js" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript">
var ClientControl = function () {
//some instance-specific code here
};
ClientControl.prototype = {
initialize: function () {
this.documentClickedDelegate = $.proxy(this.documentClicked, this);
//this.documentClickedDelegate = Function.createDelegate(this, this.documentClicked); // from MicrosoftAjax
},
bind: function() {
$(document).bind("click", this.documentClickedDelegate);
},
unbind: function() {
$(document).unbind("click", this.documentClickedDelegate);
},
documentClicked: function() {
alert("document clicked!");
}
};
var Control1 = new ClientControl();
Control1.initialize();
var Control2 = new ClientControl();
Control2.initialize();
Control1.bind();
Control2.bind();
Control1.unbind();
//Control2`s documentClickedDelegate handler, if created with $.proxy, already is unbound!
</script>
</body>
</html>
所以问题是,当调用第一个 Control1 对象的 unbind() 方法时,它会解除绑定(bind)两个对象的 documentClickedDelegate 处理程序,如果它们是使用 $.proxy() 方法创建的。所以 jquery 事件系统认为这些处理程序是相同的,尽管传递给 $.proxy() 方法的上下文不同。
如果 documentClickedDelegate 处理程序是使用 Function.createDelegate - MicrosoftAjax 库的方法创建的,则一切正常。处理程序不同。
事实证明,$.proxy 为传递的不同上下文创建了相同的代理函数。来自官方网站:
"Be aware, however, that jQuery's event binding subsystem assigns a unique id to each event handling function in order to track it when it is used to specify the function to be unbound. The function represented by jQuery.proxy() is seen as a single function by the event subsystem, even when it is used to bind different contexts. To avoid unbinding the wrong handler, use a unique event namespace for binding and unbinding (e.g., "click.myproxy1") rather than specifying the proxied function during unbinding. "
在我的例子中不应该这样做,因为 namespace 将特定于类型的事件分开,而不是特定于实例的事件。
这是屏幕截图,您可以在其中看到 $.proxy 创建具有相同 GUID = 1 的处理程序,而 Function.createDelegate 创建具有不同 GIUD 的处理程序:guid = 1 和 guid = 2。
所以当在第一种情况下删除一个时,它会删除两个,这是不应该做的!
我的问题是:jquery 中是否有与 Function.createDelegate 类似的东西?我不想将整个另一个 MicrosoftAjax 库仅用于一个功能。或者这个问题的任何通用解决方案 - 如何告诉 jquery 处理程序是不同的。感谢您的回答。
最佳答案
您确实需要为事件命名空间。简单的例子:
var counter = 0;
ClientControl.prototype = {
initialize: function () {
this.documentClickedDelegate = $.proxy(this.documentClicked, this);
this.num = counter++;
},
bind: function() {
$(document).bind("click.proxy" + this.num, this.documentClickedDelegate);
},
unbind: function() {
$(document).unbind("click.proxy" + this.num, this.documentClickedDelegate);
},
documentClicked: function() {
alert("document clicked!");
}
}
这是一个 working version .单击文档上的任意位置,您会收到一个警报。如果没有命名空间,你会得到 2。
关于javascript - jQuery.unbind 删除使用 $.proxy 创建的错误处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9157101/
我正在创建一个网络应用程序,并且无论如何都会进行自己的测试来确认,但想知道是否有人在绑定(bind)/取消绑定(bind)等时有过这方面的经验。例如,我想首先销毁当前内容容器的事件和 child 的事
使用后如何取消“解除绑定(bind)”?我需要重新启用点击事件。下面是我的函数。 1.该功能是禁用打印链接 function edit(){ $("#ENQUIRY_VIEWMETER a.print
这是表单声明: 这是我的 JavaScript: $("#form1").attr("action", "/mis_apps/scholarships-syste'+'m/in
我正在构建我的第一个联系表单。 在没有错误消息的情况下,我正在尝试解除绑定(bind)我的函数。 代码如下 - 无论出于何种原因,我不断在我的开发控制台中收到以下错误消息: Uncaught Type
我有一个按钮可以触发输入文件并打开文件浏览器来选择文件。选择文件后,我将运行某些操作。 问题: 它在 Chrome 上运行良好,但 Microsoft Edge 的行为不一致。根据我的经验,前几次尝试
1) 在进程结束之前,套接字似乎没有从 LocalEndPoint 解除绑定(bind)。 2) 我已经尝试了另一个问题的解决方案,也试过等待一分钟 - 无济于事。 3) 目前我已经尝试了以下方法来摆
我有一个使用 Butterknife 的应用程序,最近我发现了一个 fragment ,在该 fragment 的 onDestroyView() 中调用 unbinder.unbind() 失败。我
我在用 $(document).on('click', '.mySelector', function () { //do something }); 将事件委托(delegate)给按钮。接
我正在运行以下命令: $("#myelement").unbind('click'); 当我在 VS.NET 2010 监 window 口中查看 $("#myelement")[0].onclick
这样做有风险吗?示例: if (someCondition) { angular.element($window).bind('scroll', myHandler); } $scope.$on
我有这个代码: def on_click(event=None): c.unbind('') c.config(background="red") print ("You cl
好的,这个问题已经解决了多次,但我的问题有点复杂。以下是我的 AJAX,它将文本字段和图像作为输入并将字段和文件路径提交到数据库。 $(function () { $('form#data')
如果条件为真,我想在所有链接上使用 unbind(),然后在 1.5 秒后再次绑定(bind)链接。我已经尝试过,但它不起作用: if ( /*some condition*/) {
我想要 unbind('click' 的快捷符号。我想要 .unclick 被 unbind('click'. 最佳答案 我想你想要这样的东西: $.fn['unclick'] = function(
我有一个响应式 Javascript 文件,它可以成功地解除绑定(bind)基本 jQuery 函数。 当浏览器设置为平板电脑时,导航将根据点击进行切换,因此我禁用到任何具有 ul 的 li 元素的链
我有两个链接,如果用户单击其中一个,则与该链接相关的文章将以动画形式显示。如果用户在单击第一个链接之后且在上一个动画完成之前单击另一个链接,则它们的动画会发生冲突。我想使用 .bind() 和 .un
我说的是: .unbind().click(function () { // Do something } 这对我来说看起来有点狡猾,但它是有道理的:开发人员希望首先删除绑定(bind)到该元
我使用 jQuery .bind() 和 .unbind() 来处理滚动时的动画事件。 $(window).bind('scroll', function(){ ... code ... if
我曾经遇到过一种情况,我不得不重写我的某个派生类中的事件处理程序。不幸的是,我不能只是“覆盖”它,因为实现逻辑严格绑定(bind)到基类中的特定方法实现。 我的自然想法是首先从事件中“解除绑定(bin
让我们考虑 Property 接口(interface)的两种方法: Property#unbind() Property#unbindBidirectional(Property other) 正如
我是一名优秀的程序员,十分优秀!