更改“输入”事件处理程序中的输入值可防止Chrome和IE中的“更改”事件触发(但不会在Firefox中)

时间:2014-12-09 10:27:21

标签: javascript jquery google-chrome internet-explorer firefox

在下面的代码中,我有"输入"事件处理程序,在用户键入时更改输入的值。我也有"改变"事件处理程序,用于跟踪对此字段所做的任何更改。出于某种原因"改变"当用户离开现场时,事件不会在Chrome和IE中触发。为什么这样以及如何使其在所有主流浏览器中都有效?

另请注意,触发"更改"是不可接受的。每次手动事件"输入"事件火灾。

编辑:"更改"只有在transform函数不以任何方式更改结果字符串时,才会在Chrome中触发事件。因此,如果我输入小写字母并在每个字符后聚焦,"更改"仅针对索引0,2,4 ...

触发

链接到小提琴:http://jsfiddle.net/3hqxx2pr/



function transform(s) {
    var r = "";
    for (var i = 0; i < s.length; i++) {
        r += i & 1 ? s[i].toUpperCase() : s[i];
    }
    return r;
}

$(document).ready(function(){
  
    $("#in").on("change", function() {
        console.log("changed"); // works only in ff
    });

    $("#in").on("input propertychange", function() {
        $("#in").val(transform($("#in").val()));
    });
  
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<input id="in"/>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

触发更改

$("#in").val(transform($("#in").val())).change();

$("#in").val(transform($("#in").val())).trigger("change");

根据您所做的编辑和限制:

$("#in").on("input propertychange", function() {
    var inp = $(this);
    var orgVal = inp.val();
    var transVal = transform(orgVal);
    if (orgVal !== transVal) {
        inp.val(transVal).trigger("change");
    }
});