意外的localeCompare行为

时间:2013-08-29 07:34:30

标签: javascript jquery

我有几行代码试图检测用户与之交互(输入)的最后一个字段。

以下事件处理程序正常运行,但无论用户是否在字段if/else#input1中输入文本,#input2的第一种情况始终都会运行。在这个例子中是否存在localeCompare的意外行为?

JS:

$("#input1, #input2").keyup(function () {
    if (("input1").localeCompare($(this).attr("id"))) {
        calculateA();
    } else if (("input2").localeCompare($(this).attr("id"))) {
        calculateD();
    });
}

HTML:

<div id="input1">
    <div class="input-prepend">
        <span class="add-on"></span>
        <input id="foo" class="span7" type="text">
    </div>
    <br>
    <div class="input-prepend">
        <span class="add-on"></span>
        <input id="bar" class="span7" type="text">
    </div>
</div>

编辑:事实证明,错误并非完全取决于上面发布的代码。 .js代码段中的两个比较实际上是setTimeout回调函数的主体;因此,我没有意识到执行上下文(以及随后的“this”的值)会发生变化!

2 个答案:

答案 0 :(得分:1)

您似乎想要使用event.target代替this

var id = event.target.id;
if (id === 'foo') { 
   // ...
 }

答案 1 :(得分:0)

您的测试不能永远不会返回0,因为您没有任何ID为input1的输入,并且this时,具有此ID的div不会是keyup {1}}事件被提出。

假设您将ID input1input2提供给您的输入,您的代码仍然过于复杂。您不需要localeCompare来测试字符串相等性。我怀疑当字符串不同时,你没有在true测试中将结果作为if传递。你似乎想要

$("#input1, #input2").keyup(function() {
    if ("input1"===this.id) {
        calculateA();
    } else if ("input2"===this.id) {
        calculateD();
    }
});