0 0

同步请求阻断事件冒泡的问题3

参考这个图:



描述如下:
当我修改表单中的某一项时,此时鼠标还放在该输入框内,然后我点击保存按钮。此时正常的流程是:
1、触发change事件(Ext.form.Field)
2、触发按钮的handler
现在的问题是我在change事件中定义了一个同步请求,(这里必须是同步请求,不能使用异步,否则可能触发了保存而异步请求还没有返回)结果不触发按钮的handler了。改成异步请求,或者不发送请求事件都是可以正常传播的。
请问下这是什么道理?现在没有头绪解决这个问题。

问题补充:field.addListener('change',function(){
    var values = Utils.doSyncRequest('execFormula.json',params,'POST');       this.setRetObj(field,null,values);
},this);
就是上面这样,
handler的写法就是定义一个按钮那么简单:
var btn_save = new Ext.Button({
    text : '保存',
    handler : saveAction
});
现在是如果使用了上面的同步调用,根本不会执行到saveAction,页面上也没有执行点击按钮的操作,只会看到鼠标聚焦到按钮上,如下图的效果:



问题补充:
myali88 写道
change和handler分别针对不同组件,应该没有影响啊,难道直接都不能点击按钮?在你不发起change事件前

直接点击当然可以,现在就是当鼠标还放在那个field的时候,点击按钮。即先要触发change事件,接着触发按钮的handler,如果我不在change事件中定义了同步请求,这个流程是没有问题的。同步请求的话浏览器会处于等待状态,目前就是不知道是不是其他事件会被阻止了。

问题补充:
myali88 写道
那你可以测试一下,是否ajax同步请求会制止页面事件,你可以直接在body上绑定一个事件来测试。
另外,我想针对你的场景说说我的做法:因为你必须在请求返回后再做保存操作,那你可以在设计页面时,初始状态让按钮不可点击,然后使用异步ajax请求数据,在ajax的返回回调函数中根据条件把按钮设置为可用状态。
你认为这样如何?

没办法这么做,你根本不知道他会不会操作这个输入框,如果操作了,才需要调用返回后才能保存。

问题补充:
clue 写道
呃,前面的回复无视吧,那个缓冲人有在Ext.Editor中时才有

P.S. 不知道你是不是用的IE?其它浏览器有没有试过?
如果其它浏览器正常,那就要考虑规避了,IE的bug真是数不清的,它又没有自动升级功能。

在IE下,firefox下都会有这样的问题。

问题补充:
myali88 写道
引用
没办法这么做,你根本不知道他会不会操作这个输入框,如果操作了,才需要调用返回后才能保存。

我觉得这也正常啊,如果field的内容根本没有变化,那自然没有必要再点击保存按钮啊,只有当有改变了,才有必要去保存。

我是说我根本不知道用户会不会改变那个输入框,所以我的按钮肯定是启用的。

问题补充:我在body增加一个onclick事件
<body onclick="console.log(1);">

同时在同步请求后面增加一条日志
field.addListener('change',function(){ 
    var values = Utils.doSyncRequest('execFormula.json',params,'POST');	         this.setRetObj(field,null,values);	
console.log('after request');
},this); 

可以发现onclick事件被拦截了,不会触发。如果我不使用同步请求,则会触发,答应出日志。
这个道理跟着firebug使用断点是一样的,我不使用断点,但是我在change事件里面随便加个请求,那么onclick也不会触发。
我觉得这可能是浏览器的行为,但是怎么解释,不知道谁能给个说明。

问题补充:不好意思,上面有错别字
这个道理跟firebug使用断点应该是一样的,我不使用同步请求,但是我在change事件里面随便加个断点,再执行过去,那么onclick也不会触发。

问题补充:我现在使用了一种补救的方式,可以参考看看

在change事件中定义了这个
//是否执行了同步请求
var syncRequest = false;
当执行了同步请求时设置为true,
同时在执行change请求后,
//3、如果此时【保存】按钮获得焦点,并且执行了同步请求,由此判定用户实际上是直接点击了【保存】按钮,但是因为执行了同步请求,导致点击不生效
						if(syncRequest && this.toolbar.btn_save.getEl().hasClass('x-btn-focus')){
							//手动执行保存动作
							this.toolbar.btn_save_handler();
						}


这里主要是判定焦点和是否执行了同步请求,如果是,则手动执行下保存动作。


问题补充:把上面的css改成x-btn-click。
2012年2月16日 11:02
  • 大小: 9.4 KB
  • 大小: 6.6 KB

7个答案 按时间排序 按投票排序

0 0

呃,前面的回复无视吧,那个缓冲人有在Ext.Editor中时才有

P.S. 不知道你是不是用的IE?其它浏览器有没有试过?
如果其它浏览器正常,那就要考虑规避了,IE的bug真是数不清的,它又没有自动升级功能。

2012年2月16日 20:00
0 0

弄错了吧?Ext.form.Field中是根据blur事件来触发change的,而它使用了缓冲:(Ext3.1.0)

        // standardise buffer across all browsers + OS-es for consistent event order.
        // (the 10ms buffer for Editors fixes a weird FF/Win editor issue when changing OS window focus)
        this.mon(this.el, 'blur', this.onBlur, this, this.inEditor ? {buffer:10} : null);


所以,这里应该是先触发handler,再触发的change

2012年2月16日 19:57
0 0

引用
没办法这么做,你根本不知道他会不会操作这个输入框,如果操作了,才需要调用返回后才能保存。

我觉得这也正常啊,如果field的内容根本没有变化,那自然没有必要再点击保存按钮啊,只有当有改变了,才有必要去保存。

2012年2月16日 15:58
0 0

那你可以测试一下,是否ajax同步请求会制止页面事件,你可以直接在body上绑定一个事件来测试。
另外,我想针对你的场景说说我的做法:因为你必须在请求返回后再做保存操作,那你可以在设计页面时,初始状态让按钮不可点击,然后使用异步ajax请求数据,在ajax的返回回调函数中根据条件把按钮设置为可用状态。
你认为这样如何?

2012年2月16日 15:41
0 0

change和handler分别针对不同组件,应该没有影响啊,难道直接都不能点击按钮?在你不发起change事件前

2012年2月16日 15:27
0 0

handler怎么写的?你确定hander的回调没有执行,没有进入该方法,是否调试过?

2012年2月16日 13:52
0 0

不知道你的同步请求是怎么请求的,是不是刷新了页面,导致handler事件失效了?

2012年2月16日 12:34

