2009-05-26 3 views
2

То, что я пытаюсь сделать, чтобы сделать мой сайт, становится довольно сложным, некоторые из вещей, которые нужно сделать, занимают достаточно много времени, чтобы дать видимые задержки.Советы по оптимизации javascript

В основном, добавление контента в документ замедляет работу, а также анимацию jquery, которую я использую.

Я создаю элементы, используя document.createElement("div"), вместо того, чтобы просто делать document.write("<div id='someId'></div>"), а анимация - это настраиваемая анимация с использованием .animation();

Мне интересно, как я могу продолжать добавлять контент, поскольку я только предотвращаю замораживание браузера каждый раз, когда я хочу что-то добавить.

Любые предложения для ускорения работы, поэтому есть меньше задержки? Советы по тому, что следует избегать в программировании на JavaScript, что дает увеличенную задержку, было бы действительно полезно.

ответ

3

Это звучит, как вы хотите, чтобы улучшить производительность DOM взаимодействия, а не JavaScript, поэтому в том же духе:

  • Да, document.write плохо, он блокирует дополнительные нагрузки (любой JS выполнения перед вашими страницами закончил загрузку, в основном требует остановки всей остальной обработки - современные браузеры, такие как Safari (и прокси-сервер Chrome), и Firefox выполняют определенную предварительную загрузку контента, чтобы предотвратить блокировку загрузки, но последующее разрешение по стилю и т. д. в основном блокируется.
  • document.createElement - это, в общем, лучшее решение, хотя их некоторые случаи, когда просто манипулирование innerHTML на элементе может быть быстрее - но это еще не совместимо с браузером (я думаю, что innerHTML не существует до Firefox 3.5), а характеристики выполнения сложны.
  • Уменьшите объем контента, который вы загружаете изначально - например. если у вас много контента (или контента, требующего больших сценариев), попытка отложить загрузку до завершения загрузки начальной страницы.
  • О, для анимаций вы должны посмотреть анимацию CSS, и они работают намного лучше, чем любые реализации JS, но они присутствуют только в Safari (и через прокси-сервер Chrome) и Firefox 3.5 - определенно не в IE :-(

с точки зрения производительности JavaScript, избежать with и геттеры/сеттеры, как чумы, и вы должны быть хорошо в большинстве современных реализаций JS.

+0

Насколько геттеры/сеттеры препятствуют работе? То, как меня научили программировать, не должно просто оставлять переменные общедоступными, но я думаю, что если геттеры и сеттеры занимают много вычислительной мощности, то это может стоить жертвы ... – 2009-05-26 03:09:23

+0

innerHTML определенно существует в Firefox 3.0.4 и более поздних версиях , а также в Safari 3. Я использовал его. Несмотря на то, что он очень хорошо не может быть лучшим кросс-платформенным методом манипуляции, он не настолько ограничен, как вы думаете. –

+0

@A. Леви: Может, я думал о innerText? @Matt: используйте функцию, а не функции приемника/сеттера ECMAScript. Getters и seters побеждают кэширование свойств и приводят к неожиданному вызову функции, который катастрофически влияет на производительность - например, в Safari4, я считаю, что getters/setters примерно в 10 раз медленнее обычного вызова функции. – olliej

1

JQuery отлично подходит для манипулирования DOM. Я принимаю бы взглянуть на их код, чтобы получить некоторые идеи. Или, видя, как я ленив, я просто использую их вещи.

В одном из подкастов Джеффа Этвуда упоминалось, что вам нужно будет сходить с ума, чтобы написать свой собственный javascript ... после использования JQuery мне придется согласиться с ним.

0

Что удивляет большинство людей, так это то, что использование innerHTML - это самый быстрый способ манипулировать DOM.

Например, вы можете увидеть один из эталонов here.

+0

он целиком и полностью зависел от используемого варианта, используемый движок (IE имеет ужасно медленный DOM реализация), а длина кода в html-модифицирующем innerHTML требует, чтобы вся строка была переписана, и dom был реконструирован. Если в строке много элементов, или если строка длинная, то изменение innerhtml будет медленнее. Также, если вы держите ссылки на элементы в блоке innerHTML, эти элементы будут оставаться вокруг, но не будут ссылаться на новые узлы, созданные на их месте. – olliej

+0

Другие элементы в InnerHTML означают больше элементов для создания, также если вы хотите использовать «предпочтительные» методы DOM. Не уверен, что вы правы в этом вопросе. Что касается других проблем ... Никогда не говорил, что это идеальное решение, просто самое быстрое.Я столкнулся со многими случаями, когда было удобнее использовать innerHTML (вы должны признать, что innerHTML - это самый прямой путь). –

+0

Дело я делал то, что innerHTML не всегда быстро - если у вас есть кусок HTML, '

  • ...
  • ...
  • ...' если добавить HTML в конец список с foo.innerHTML + = "
  • " + текст + "
  • ". Двигатель должен повторить всю строку и восстановить DOM для всего этого, поэтому синтаксический анализ не является бесплатным, создание элементов не является бесплатным, есть момент, когда добавление нового элемента, созданного dom, происходит быстрее, чем добавление к innerHTML , и если вы хотите ссылаться на элементы в списке, то изменение innerHTML потребует повторного получения этих элементов. – olliej

    1

    Хотя я большой поклонник JQuery, и это делает разработку гораздо проще, обратите внимание, что заявление JQuery (или в любой библиотеке JavaScript) будет никогда не быть столь же быстро, как и его смыслового эквивалента в простом JavaScript из-за дополнительных накладные расходы.

    Это, как говорится, это мои ссылки goto, когда я хочу ускорить мой JavaScript.

    http://home.earthlink.net/~kendrasg/info/js_opt/

    http://www.miislita.com/searchito/javascript-optimization.html

    3

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

    Если вам нужно добавить большое количество элементов в DOM и не хотите использовать innerHTML, чтобы это сделать, вы можете ускорить это, полагаю, сначала добавив элементы в документFragment, а затем введя documentFragment все в один раз в DOM. Я помню, как читал, что инъекция DOM является самой медленной частью использования стандартного API для создания и добавления элементов. documentFragment позволяет вам вставлять все его содержимое в DOM за один раз, устраняя большой объем накладных расходов, вызванный одновременным вызовом appendChild или других методов вставки. appendChild и другие методы вставки, предположительно, не страдают теми же затратами при вставке в документFragment, противоположный вложению в DOM. Мне жаль, что я не могу найти статью, которую я прочитал, поскольку у нее были действительно хорошие тесты и объяснения. Я уверен, что вы можете найти дополнительную информацию, выполнив некоторые поисковые запросы.

    Как всегда, какой метод использовать должен определяться путем тестирования на индивидуальной основе. В конце концов вы, вероятно, узнаете, какой из них использовать на основе структуры элементов, количества и использования.

    PS. Там могут быть проблемы со стилями и documentFragment, но я не могу вспомнить, что было сказано о них, так как это могло бы быть что-то заслуживающее проверки.

    +0

    Спасибо за ответ, и добро пожаловать в SO :) –

    1

    Существует функция фрагмента документа, которая может сделать жизнь намного проще. Вот пример использования.

    function appendDivs(element){ 
        var fragment = document.createDocumentFragment(); 
        for(var i=0;i<10;i++){ 
         var div = document.createElement("div"); 
         fragment.appendChild(div);   
        } 
        element.appendChild(fragment); 
    } 
    

    Для полной ссылки, вы можете увидеть это post на моем блоге.

    0
    // Some functions for easier coding in DOM 
    
    function createEl(el){ 
        return document.createElement(el); 
    } 
    function addElBody(el){ 
        return document.body.appendChild(el); 
    } 
    
    function addElChild(el, child){ //el- parent 
        return el.appendChild(child); 
    } 
    // Example : 
    var container=createEl('div'); 
    container.setAttribute('id', 'container'); 
    addElBody(container); 
    
    var item=createEl('ul'); 
    item.setAttribute('id', 'list'); 
    addElBody(item); 
    addElChild(container, item); 
    
    Смежные вопросы