нет, второй не имеет идентификатора, поэтому тот же текст не будет выводиться.
Мэтт Эллен
.html намного быстрее после первого запуска. Это может занять секунду или около того, когда вы запускаете его в первый раз.
Sukhjit Dhot
Ответы:
316
Всякий раз, когда вы передаете строку HTML любому из методов jQuery, вот что происходит:
Временный элемент создан, назовем его х. x innerHTMLустановлен на строку HTML, которую вы передали. Затем jQuery перенесет каждый из созданных узлов (то есть х childNodes) во вновь созданный фрагмент документа, который затем будет кешироваться в следующий раз. Затем он вернет фрагмент childNodesкак свежую коллекцию DOM.
Обратите внимание, что на самом деле все намного сложнее, так как jQuery выполняет несколько кросс-браузерных проверок и различные другие оптимизации. Например, если вы перейдете просто <div></div>к jQuery(), JQuery будет использовать ярлык и просто сделать document.createElement('div').
РЕДАКТИРОВАТЬ : Чтобы увидеть огромное количество проверок, которые выполняет jQuery, посмотрите здесь , здесь и здесь .
innerHTMLкак правило, более быстрый подход, хотя не позволяйте этому управлять тем, что вы делаете все время. Подход jQuery не так прост, как element.innerHTML = ...- как я уже упоминал, происходит множество проверок и оптимизаций.
Правильная техника сильно зависит от ситуации. Если вы хотите создать большое количество идентичных элементов, то последнее, что вы хотите сделать, это создать массивный цикл, создавая новый объект jQuery на каждой итерации. Например, самый быстрый способ создать 100 делений с помощью jQuery:
jQuery(Array(101).join('<div></div>'));
Есть также проблемы читабельности и обслуживания, которые необходимо учитывать.
JQuery (Array (101) .join ( '<DIV> </ DIV>')); <- почему 101 вместо 100?
Таконе
2
Просто хотел добавить точку данных. Провести некоторое тестирование производительности в приложении, которое загружает большую (10K +) партию <li> в <ul> и видит увеличение времени рендеринга (не загрузки) с ~ 12 с -> .25 с переключением .append ( iantListHTMLAsASingleString) в .html (iantListHTMLAsASingleString). Если вы уже выполняете трюк 'join' или создаете большую html-строку в своем списке, в этих двух методах определенно есть результат diff.
omnisis
9
@tacone Потому что соединение "клей" применяется между элементами массива. 101будет иметь 100 клеев применяются, так же , как присоединение 3 элемента будет иметь 2 клеев: EL-glue-EL-glue-EL. В примере Джеймса элементы массива «пустые», поэтому объединение N пустых элементов приводит к N-1 последовательным склейкам.
Существует большая разница в том, что он теряет все данные, которые были прикреплены к доменам.
Адриан Варфоломей
68
Они не одинаковы. Первый заменяет HTML, не создавая сначала другой объект jQuery. Второй создает дополнительную оболочку jQuery для второго элемента div, а затем добавляет его к первому.
var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').html(mySecondDiv);var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').append(mySecondDiv);
У вас есть несколько вариантов использования. Если вы хотите заменить контент, .htmlэто отличный вызов, так как его эквивалент innerHTML = "...". Однако, если вы просто хотите добавить контент, дополнительный $()набор обёрток не требуется.
Используйте только две оболочки, если вам нужно манипулировать добавленным divпозже. Даже в этом случае вам все еще может понадобиться только один:
var mySecondDiv = $("<div id='mySecondDiv'></div>").appendTo("#myDiv");// other code here
mySecondDiv.hide();
Кроме того, первый, очевидно, будет иметь идентификатор mySecondDiv, в то время как другой не будет иметь идентификатора. И синтаксис должен быть .html ("<div id = 'mySecondDiv'> </ div>") с использованием двойных кавычек, чтобы можно было использовать одинарные кавычки.
рянулит
9
Ну, .html()использует, .innerHTMLкоторый быстрее, чем создание DOM .
Это крайне неэффективный (и неработающий) код jQuery. Если вы хотите избежать объединения, сделайте это: (также примечание pxне требуется):$('<div />', { width: myWidth }).appendTo("#myDiv");
Дуг Нейнер
3
Как это "не полезно"? На плакате спрашивалось «разница» (ключевое слово «против»), поэтому я говорю ему разницу. Кодекс многословен, но я бы не сказал «неэффективно» только потому, что это не один вкладыш. Разве мы не должны быть многословны, когда объясняем вещи людям?
Это означает, что вы хотите автоматически добавить еще одну загрузку файла, если какие-либо файлы были загружены, упомянутый код не будет работать, потому что после загрузки файла первый элемент загрузки файла будет воссоздан и, следовательно, загруженный файл будет удален из него. , Вместо этого вы должны использовать .append ():
function changed(){if(isAllowed){var tmpHTML ="<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
$('#test').append(tmpHTML);
isAllowed =false;}}
Это случилось со мной. Версия Jquery: 3.3. Если вы просматриваете список объектов и хотите добавить каждый объект как дочерний элемент некоторого родительского элемента dom, то .html и .append будут вести себя очень по-разному. .htmlзакончится добавлением только последнего объекта к родительскому элементу, тогда как .appendвсе объекты списка будут добавлены как дочерние элементы родительского элемента.
Ответы:
Всякий раз, когда вы передаете строку HTML любому из методов jQuery, вот что происходит:
Временный элемент создан, назовем его х. x
innerHTML
установлен на строку HTML, которую вы передали. Затем jQuery перенесет каждый из созданных узлов (то есть хchildNodes
) во вновь созданный фрагмент документа, который затем будет кешироваться в следующий раз. Затем он вернет фрагментchildNodes
как свежую коллекцию DOM.Обратите внимание, что на самом деле все намного сложнее, так как jQuery выполняет несколько кросс-браузерных проверок и различные другие оптимизации. Например, если вы перейдете просто
<div></div>
кjQuery()
, JQuery будет использовать ярлык и просто сделатьdocument.createElement('div')
.РЕДАКТИРОВАТЬ : Чтобы увидеть огромное количество проверок, которые выполняет jQuery, посмотрите здесь , здесь и здесь .
innerHTML
как правило, более быстрый подход, хотя не позволяйте этому управлять тем, что вы делаете все время. Подход jQuery не так прост, какelement.innerHTML = ...
- как я уже упоминал, происходит множество проверок и оптимизаций.Правильная техника сильно зависит от ситуации. Если вы хотите создать большое количество идентичных элементов, то последнее, что вы хотите сделать, это создать массивный цикл, создавая новый объект jQuery на каждой итерации. Например, самый быстрый способ создать 100 делений с помощью jQuery:
Есть также проблемы читабельности и обслуживания, которые необходимо учитывать.
Это:
... намного сложнее поддерживать, чем это:
источник
101
будет иметь 100 клеев применяются, так же , как присоединение 3 элемента будет иметь 2 клеев:EL-glue-EL-glue-EL
. В примере Джеймса элементы массива «пустые», поэтому объединение N пустых элементов приводит к N-1 последовательным склейкам.Они не одинаковы. Первый заменяет HTML, не создавая сначала другой объект jQuery. Второй создает дополнительную оболочку jQuery для второго элемента div, а затем добавляет его к первому.
Один JQuery Wrapper (за пример):
Два jQuery Wrappers (за пример):
У вас есть несколько вариантов использования. Если вы хотите заменить контент,
.html
это отличный вызов, так как его эквивалентinnerHTML = "..."
. Однако, если вы просто хотите добавить контент, дополнительный$()
набор обёрток не требуется.Используйте только две оболочки, если вам нужно манипулировать добавленным
div
позже. Даже в этом случае вам все еще может понадобиться только один:источник
если
.add
вы имеете в виду.append
, то результат тот же, если#myDiv
пуст.производительность одинакова? не знаю
.html(x)
в конечном итоге делает то же самое, что и.empty().append(x)
источник
Ну,
.html()
использует,.innerHTML
который быстрее, чем создание DOM .источник
Вы можете получить второй метод для достижения того же эффекта:
Лука упомянул, что
html()
просто вставляет HTML, что приводит к более высокой производительности.В некоторых случаях вы бы выбрали второй вариант, рассмотрите:
источник
px
не требуется):$('<div />', { width: myWidth }).appendTo("#myDiv");
.html()
заменит все..append()
просто добавлю в конце.источник
Кроме данных ответов, в случае, если у вас есть что-то вроде этого:
Это означает, что вы хотите автоматически добавить еще одну загрузку файла, если какие-либо файлы были загружены, упомянутый код не будет работать, потому что после загрузки файла первый элемент загрузки файла будет воссоздан и, следовательно, загруженный файл будет удален из него. , Вместо этого вы должны использовать .append ():
источник
Это случилось со мной. Версия Jquery: 3.3. Если вы просматриваете список объектов и хотите добавить каждый объект как дочерний элемент некоторого родительского элемента dom, то .html и .append будут вести себя очень по-разному.
.html
закончится добавлением только последнего объекта к родительскому элементу, тогда как.append
все объекты списка будут добавлены как дочерние элементы родительского элемента.источник