Javascript 使用单个函数从另一段代码中取消 POST
Javascript cancel POST from another piece of code using one single function
好的,在我的代码中,例如:
$('.follow').click(function(){
var myself = $(this);
var data = {
id: this.getAttribute('data-id')
}
$.post('/users/setFriend', data, function(msg){
myself.text(msg);
myself.attr('data-status-friends', (myself.attr('data-status-friends').toLowerCase() == 'follow') ? 'following' : 'follow');
});
})
但是,我在某些元素上放置了一个"auth"类,如果用户注销,请运行以下JS:
$('.auth').click(function(e){
e.preventDefault();
alert('not logged in');
});
这适用于大多数元素,但对于上述 POST,它似乎仍然会操作 POST。如果单击 .auth,如何最终取消由其他代码位触发的事件?
我们不应该在这里谈论传播或默认操作预防。关键是要创建两个不同的事件处理程序系列:一个附加到.follow
元素,另一个附加到.auth
元素。当然,如果一个元素有两个类,单击它将自动触发两个处理程序 - 它们都将附加到该元素(因此没有传播)。
我认为,这里最简单的解决方案是在将类分配给元素时click
.auth
处理程序中删除。
或者,您也可以在.follow
处理程序函数中检查$(this).hasClass('auth')
条件 - 如果是这种情况,请立即return false
。
停止事件,我认为更好的方法是简单地不将事件放入不登录就不应该做的元素中,或者使用变量跟踪 JS 代码中的身份验证状态并在执行操作之前进行检查。如果要构建客户端 MVC 样式应用程序,后者可能是更好的使用方法。
对于不同的解决方案集,您可能会遇到两个问题。
- 侦听器附加到不同的元素,与它们应该是什么相反
- 侦听器附加到同一元素
不同的元素
你的处理程序是乱序的,交换它们,以便 e.stopPropogation() 在 inner(child) 元素上,$.post() 调用在 outter(parent) 元素上。
相同元素
如果侦听器位于同一元素上,则 e.stopPropogation() 和 e.preventDefault() 都不会执行您希望的操作,因为事件侦听器仍将在同一元素上触发。
stopPropogation()
描述:防止事件在 DOM 树中冒泡, 防止任何父处理程序收到事件通知。
根据 DOM 级别 2 规范的传播仍将在同一元素上执行所有侦听器,但不执行附加到父元素的事件:
如果捕获事件侦听器希望阻止进一步处理 事件发生后,它可能会调用 停止Progagation 方法 事件接口。这将防止事件的进一步调度, 尽管在同一层次结构中注册了其他事件侦听器 级别仍将接收事件。
防止默认()
说明:如果调用此方法,则事件的默认操作 不会被触发。
默认操作基于正在操作的元素 (W3C)。对于链接,这将是重定向到 href=" 值、输入元素以聚焦它等。这不是您想要的,因为您很可能不是"默认行为"。
一种选择是将调用 $.post 的处理程序附加到 DOM 上较高的元素。
$('.follow').parent().click(function(e){e.stopPropogation()})
您可能需要更改目标 HTML,以便将事件附加到内部(子)和外部(父)元素。目标是让 $.post 处理程序作为外部(父级)和内部(子级)处理程序取消事件。
另一种选择是添加检查以查看元素上是否存在其他类。
$('.follow').click(function(){
var myself = $(this);
if(!$(this).hasClass('.auth')){
var data = {
id: this.getAttribute('data-id')
}
$.post('/users/setFriend', data, function(msg){
myself.text(msg);
myself.attr('data-status-friends', (myself.attr('data-status- friends').toLowerCase() == 'follow') ? 'following' : 'follow');
});
}
});
- 在经过一段时间或满足条件后运行代码
- 下面的一段代码在jquery中会做什么
- Javascript 使用单个函数从另一段代码中取消 POST
- 哪一段代码通常更容易被接受
- JQuery 将一段代码应用于多个元素
- 链接到同一页面上的一段代码
- 是否可以在JavaScript的执行堆栈末尾放置一段代码
- 如果没有jQuery,javascript如何检查多个ajax调用是否已经完成,一旦完成,就执行一段代码
- 在浏览器向服务器发送任何操作URI的请求之前执行一段代码
- 向机器人隐藏一段代码
- 在执行一段代码之前,必须加载两个ExtJS存储
- Node.js:确保一段代码一段接一段地执行
- Javascript跳过一段代码,但在使用调试器时可以正常工作
- 使用if语句关闭html中的一段代码
- 我无法理解一段代码
- 在一段代码中混合使用PHP、Javascript和Ajax
- 我无法让一段代码在jsfiddle之外工作
- 将一段代码从jQuery 1.3.2升级到最新版本
- 如何在$q.all返回之前运行最后一段代码
- 向网页添加一段代码:Chrome 扩展程序