我正在 Windows XP 上的 Internet Explorer 8 中进行测试,并遇到了一个繁琐的错误。我正在尝试使用正则表达式测试字符串,该正则表达式在 Firefox 中运行良好,并在 ie8 控制台中独立进行了良好测试。
但是当它通过我的闭包函数时,字符串的行为很奇怪
[编辑]更详细的代码:不如之前的代码片段那么漂亮或干净。
var m_TableSorter = (function() {
// static reg expression string and array for ordering dates
var dateRegEx = new RegExp(
"(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\\s\\d{4}");
...
...
function greaterThan(left, right) {
window["globalLeft"] = left;
window["globalRight"] = right;
var a = $.trim(left.toLowerCase());
var b = $.trim(right.toLowerCase());
window["globalA"] = a.toString();
window["globalReg"] = dateRegEx;
if (dateRegEx.test(a) && dateRegEx.test(b)) {
var yearA = parseInt(a.substring(4,8), 10);
var yearB = parseInt(b.substring(4,8), 10);
if (yearA > yearB) {
return true;
} else if (yearB > yearA) {
return false;
} else {
/* ... */
var monthA =
$.inArray(a.substring(0,3).toUpperCase(), monthArray);
var monthB =
$.inArray(b.substring(0,3).toUpperCase(), monthArray);
m_Debug.tryAssert(monthA >= 0, "Date string malformed");
m_Debug.tryAssert(monthB >= 0, "Date string malformed");
if (monthA > monthB) {
return true;
} else {
return false;
}
}
}
//alert("NONDATE");
if ( a.toUpperCase() >= b.toUpperCase() ) {
return true;
}
return false;
}
function mergeArrays(pr_left, pr_right, pr_compareFunction, pr_rowIndex)
{
m_Debug.debugUtilityFunction(arguments);
var results = new Array();
var obj;
/* Merges in order so that if right > left then the results is
* [left right] otherwise the result is [right left] (Dependant on
* ascending or descending order)
*/
while (pr_left.length > 0 || pr_right.length > 0) {
if (pr_left.length > 0 && pr_right.length > 0) {
window["globalLeft1"] = $(pr_left[0].children[pr_rowIndex]).text().toString();
window["globalRight1"] = $(pr_right[0].children[pr_rowIndex]).text().toString();
var bool = pr_compareFunction(
$.trim($(pr_left[0].children[pr_rowIndex]).text()),
$.trim($(pr_right[0].children[pr_rowIndex]).text())
);
if (bool) {
results.push(pr_left.shift());
} else {
results.push(pr_right.shift());
}
} else if (pr_left.length > 0) {
for (obj in pr_left) {
results.push(pr_left[obj]);
}
break;
} else if (pr_right.length > 0) {
for (obj in pr_right) {
results.push(pr_right[obj]);
}
break;
}
}
return results;
}
对于mergeArrays
函数,pr_left
和pr_right
是TR对象的jQuery列表。我比较该行的第 pr_rowIndex-th
单元格中的文本两行。
pr_compareFunction
大于。
dateRegEx.test(a) 返回 false,因为字符串 a 被窃听。
在 ie8 控制台中测试它告诉我
globalA.toLowerCase() == "sep 2010"
返回错误。在本例中,alert(globalA)
显示“sep 2010”,alert(globalLeft)
显示“Sep 2010”。我已检查两者的 .length 均为 8,符合预期。
globalLeft1 == globalLeft
似乎是正确的,但都不等于普通字符串。
我完全不明白为什么 JScript 无法识别这两个字符串。在控制台中复制这些确切的步骤可以按预期进行。
[进一步编辑]
JavaScript 的不同实现将不间断空格字符视为空格字符类或非空格字符类。这是一个错误还是按预期工作还有待讨论。
最佳答案
如前所述。这里的问题是,javascript 中的“\s”在 IE 中不包含不间断空格,但在 FF 中包含不间断空格。
关于javascript - Internet Explorer 8 JScript 正则表达式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3872046/