作者DragonTatto (Larsson)
看板Ajax
标题[问题] 请问关於jQuery事件的回传值
时间Thu Sep 26 09:20:58 2013
各位好
情况是这样的
有一个网页上的按钮被挂载了两次click事件
一个是其他元件的自动行为(称为A事件)
另一个则是我们自行定义的click事件(称为B事件)
自行定义的事件因为写在按钮本身的onclick属性上
所以发生顺序会是[按钮按下]->[B事件]->[A事件]
B事件做的事情很简单,就只是跳个confirm视窗询问要不要继续
问题在於,因为A事件没办法光靠B事件的回传值就取消其事件呼叫
虽然可以阻止form的submit行为
却没办法光靠这样就阻止在A事件里面做的事
为了能够阻止A事件其行为
我试着在B事件回传前改变一个变数的值
在A事件触发後马上检查这个值来判断要不要继续做
虽然这样有效,但很想知道
有没有办法取得A事件的上一个事件的回传值来做判断?
换个方式问,就是事件的回传值是否会保存在某处?
谢谢各位
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.120.147.13
1F:推 s25g5d4:如果确定B会先执行 那可以直接在B里停止事件传播 09/26 11:26
2F:→ s25g5d4:这样就不会触发A 09/26 11:26
老实说,我被下达的要求就是在不改动B的情况下,只靠改A的部分来达成一样的事
所以我非得要取得前一个事件的回传值不可...
不然我的作法烂归烂,好歹也有达成要求
另外停止事件传播的方法,好像只对其父元素有效果
我找了各种版本的停止事件传播方法,一股脑的全丢进去
还是无法阻止A的执行
才会出下策在A里面判断变数决定要不要继续
我javascript很弱,只能猜测是因为两个click事件挂於同一元素下
层级相同所以无法互相干涉
3F:→ danny8376:回传值会出现在事件里 不过那只有浏览器知道 09/26 12:41
4F:→ danny8376:所以只能改变数判定 虽然很想问... 难道不能B去叫A? 09/26 12:41
後来在stackoverflow看到的做法
在A的按钮事件绑定前,先抓出原本存在於A的函式物件
var oldEvent = button.click;
然後把button的click事件解除绑定後再重新挂上新函式
$(button).unbind('click');
button.click = function() {}
然後只要在函式开始时马上执行
if (oldEvent() == false) {return false;}
後面接上A事件原本在做的事,就能达成我想要的效果了
看起来好像是把两个事件合成为一个
由A来呼叫B,就可以取得B的回传值
而从B那边看来,就只是挂上的事件发挥了它原本的功能
而且这样改完全不需要动到B那端的程式
虽然可能是因为我太菜才不知道可以这样做
还是提供出来给大家参考看看
谢谢回应的各位
5F:→ TonyQ:这种作法有很多条件限制的... 09/27 18:49
6F:→ TonyQ:你的问题应该要解决需求端的问题,走这种旁门左道,早晚还是 09/27 18:49
7F:→ TonyQ:拖火车撞山~ 09/27 18:49
嗯...原来如此
不过我得说,身为新到不能再新,功力又没多好的菜鸟
我也没办法去改变早已谈好的需求
如果被要求要只改某边就达成功能,也只能先照做
我的知识也还不够我去判断这麽做或不这麽做的优劣之处在哪里
我的职位也不够我去谈
只知道一个,目前的作法得要肯定其他事件的挂载事件早於它
现在能运作只是因为confirm的部分是写在button的属性中
如果是另外写在其他地方的事件可能就会炸掉
8F:推 LaPass:好多公司的程式码中都有一堆火车在拖.... (眼神死) 09/27 21:12
我自己也写不出多好的作法所以这方面我比较...(汗)
※ 编辑: DragonTatto 来自: 114.25.203.178 (09/28 00:13)
9F:→ LPH66:这种写法看起来很像是 hook ? 09/28 13:59