• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:option要素の移動が遅い)

option要素の移動が遅い

このQ&Aのポイント
  • SELECTボックスのoption要素を移動させるスクリプトの処理が遅くなっており、問題が発生しています。
  • 特に、ボックス内に1万件以上のデータがあり、その中から1000件以上のデータを移動させる場合に遅さが顕著になります。
  • 重複チェックのために移動先のリストを順番に確認しているため、処理が重くなっている可能性があります。より高速な処理方法を探しています。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

助言をいただきました。(HTML(5)なら) (関数Cは必要ないよ。) う~~~ん、プチほれぼれする。 function moveSelectedOption (a, b) {  Array.prototype.push.apply(b.options,   Array.prototype.slice.call (a.querySelectorAll ('option:checked'), 0)   .filter (B, Array.prototype.reduce.call (b.options, A, {}))); } document はグローバルなので…。

その他の回答 (3)

回答No.3

蛇足。 300ミリ秒に100個づつ追加しているので、見た目(だけ)が早いかも? function moveSelectedOption (a, b) {  var tm = 300;//ms  var ct = 100;//n  var op = Array.prototype.slice.call (a.querySelectorAll ('option:checked'), 0)   .filter (B, Array.prototype.reduce.call (b.options, A, {}))  var len = op.length;  var i = 0;  function LOOP () {   for (var o, cnt = ct; cnt--; i++)    if (o = op[i])     b.appendChild (o);    else     break;      if (i < len)    setTimeout (LOOP, tm);  };  LOOP (); }

ginfix
質問者

お礼

ありがとうございます! 参考にさせていただいております。 後出しで申し訳ないのですが、サブミットを発動させたくないので、ボタンのオンクリックに仕込んでみました。 しかし、var d = document;でうまいことHTMLオブジェクトが取れないようです(ローカルだと上手くいくけど、サーバに持ってくとダメなので、サーバの設定の問題…?)。 ちょっと悩んでみます…。

回答No.2

option.value が無い場合など考慮してません。 <!DOCTYPE html> <meta charset="utf-8"> <title></title> <body> <form action="#" onsubmit="check(event)"> <select id="a" multiple>  <option value="a1">移動されない</option>  <option value="b2">サンプル2</option>  <option value="c3">サンプル3</option> </select> <select id="b" multiple>  <option value="a1">サンプル1</option>  <option value="a2">サンプル2</option>  <option value="a3">サンプル3</option> </select> <input type="submit" value="test"> <script> function A (a, op) {  a[op.value] = op.text;  return a; } function B (op) {  return ! this.hasOwnProperty (op.value); } function C (op) {  this.appendChild (op); } function moveSelectedOption (a, b) {  Array.prototype.slice.call (a.querySelectorAll ('option:checked'), 0)   .filter (B, Array.prototype.reduce.call (b.options, A, {}))   .forEach (C, b); } function check (e) {  var d = document;  moveSelectedOption (d.querySelector('#a'), d.querySelector('#b'));  return e.preventDefault(); } </script>

回答No.1

>もっと処理を早くする方法 jQuery を使う時点で、どうかと思うけど $("#" + from + " option:selected") これは、変数に代入して活用すべき。(三回も呼び出している) それを行ったとしても早くなりそうにないけれど

関連するQ&A