Я не знаю много о том, как это вызывается, так как похоже, что вы используете 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);