Это может быть поздний ответ, но у проекта, над которым я работаю, была та же проблема, и приложение должно было работать в IE7, поэтому производительность была определенно не хорошей.Основная проблема заключается в том, что у вас есть много узлов на одном уровне, и мы имели дело с сотнями, если не с тысячей, вызывая всплывающее ужасное диалоговое окно запуска скриптов.
Недавно мы заменили использование dijit.Treeс нашей собственной реализацией дерева, находя дополнительную абстракцию резервного хранилища ненужной, так как сервер уже был уровнем абстракции данных.Следовательно, у нас есть сервер, который генерирует фрагмент HTML, используя div и span для представления структуры дерева и пользовательских атрибутов для связи данных для каждого узла.CSS используется для визуального форматирования данных.
Этот подход использует встроенную способность браузера обрабатывать HTML.Несколько подключений к событиям мыши и клавиатуры позволяют нам эффективно получать полную функциональность на основе дерева (включая всплывающие подсказки для узлов).Вот упрощенный пример типа HTML-структуры, которую генерирует наш сервер:
<div class="treeFolder">
<span class="treeFolderInd">+</span>
<span class="treeFolderLabel">Folder label</span>
<div class="treeFolderContent">
<div class="treeFolder">
<span class="treeFolderInd">+</span>
<span class="treeFolderLabel">Sub-folder</span>
<div class="treeFolderContent">
<div class="treeItem" my-action="doSomething"
my-data="{arg1:'hello', arg2:'world'"
my-tooltip="Goodbye">
<span class="treeItemInd">o</span>
<span class="treeItemContent">
Item text
</span>
</div>
<div class="treeItem" my-action="doSomethingElse"
my-data="{arg1:'foo', arg2:'bar'}"
my-tooltip="Another tip">
<span class="treeItemInd">o</span>
<span class="treeItemContent">
Item text
</span>
</div>
...
Имена классов используются для форматирования CSS.Различные атрибуты my- * - это пользовательские атрибуты, которые клиентская часть приложения использует для привязки действий, когда пользователь выбирает узел дерева.Мы используем строку JSON для представления в данных, поэтому dojo.fromJson () можно использовать для атрибута, чтобы получить данные, связанные с узлом (мы внутренне кэшируем объект, созданный с помощью узла DOM, поэтому метод fromJson () не должениспользоваться каждый раз, когда к данным обращаются.
Время загрузки значительно улучшилось, и теперь сам браузер занимает больше всего времени для анализа HTML, но это не хуже, чем загрузка большоговеб-страница. Как только HTML-данные загружены и мы зарегистрировали наши перехватчики событий, расширение узла с 5000 элементов выполняется довольно быстро. Мы просто переключаем настройку отображения CSS, чтобы разворачивать / сворачивать папки, поэтому вы в основном ограничены тем, как работает сам браузер..
Конечно, можно создавать альтернативные структуры для представления данных дерева, но я думаю, что вы поняли идею. Мы инкапсулируем основные функциональные возможности дерева в классе с некоторыми виртуальными событиями, которые представляют при нажатии на элементи другие действия дерева. Пользователь класса просто уses dojo.connect () для подключения к интересующим событиям дерева.
Примечание: создание экземпляров dijit.Tooltip для всех элементов стало существенным фактором снижения производительности.Чтобы обойти это, мы управляем отображением подсказок, используя dijit.showTooltip () и dijit.hideTooltip () непосредственно против создания экземпляров dijit.Tooltip.
Одна неприятная вещь для нас - это застревание в IE7.IE7 ухудшает общую производительность при работе с большими наборами данных, даже если в системе достаточно оперативной памяти.IE8 и IE9 значительно улучшены в этом отношении.