gpt4 book ai didi

javascript - JQuery "Constrain"插件 - 奇怪的 Javascript 错误

转载 作者:行者123 更新时间:2023-11-28 03:01:04 25 4
gpt4 key购买 nike

背景:我们的 Web 应用程序使用 jquery.constrain.js 插件来处理某些文本框中的数据输入,仅允许添加有效字符。该插件允许使用正则表达式、白名单/黑名单字符等对数据进行各种约束。直到今天,我们运行的是该插件的 1.0 版本,未修改。

几天前我注意到一些文本框仍然允许输入无效数据。例如,纯数字文本框允许使用字母字符等。它还会显示 JavaScript 错误“对象不支持此属性或方法”。我追踪到 jquery.constrain 插件中的以下函数。

    function match(item, input, e) {
var arr = item.chars.split("");
for (var i in arr) {
var token = arr[i];
if (token.charCodeAt(0) == e.which) {
return true;
}
}
if (item.regex) {
var re = new RegExp(item.regex);
if (re.test(String.fromCharCode(e.which))) {
return true;
}
}

return false;
};

通过这段代码进行调试,我确定了以下内容:

  • item 是一个具有两个字符串属性的对象:charsregex
  • item.chars 失败时为空字符串 ("")。
  • arritem.chars.split("")的结果,正如预期的那样,是一个空数组。

这就是奇怪的地方。即使 arr 是一个空数组,for 循环也会为 i 分配一个有效值。该值为“删除”。所以我们就陷入了循环。 token 显然为 null,因为 arr["remove"] 为 null。所以 token.charCodeAt(0) 会抛出异常。

我通过在 for 循环周围添加 if 语句来纠正错误,如下所示:

        if (arr.length > 0) {
for (var i in arr) {
var token = arr[i];
if (token.charCodeAt(0) == e.which) {
return true;
}
}
}

但是,我完全困惑为什么这是必要的 - 这是 IE 错误、插件中的错误,还是我在编译应用程序时屏住呼吸错误?

最佳答案

你不应该使用 for(i in arr) 来循环数组。如果脚本向数组原型(prototype)添加方法,这些方法也将使用 for(i in arr) 循环进行迭代。这可能是导致您错误的原因。您可能添加了一个修改 Array.prototype 链的脚本。

另请阅读此处的“为什么应该停止使用 for...in 进行迭代(或永远不要使用它)”
http://www.prototypejs.org/api/array

关于javascript - JQuery "Constrain"插件 - 奇怪的 Javascript 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/883544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com