jQuery的textbox.val('xxxx')没有触发更改事件?

47
我在页面上放置了以下jQuery代码:
var isChanged = false;
$(document).ready(function()
{
    $('.change').change(function() {
        isChanged = true;
    });
});

我正在使用一个插件,它通过以下方式修改与之链接的文本框的值:

target.val('xxxx');

在 ASP.NET 的 HTML 中,文本框如下:

<input name="ctl00$cphHolder1$rptFlex$ctl01$txtLeftRank"
  type="text"
  value="52°"
  id="ctl00_cphHolder1_rptFlex_ctl01_txtLeftRank"
  class="change atiselector" />

使用代码更改文本框的值时,更改不会触发。如果我在文本框中键入,将会触发更改事件。我错过了什么?

4个回答

78

就是这样的。如果您需要更改值来触发"change"事件,可以通过以下方式显式地执行:

$('input#whatever').val('hi').change();

有史以来最愚蠢的事情之一。我很想修补val()函数,让它表现得更加合理。 - Andrew Bullock
6
如果您实施这个“明智”的补丁,您可能会发现它会显著降低应用程序的性能。 - NobodyMan

4

$('.change').change()会触发事件。仅仅改变属性并不会触发事件。


4
根据 DOM Level 2 Event Specification 的规定:

当一个控件失去输入焦点并自获取焦点后其值被修改时,就会触发 change 事件。

这意味着 change 事件旨在响应用户交互引起的更改。编程更改不会导致此事件被触发。

0

如上所述,更改事件是设计为由用户交互触发的。如果您想在编程设置值后执行某些操作,则可以使用jQuery valHooks。

var isChanged = false;
$.valHooks['text'] = {
    set: function (elem, value) {
        if ($(elem).is('.change')) {
            elem.value = value;
            isChanged = true;
            return true;
        }
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接