相关推荐

    基于winPcap动态内容阻断

    【基于WinPcap动态内容阻断】是一种网络流量控制技术,主要用于网络安全和访问管理领域。WinPcap(Windows Packet Capture)是操作系统级别的一个库,它允许应用程序捕获和传输网络数据包,无需依赖于网络堆栈。这项...

    Linux时钟同步的方法

    时钟同步可以确保系统时钟的准确性,从而避免由于时钟不准确引起的各种问题。 常见问题 在时钟同步过程中,可能会出现一些问题,例如: * 配置文件中的restrict default ignore没有被注释 * 防火墙阻断了与服务器...

    针对恶意代码的行为阻断方法研究

    - 实时监测移动代码的网络活动,对于异常的网络请求进行拦截; - 监控文件系统操作,防止恶意代码对关键文件的修改或删除; - 控制注册表的访问权限,避免恶意代码对系统设置进行篡改; - 动态分配资源,限制...

    TCP RST阻断 他人 链接 代码结构非常简单

    对于下载等长时间的任务,可以100%阻断。。对于一般网页,阻断率90%以上。。对于类似baidu,google这种简单页面,阻断率20%左右。。 原因:RST到达对方前,数据包已经发送结束了。优化可能性不高。。经过测试,完全...

    一个小型精悍的TCP阻断器

    众所周知,远程TCP阻断是一个非常难的事,但在本地进行TCP阻断成为可能,利用TCP的RST字和滑动窗口的漏洞来进行阻断成为可能,本程序提供了一个界面,能够自动获取本机IP,并能过滤需要阻断的IP,以及进行定时阻断等...

    论文研究-IPSec通信截获与阻断系统研究.pdf

    由于IPSec协议本身具有的完备性和安全性,使得阻断IPSec通信非常困难,特别是在IPSec通信截获与阻断设备并联接入的情况下,一旦通信双方建立起IPSec安全关联再实施阻断几乎是不可能的。给出了一种截获并阻断IPSec...

    机器人辅助后腹腔镜下肾部分切除术选择性阻断肾动脉与不阻断肾动脉的短期临床观察.pdf

    根据提供的文件信息,以下是关于机器人辅助后腹腔镜下肾部分切除术选择性阻断肾动脉与不阻断肾动脉的短期临床观察的知识点。 首先,文档介绍了机器人辅助后腹腔镜手术在泌尿外科领域的应用,具体是关于肾部分切除术...

    区间图上的辅助与阻断问题_Assistance and Interdiction Problems on Interval Gr

    【区间图上的辅助与阻断问题】涉及到一种新的图修改框架,特别针对区间图。区间图是由线性区间在平面上无交叉表示的图,每个节点代表一个区间,边连接了那些有重叠部分的区间。这篇论文由Hung P. Hoang、Stefan ...

    同步整流的基本原理.pdf

    在这些应用中,同步整流能够有效降低因高电流带来的热损耗问题,同时提高了电源转换效率,降低了能源消耗。 随着技术的发展,对于同步整流技术的要求也越来越高。例如,随着对节能的不断追求,尤其是在环保要求日益...

    肿瘤血管阻断剂研究进展1

    在癌症治疗领域,肿瘤血管阻断剂的研究一直是一个热门话题。肿瘤的生长和转移,高度依赖于血管网络的建立。肿瘤血管内皮细胞因为基因稳定性更高、同质性更好以及突变率较低,成为抗肿瘤治疗中的一个重要靶点。肿瘤...

    同步整流FRET_仙童.pdf

    在这些开关过程中,体二极管会经历从导通状态到反向阻断状态的转换,这一转换过程称为反向恢复。反向恢复过程中,体二极管可能会发生故障。 在反激式转换器中,图1展示了一个带有同步整流器的反激式转换器的示意图...

    TCP RST阻断 链接 代码结构简单

    阻断不能保证100%成功,原因是RST在通信结束后才到达。 对于多个包和长时间连接,成功率100% 也就是:网页不能完全成功(一大半成功),下载以及其他连接,100%成功。 PS:编译、连接需要Winpcap开发包,运行需要...

    GCT芯片阻断电压测试介绍.pdf

    GCT芯片在生产过程中需要进行严格的电参数测试,特别是阻断电压和漏电流的测试,来确保其符合设计要求并且具有良好的性能稳定性。本文主要介绍了GCT芯片阻断电压测试的原理、测试要求、测试方法和测试流程。 首先,...

    傍路阻断技术对数据包进行过滤

    接入控制,旁路阻断,不改变原有的部署和拓扑。

    超选择性肾动脉分支阻断在腹腔镜机器人辅助肾部分切除术中的应用.pdf

    传统上,完全肾动脉主干阻断是常用的方法,但随着技术进步,特别是腹腔镜和机器人技术的应用,以及对肾血管解剖结构更深入的了解,选择性肾动脉分支阻断技术逐渐成为提高手术精准度和减少手术创伤的重要手段。...

    检测布氏杆菌抗体直接阻断ELISA方法的建立

    在布鲁氏菌病的诊断中,阻断ELISA是一种常用的方法,其原理是利用布鲁氏菌特异性抗体阻断酶标记抗体的结合,通过检测阻断效应来判定样品中是否存在布鲁氏菌抗体。 本研究通过优化直接阻断ELISA的反应条件,包括抗体...

    IDS 和 IPS 的区别以及旁路阻断的插件使用

    它主要用于检测未经授权的访问或其他恶意活动,并报告这些事件以便进一步调查。 **工作原理**:IDS通过分析网络流量、日志文件等数据源来识别潜在的威胁。它可以基于特征(已知攻击模式)、异常行为或二者的结合来...

Global site tag (gtag.js) - Google Analytics