Internet Explorer 8 Ошибка регулярного выражения JScript - PullRequest
2 голосов
/ 06 октября 2010

Я тестирую в Internet Explorer 8 на Windows XP и сталкиваюсь с утомительной ошибкой. Я пытаюсь протестировать строки с помощью регулярного выражения, которое отлично работает в 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 - это список jQuery объектов TR. и я сравниваю текст в ячейке pr_rowIndex-th для двух строк.

pr_compareFunction больше, чем.

dateRegEx.test (a) возвращает false, поскольку строка a содержит ошибки.

Тестирование в консоли ie8 говорит мне, что

globalA.toLowerCase() == "sep 2010"

возвращает false. В этом случае alert(globalA) показал «сентябрь 2010», а alert(globalLeft) - «сентябрь 2010». Я проверил. Длина на обоих, чтобы быть 8, как и ожидалось.

globalLeft1 == globalLeft кажется верным, но ни один из них не равен нормальным строкам.

Я вообще не понимаю, почему JScript не может распознать эти две строки. воспроизведение этих точных шагов в консоли работает как положено.

[Дальнейшее редактирование]

Различная реализация javascript рассматривает символы без пробелов как класс символов пробела или класс символов без пробелов. Является ли это ошибкой или работает как задумано, открыто для обсуждения.

1 Ответ

3 голосов
/ 04 ноября 2010

Как уже упоминалось. Проблема заключалась в том, что «\ s» в javascript не включает неразрывный пробел в IE, но включает неразрывный пробел в FF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...