IE работает медленно при обработке JavaScript по сравнению с FF и Chrome - PullRequest
0 голосов
/ 16 сентября 2009

Я пытаюсь выяснить, почему IE медленно обрабатывает этот javascript по сравнению с Chrome и FF. В Chrome и FF нет никаких задержек для каких-либо событий onclick, но в IE он останавливается примерно на 5 секунд, прежде чем что-либо делать.

Вот ссылка на код, который я использую.

http://geekswithblogs.net/ptahiliani/archive/2009/08/13/highlighting-textbox-on-error-using-required-field-validator.aspx

Я использую это, чтобы выделить цветные текстовые поля с ошибками. Он отлично работает, без ошибок, но очень медленно.

Ответы [ 3 ]

1 голос
/ 16 сентября 2009

Я не знаю много о том, как это вызывается, так как похоже, что вы используете ASP для этой работы (и я не знаю ASP). Но что меня выделяет, так это то, что у вас есть var inputControl = document.getElementById(Page_Validators[i].controltovalidate); внутри двух отдельных петель.

Несколько вызовов document.getElementById для одних и тех же элементов является причиной многих проблем с производительностью JavaScript. Рассмотрите возможность объединения SetValidatorCallouts и ClearValidatorCallouts, чтобы уменьшить количество вызовов до document.getElementById (что, я уверен, медленнее в IE, но пока не может найти никаких тестов). Я не говорю, что это будет гарантировать быстрое обновление, но это 1) стоит попробовать, и 2) хорошая практика для программирования на JavaScript. Что-то вроде:

var SetValidatorCallouts = function() {
    var pageValid    = true,
        inputControl = null;

    for ( var i=0; i<Page_Validators.length; i++ ) {
        inputControl = document.getElementById(Page_Validators[i].controltovalidate);              

        if ( !Page_Validators[i].isvalid ) {
            if ( pageValid ) {
                inputControl.focus();
            }

            addClass(inputControl, 'error');
            pageValid = false;                                                    
        } else {
            removeClass(inputControl, 'error');
        }
    }                   

  return pageValid;
}

В качестве примечания, ваши функции модификации className слишком сложны. Я бы предложил использовать стандартный фреймворк (jQuery, Dojo, ExtJs и т. Д.). В противном случае рассмотрите возможность замены следующими, более простыми методами. Они не обязательно ускорят ваш код, но они облегчат обслуживание, тем более что я заметил, что у вас уже есть особые условия для обработки ошибок в WebForm_RemoveClassName.

var removeClass = function(element, className) {
    // Simply split on white space and remove the specified class
    var classes = element.className.toLowerCase().split(/\s+/);
    var result  = "";
    className   = className.toLowerCase();

    for ( var i in classes ) {
        if ( classes.hasOwnProperty(i) && classes[i] != className ) {
            // Extra spaces at the end don't matter.  I have yet to see a
            // browser that cares about superfluous whitespace in classes
            result += classes[i] + " ";
        }
    }
    element.className = result;
}

var addClass = function(element, className) {
    // Extra spaces affect nothing, don't bother trying to make 
    // the className attribute perfect.
    element.className += " " + className;
}

Небольшой пример этого:

var fakeElement = {
    className: "foo-asdf asdf asdf-foo foo-asdf-asdf fooasdf asdffoo fooasdfasdf asdf fooasdffoo" 
};

console.log(fakeElement.className);
removeClass(fakeElement, "asdf");
console.warn(fakeElement.className);
0 голосов
/ 16 сентября 2009

Сложно посмотреть на сценарий и сказать, почему он работает медленно. Лучший способ проверить это - запустить поставить несколько операторов журнала таймера, чтобы увидеть, какая его часть работает медленно. Если у вас IE8, вы можете использовать отличный инструмент для профилирования, который поставляется с ним.

0 голосов
/ 16 сентября 2009

Может быть, потому что он должен вызывать ActiveX для подключения сценария на стороне сервера. В месте, где я работаю, мы прекратили поддержку IE для наших веб-приложений. Лучшее решение еще не найдено;)

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