在更改事件上调用函数时出现问题

时间:2010-09-22 16:32:42

标签: javascript jquery

我想在输入字段长度为15时立即调用ajax调用(现在我只是放入一个警告框来代替.ajax {}),但是警报框直到我才开始启动输入字段填充15个字符后,单击屏幕上的某个位置。     我在这做错了什么?

$("#serialCode").change(function () {
    var d = $("#serialCode").val();
    if (d.length == 15) {
        var $code = d.substring(0, 9);
        alert('Serial code ' + $code);
    }
    $(this).val("");
});

4 个答案:

答案 0 :(得分:2)

您可能希望使用keypress而不是keyup或keydown,因为如果某人持有密钥,则不会为后续字符调用这些字符。

$("#serialCode").keypress(function () {
    var d = $("#serialCode").val();
    if (d.length == 15) {
        var $code = d.substring(0, 9);
        alert('Serial code ' + $code);
    }
    $(this).val("");
});

答案 1 :(得分:2)

我今天早些时候写了blog post为什么 onkeyup 对于检测用户输入不是一个好主意。更好的选择是使用 onkeydown 和0ms计时器,或者将新的HTML 5事件 oninput 组合用于符合标准的浏览器和 onpropertychange 在Internet Explorer中。

这两个事件将处理其他形式的输入,例如剪切,粘贴,撤消,重做,拖放,甚至是本机拼写检查所做的更改。

这样的事情对你有用:

// Check for which event we need to bind to, onpropertychange or oninput
var evt = "onpropertychange" in document.body ? "propertychange" : "input";
$("#serialCode").bind(evt, function (event) {
    // For the onpropertychange event, check that the value property changed
    if (evt == "propertychange" && event.propertyName != "value")
        return;
    var d = $("#serialCode").val();
    if (d.length == 15) {
        var $code = d.substring(0, 9);
        alert('Serial code ' + $code);
    }
    $(this).val("");
});

请注意,如果您需要支持旧浏览器,则需要使用某种形式的事件检测来查看这些事件是否可用,如果没有,请使用计时器方法返回到keydown。

答案 2 :(得分:1)

在您失去对输入的关注之前,change事件才会触发。

请尝试使用keyup

$("#serialCode").keyup(function () {
    var d = this.value;
    if (d.length == 15) {
        var $code = d.substring(0, 9);
        alert('Serial code ' + $code);
    }
  //  this.value = '';
});

您应该注意,人们可以通过使用GUI将文本粘贴到输入中来解决这个问题,因此您可能也希望在change上添加相同的功能。

$("#serialCode").bind('keyup keydown change', function () {

因为有多个事件,所以你应该在发送AJAX请求时设置某种标志,所以你不会多次发送它。

答案 3 :(得分:0)

我遇到了jQuery ajax界面的问题。当我决定只使用javascript时,这些问题就消失了。

请参阅IBM托管的此link。一旦你读完这篇文章,你将再也不会对ajax如何运作或应该如何运作提出疑问。