Я работаю над веб-приложением в ASP.NET 2.0, которое включает в себя несколько GridView
элементов. Когда пользователи щелкают одну из строк в сетке, эта строка должна отображать свой выбор путем изменения цвета. Каждая строка имеет атрибуты, установленные для идентификации ее типа записи и уникального идентификатора:
<tr data-elementType='myType' data-myID='12' onclick='selectionFunction();'></tr>
Я выполняю выделение с помощью обработчика javascript onclick
в каждой строке, которая вызывает функцию, которая:
- Удаляет класс
selected
из ранее выбранной строки
- Добавляет класс
selected
к новой выбранной строке
- Обновляет значение скрытого поля с новым выбранным уникальным идентификатором, чтобы код на стороне сервера мог знать, над каким элементом нужно выполнить действие при нажатии кнопки (просмотреть, удалить и т. Д.).
Одна из этих сеток теперь содержит чуть более 700 записей. В Firefox 3.6 операция выбора в этой сетке ужасно медленная (около двух секунд); в других браузерах (даже IE 7 и 8) это не проблема. Я помещаю операторы console.log
в начало и конец функции выбора, а в Firebug они очень быстро появляются в конце задержки, предполагая, что не функция выбора замедляет процесс. Я использовал профилировщик в Firebug, и он говорит, что «createCallback
», который определен в одном из файлов сценариев «ScriptResource», сгенерированных ASP.NET, занимает огромное количество времени. Что такое createCallback
и почему он кажется таким медленным в Firefox 3.6? Это ошибка в FF, или это проблема, которую я могу решить?
ОБНОВЛЕНИЕ : Я, конечно, использую jQuery для добавления / удаления классов из строк. Я работал с jQuery 1.5.2 и jQueryUI 1.8.11, но я обновился до последней версии (1.6.2 и 1.8.14 в настоящее время) безрезультатно. Я попытался установить точку останова в createCallback
, чтобы увидеть, где он вызывается, и когда он прерывается, в стеке вызовов на несколько кадров переходит от removeClass
. Вот как выглядит стек в Firebug:
createCallback()
- в ScriptResource.axd? ......
wherever possible trim: trim ? function(text=" ")
- в jQuery
removeClass(value="selectedRow")
- в jQuery
removeClass(classNames="selectedRow", speed=undefined, easing=undefined, callback=undefined)
- в jQueryUI
selectionFunction()
- на моей странице .aspx
onclick
Я не понимаю, почему jQuery вызывает сгенерированную ASP.NET функцию, подобную этой.
ОБНОВЛЕНИЕ 2 : дальнейшее расследование предоставило еще больше деталей. Кажется, что эта функция «createCallback» получает название A LOT, когда я использую addClass
/ removeClass
, и это происходит как в Firefox 3.6, так и в Firefox 5. Я нашел ту же функцию в Chrome и установил для нее точку останова, и это вообще не вызывается, так что это похоже на Firefox. Я поставил точку останова на рассматриваемой функции / строке и выбрал строку, и точка останова получила ее 57 раз . Только первые два вовлекли меня, звоня removeClass
и addClass
; у остальных было createCallback
несколько раз в стеке вызовов, а иногда и BeginRequestEventArgs
. Я заметил, что он вызывается также при наведении указателя мыши на другие элементы jQueryUI на странице (вкладки), когда jQuery использует addClass
и removeClass
. Но почему он так часто вызывается, когда я работаю над элементами tr?
Я изменяю заголовок и теги, чтобы отразить реальную проблему.
UPDATE 3 : createCallback
вызывается примерно одинаковое количество раз, когда я выбираю строку в любой из сеток, даже если в ней всего 6 строк. Но в этом случае это не проблема производительности, и профилировщик показывает, что он занимает всего около 30% времени выполнения, тогда как при выборе профиля для таблицы большего размера это не менее 80%. Так что createCallback
, кажется, работает хуже, когда используется в контексте большего количества материалов, видимых на странице. Но все равно кажется, что jQuery не должен вызывать вызов createCallback
, тем более что я не мог вообще отследить какие-либо ссылки на него в поиске скриптов Firebug. И кажется, что он вызывается только в Firefox!
Обратите внимание, что все эти сетки находятся на одной странице, но одновременно видна только одна, потому что я использую вкладки jQueryUI.
ОБНОВЛЕНИЕ 4 : Мне удалось получить что-то похожее на jsFiddle в соответствии с просьбой.Смотрите здесь .В Firebug найдите createCallback
и установите точку останова (чуть ниже моего обработчика кликов в скрипте, где он начинается с Function.__typeName = "Function"; Function.__class = true; Function.createCallback = function (b, a)
и перезагрузите страницу. Я получаю много звонков.