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

时间:2013-04-03 14:26:46

标签: javascript jquery html

我有一个带有远程数据源的jQuery UI Autocomplete文本字段。自动填充的select事件有三件事:

  1. 使用从自动填充列表
  2. 中选择的值更新文本字段的值
  3. 进行AJAX调用以将更多数据加载到页面中
  4. 将焦点移至另一个文本字段(在上一步中创建)
  5. 文本字段还有一个change事件,用于删除上面步骤2中加载的数据并触发自动填充的search事件。

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

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

    IE10中的输出:

      

    input1.focus()触发了   input1.blur()触发了   input2.focus()触发

    Firefox 20中的输出:

      

    input1.focus()触发了   input1.change()触发了   input1.blur()触发了   input2.focus()触发

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

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

1 个答案:

答案 0 :(得分:3)

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