最近、私は多くのモーダルウィンドウポップアップを実行しており、jQueryを使用しています。ページに新しい要素を作成するために使用した方法は、圧倒的に次のようなものです。
$("<div></div>");
しかし、これはこれを行うための最良または最も効率的な方法ではないという感覚を得ています。パフォーマンスの観点からjQueryで要素を作成する最良の方法は何ですか?
最近、私は多くのモーダルウィンドウポップアップを実行しており、jQueryを使用しています。ページに新しい要素を作成するために使用した方法は、圧倒的に次のようなものです。
$("<div></div>");
しかし、これはこれを行うための最良または最も効率的な方法ではないという感覚を得ています。パフォーマンスの観点からjQueryで要素を作成する最良の方法は何ですか?
回答:
私は$(document.createElement('div'));
ベンチマークを使用していますが、この手法が最も速いことを示しています。これは、jQueryがそれを要素として識別して要素自体を作成する必要がないためだと推測しています。
実際には、さまざまなJavaScriptエンジンを使用してベンチマークを実行し、その結果を聴衆に比較検討する必要があります。そこから決定を下します。
appendTo
...コメントが明らかに間違っていたので、私はそれらを削除しました。
個人的に私は(読みやすさのために)お勧めします:
$('<div>');
これまでの提案に関するいくつかの数字(safari 3.2.1 / mac os x):
var it = 50000;
var start = new Date().getTime();
for (i = 0; i < it; ++i) {
// test creation of an element
// see below statements
}
var end = new Date().getTime();
alert( end - start );
var e = $( document.createElement('div') ); // ~300ms
var e = $('<div>'); // ~3100ms
var e = $('<div></div>'); // ~3200ms
var e = $('<div/>'); // ~3500ms
jQueryを使用してHTML要素を作成する最も効率的な方法は何ですか?
それはそれについてですのでjQuery
、私はこの(クリーンな)アプローチを使用する方が良いと思います(あなたが使用しています)
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'text':'Text Only',
}).on('click', function(){
alert(this.id); // myDiv
}).appendTo('body');
このように、特定の要素のイベントハンドラーを使用することもできます。
$('<div/>', {
'id':'myDiv',
'class':'myClass',
'style':'cursor:pointer;font-weight:bold;',
'html':'<span>For HTML</span>',
'click':function(){ alert(this.id) },
'mouseenter':function(){ $(this).css('color', 'red'); },
'mouseleave':function(){ $(this).css('color', 'black'); }
}).appendTo('body');
ただし、多くの動的要素を扱う場合はhandlers
、特定の要素にイベントを追加するのを避け、代わりに、委任されたイベントハンドラーを使用する必要があります。
$(document).on('click', '.myClass', function(){
alert(this.innerHTML);
});
var i=1;
for(;i<=200;i++){
$('<div/>', {
'class':'myClass',
'html':'<span>Element'+i+'</span>'
}).appendTo('body');
}
そのため、同じクラス、つまり(myClass
)で何百もの要素を作成して追加すると、動的に挿入されたすべての要素に対してジョブを実行するハンドラーが1つしかないため、イベント処理に消費されるメモリが少なくなります。
更新:次のアプローチを使用して動的要素を作成できるため
$('<input/>', {
'type': 'Text',
'value':'Some Text',
'size': '30'
}).appendTo("body");
ただし、size
この方法を使用して、jQuery-1.8.0
または後で使用して属性を設定することはできません。ここに古いバグレポートがあります。この例をご覧ください。を使用jQuery-1.7.2
して、size
属性が30
上記の例を使用するように設定されていることを示しますが、同じ方法をsize
使用してjQuery-1.8.3
、ここで属性を設定することはできません。ある非稼働フィドル。したがって、size
属性を設定するには、次のアプローチを使用できます
$('<input/>', {
'type': 'Text',
'value':'Some Text',
attr: { size: "30" }
}).appendTo("body");
またはこれ
$('<input/>', {
'type': 'Text',
'value':'Some Text',
prop: { size: "30" }
}).appendTo("body");
私たちは、渡すことができattr/prop
、子オブジェクトとしてではなく、それはで動作するjQuery-1.8.0 and later
バージョンチェックこの例が、それは動作しませんでjQuery-1.7.2 or earlier
(すべての以前のバージョンでテストされていません)。
ちなみにjQuery
バグレポートから
いくつかの解決策があります。1つ目は、スペースを節約せず、コードをより明確にするため、まったく使用しないことです。
彼らは次のアプローチを使用することを勧めました(以前のも機能し、でテストされました1.6.4
)
$('<input/>')
.attr( { type:'text', size:50, autofocus:1 } )
.val("Some text").appendTo("body");
したがって、IMOというこのアプローチを使用することをお勧めします。この更新は、私がこの回答を読んだ/見つけた後に行われ、この回答では'Size'(capital S)
、'size'
、それ意志だけで作業罰金、でも中version-2.0.2
$('<input>', {
'type' : 'text',
'Size' : '50', // size won't work
'autofocus' : 'true'
}).appendTo('body');
propについても読みAttributes vs. Properties
ます。違いがあるため、バージョンによって異なります。
$('<div>', {...})
すべての属性を含むオブジェクトを渡し、属性$('<div>').attr({...})
なしで要素を作成しますが、attr()
後でメソッドを使用して属性を設定します。
jQuery.com
Webサイトの検索は、@ RafaelRuizTabaresまたはGoogleで役立つかもしれません:-)
最適な方法を使用していると思いますが、次のように最適化できます。
$("<div/>");
CPUの観点から見ると、ごくまれにしか実行されない操作のパフォーマンスをそのまま使用する必要はありません。
jQuery(html :: String)
メソッドの使用は完全に問題ありません。状況が極端に異常でない限り、知覚されるパフォーマンスが向上する可能性は低いでしょう。最適化のエネルギーを、それを使用できるケースに費やします。さらに、jQueryは多くの点で速度が最適化されています。それで正気なことを行い、信頼できるが検証して高速であることを確認します。
そもそもjQueryを使用する場合、要素作成のパフォーマンスの重要性は重要ではないことを理解する必要があります。
要素を実際に使用しない限り、要素を作成する実際の目的はないことに注意してください。
$(document.createElement('div'))
vsのようなパフォーマンステストを行い$('<div>')
、使用$(document.createElement('div'))
することでパフォーマンスを大幅に向上させたくなるかもしれませんが、それはまだDOMに含まれていない要素にすぎません。
ただし、結局のところ、とにかく要素を使用したいので、実際のテストにはf.exを含める必要があります。.appendTo();
次のことを互いにテストしてみてください。
var e = $(document.createElement('div')).appendTo('#target');
var e = $('<div>').appendTo('#target');
var e = $('<div></div>').appendTo('#target');
var e = $('<div/>').appendTo('#target');
結果が異なることに気づくでしょう。ある方法が他の方法よりも優れている場合があります。これは、コンピュータ上のバックグラウンドタスクの量が時間の経過とともに変化するためです。
したがって、結局のところ、要素を作成するための最小かつ最も読みやすい方法を選択する必要があります。そうすれば、少なくとも、スクリプトファイルは可能な限り小さくなります。おそらく、DOMで使用する前に要素を作成する方法よりも、パフォーマンスの点で重要な要素です。
document.getElementById('target).appendChild(document.createElement('div'));
誰かがすでにベンチマークを作成しています: jQuery document.createElement同等ですか?
$(document.createElement('div'))
大勝者です。
私はjquery.min v2.0.3を使用しています。私は以下を使用する方が良いです:
var select = jQuery("#selecter");
jQuery("`<option/>`",{value: someValue, text: someText}).appendTo(select);
次のように:
var select = jQuery("#selecter");
jQuery(document.createElement('option')).prop({value: someValue, text: someText}).appendTo(select);
最初のコードの処理時間は2番目のコードよりもはるかに短いです。