When it’s ready.

出来るまで出来ない

ちょっとしたJS

良くやる事だが、毎回やり方忘れてしまうのでメモ

空っぽの要素に、JSONで渡された情報をもとにひたすら要素を詰め込むやり方

[[1,2,3],['a','b','c'],['x','y','z']]

みたいなJSONがあったとして

<div id='hoge'>
<input type='text' value='1'/>
<input type='text' value='2'/>
<input type='text' value='3'/>
<br>
<input type='text' value='a'/>
<input type='text' value='b'/>
<input type='text' value='3'/>
<br>
<input type='text' value='x'/>
<input type='text' value='y'/>
<input type='text' value='z'/>
<br>
</div>

とやりたい

Pythonで書くと

data = [[1,2,3],['a','b','c'],['x','y','z']]
tag = "<input type='text' value='%s' />"
res = '<br>'.join([tag%str(i) for ii in data for i in ii])

こんな感じのやつが欲しい。

JSで書くと

駄目なパターン

data=[[1,2,3],['a','b','c'],['x','y','z']]
$.each(data, function(i, val) {
  $.each(val, function(ii, val2) {
    $('#result').html($('#result').html() + 
      '<input type="text" value=' + val2 + '/>');
    });
  $('#result').html($('#result').html() + '<br>');
  });
});

これがめっちゃおそい。10x20の要素が入ったJSONを渡すと5.4秒くらいかかる。(Firefox3.6, C2D2.4GHz)
生成する度に、描画を行っていることと、追加する度に既存の要素を全体から探してくるかららしい。

モン様に教わったコード
速いパターン

data=[[1,2,3],['a','b','c'],['x','y','z']]
$.each(data, function(i, val) {
  $.each(val, function(ii, val2) {
    $('<input/>',{type:'text',id:row+col,value:val2}).appendTo('#result');
    });
  $('<br>').appendTo('#result'); 
  });
});

これで激速になった。

要素に追加するには

$('追加したいもの').appendTo('#追加先')

とやれば良く、追加したいものを色々便利に作成するには

$('<input/>', {type:'text', id:'hoge', value:'123'})

とやれば色々指定済みのオブジェクトを作成することが出来る。
ありがたやです。