javascript – 当手动和以编程方式更改文本字段的值时,是否应触发更改事件?

前端之家收集整理的这篇文章主要介绍了javascript – 当手动和以编程方式更改文本字段的值时,是否应触发更改事件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个带有远程数据源的jQuery UI Autocomplete文本字段.自动完成的select事件有三件事:

>使用从自动完成列表中选择的值更新文本字段的值
>进行AJAX调用以将更多数据加载到页面
>将焦点移动到另一个文本字段(在上一步中创建)

文本字段还有一个更改事件,用于删除上面步骤2中加载的数据并触发自动完成的搜索事件.

这在IE中完美运行(使用版本9和10测试),但在Firefox中没有.当我从自动完成列表中进行选择时,从不显示额外数据(虽然分析网络流量显示正在进行AJAX调用)并且触发了自动完成的搜索事件.我设法将问题跟踪到Firefox,在上面的步骤3之后触发文本字段的更改事件,显然是因为我在文本字段中键入了一些内容以触发自动完成列表,尽管事后文本字段后来以编程方式更新.

快速示例:http://jsfiddle.net/2umrJ/1
(为简洁起见,该示例仅在文本字段上使用keyup事件.)

IE10的输出

input1.focus() triggered
input1.blur() triggered
input2.focus() triggered

Firefox 20中的输出

input1.focus() triggered
input1.change() triggered
input1.blur() triggered
input2.focus() triggered

可以看出,Firefox不会触发更改事件.现在我知道默认情况下(即没有任何额外的代码)更改事件仅在手动更改值时触发,但是当手动和以编程方式更改值而没有字段失去焦点时,正确的行为是什么?

此外,更重要的是,对于我的特定情况,如果Firefox的行为是正确的(或至少不正确),防止它的最佳方法是什么?在从自动完成列表中选择了某些内容后,我不希望在以编程方式更改焦点时触发更改事件.

解决方法

为了防止在firefox中触发更改事件,我会在你的逻辑中设置一个变量来说明它正在以编程方式进行更改,并且在更改事件逻辑中,你应该检查该变量,如果以编程方式触发它,则不执行更改逻辑,并在退出前重置变量.

猜你在找的JavaScript相关文章