代码之家  ›  专栏  ›  技术社区  ›  Raynos

Internet explorer 8 JScript正则表达式错误

  •  2
  • Raynos  · 技术社区  · 14 年前

    我在windowsxp上测试internetexplorer8,遇到了一个乏味的bug。我尝试用一个正则表达式测试字符串,该表达式在firefox中可以正常工作,在ie8控制台中独立测试。

    但是当它通过我的闭包函数时,字符串的行为很奇怪

    [Edit]更详细的代码:不像前面的代码片段那样漂亮或干净。

    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被窃听。

    globalA.toLowerCase() == "sep 2010"
    

    返回false。在这种情况下 alert(globalA) 显示“2010年9月”和 alert(globalLeft)

    globalLeft1 == globalLeft

    [进一步编辑]

    这是javascript的不同实现,它将非分隔空格字符视为空格字符类或非空格字符类。这是一个bug还是按预期工作有待讨论。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Raynos    14 年前

    如前所述。这里的问题是javascript中的“\s”在IE中不包含非中断空格,但在FF中包含了非中断空格。