【发布时间】:2010-09-25 11:38:07
【问题描述】:
我有一个带有 onchange 事件的文本框。当用户使用自动完成功能填充文本框时,为什么不触发此事件?
我正在使用 Internet Explorer。是否有一个标准且相对简单的解决方案来解决此问题,而无需我禁用自动完成功能?
【问题讨论】:
标签: asp.net javascript
我有一个带有 onchange 事件的文本框。当用户使用自动完成功能填充文本框时,为什么不触发此事件?
我正在使用 Internet Explorer。是否有一个标准且相对简单的解决方案来解决此问题,而无需我禁用自动完成功能?
【问题讨论】:
标签: asp.net javascript
上次我遇到这个问题时,我最终使用了 Internet Explorer 的 onpropertychange 事件。我读到了here on MSDN:这是绕过它的推荐方法。
【讨论】:
我之前遇到过这个烦人的功能,当时我的解决方案是使用onfocus事件记录文本框的当前值,然后使用onblur事件检查当前值是否与保存的值匹配在聚焦期间。例如
<input type="text" name="txtTest" value="" onfocus="this.originalvalue=this.value" onblur="if (this.value != this.originalvalue) alert('Test has changed')"/>
【讨论】:
onblur 解决了我的问题。
$("#my-field").focus(function(){this.originalvalue=this.value}).blur(function(){if (this.value != this.originalvalue) alert('changed')});
我只是为需要触发文本更改事件的文本框关闭自动完成
'Turn off Auto complete
'(it needs to fire the text change event)
txtYourTextBox.Attributes.Add("AutoComplete", "off")
只需将其放在页面加载中即可。
或者,您可以将属性添加到 input 元素或整个 form 的标记中:
<input type=text autocomplete=off>
或
<form autocomplete=off>
【讨论】:
我刚刚发现using jQuery 1.4 to set change event可以解决这个问题。如果您已经熟悉 jQuery,这似乎是解决此问题的最简单方法。
【讨论】:
基于 Tim C 的回答,这是我想出的简单 jquery,用于处理页面上的所有文本框:
$("input[type=text]").bind("focus change",function(){
this.previousvalue = this.value;
}).blur(function(){
if (this.previousvalue != this.value){
$(this).change();
}
})
如果你不关心 onchange 触发多次,你可以让它更简单:
$("input[type=text]").blur(function(){
$(this).change();
})
【讨论】:
我发现以下 jQuery (v1.10+) JavaScript 在 HTML 文本输入字段自动完成文本的情况下确实有效。这至少在 Mac OS X 10.8.5 上的 Safari 6.1.1 中经过测试可以可靠地运行,但也应该在其他兼容的浏览器中运行:
$("input:text[id=text_field_id]").bind("focus change keyup blur", function(event) {
// handle text change here...
});
似乎添加 blur 事件处理程序是完成这项工作的关键,尽管其他事件处理程序有助于确保在文本更改时调用事件处理程序,无论是由于编辑还是新输入浏览器的自动完成功能。
只需将上面的"input:text[id=text_field_id]" 代码替换为所需文本输入字段的相关选择器,或者如果使用id 属性来引用您的字段,请将text_field_id 替换为您的文本字段的id 属性值。
【讨论】: