2011-02-28 4 views
1

ユーザーがselectの値を変更すると、選択された値が他の同様の選択(同じCSSクラス)にコピーされます。彼らはすでに価値がありません。以下を行うより効率的な方法がありますか?少なくともIE7ではちょっと動かない。jQueryを使用した効率的なコピーダウン

$('.selectclass').change(function() { 
    if ($(this).val() != '') { 
    var baseElem = $(this); 
    $('.selectclass:gt(' + $('.selectclass').index(this) + ')').each(function (i) { 
     if ($(this).val() == '') { 
     $(this).val(baseElem.val()); 
    } 
    }); 
    } 
}); 

答えて

2

これは、より良い最適化する必要があります。

$('input.selectclass').change(function(){ 
    if (this.value !== '') { 
     var newVal = this.value, 
      boxes = $('input.selectclass'); 

     boxes.slice(boxes.index(this)).val(function(i, oldVal) { 
      return oldVal === '' ? newVal : oldVal; 
     }); 
    } 
}); 

NBこれはテストされていません。あなたはそれがより簡単に試験することができる(例えばjsfiddle)HTMLのサンプルを提供することができれば...ここに作ら

効率:

  • input.selectclassを使用して、特にInternet Explorerの
  • で、.selectclassよりも高速でなければなりませんそれはthis.valueを用いなく
  • 新しいjQueryのインスタンスを作成valの作り付けのコールバックシグネチャを使用してではなく、目をやっ
  • セレクタをキャッシュするのではなく再利用しますe手動でループするeach
+0

"this.value"は "select"要素で動作しますか? – GriffeyDog

+0

@GriffeyDog [はい。](http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-59351919) – lonesomeday

+0

実際にパフォーマンスが向上しました。ありがとう。 – GriffeyDog

0

これらはすべて同じクラスなので、foreachが必要ですか?

$('.selectclass').change(function() { 
$('.selectclass').val($(this).val()) 
} 
+0

変更はページのみで、それらのすべて、*以降の*インスタンスにない影響を与えることになっています。 – Pointy

+0

@Pointy正しいです – GriffeyDog

0
$('.selectclass').change(function() { 
    if ($(this).val() != '') { 
    $('.selectclass:gt(' + $('.selectclass').index(this) + ')').not(':empty').val($(this).val()) 
    } 
}); 
+0

注:テストされていません。 – FatherStorm

+0

提案していただきありがとうございます。私は明日仕事に戻ってきます。 – GriffeyDog

0

あなたは<select>要素ツリーの下の次の兄弟を一致させるためにnextAll()を使用することができます。

$(".selectclass").change(function() { 
    var origin = $(this); 
    var value = origin.val(); 
    if (value !== "") { 
     origin.nextAll(".selectclass").each(function() { 
      var $this = $(this); 
      if ($this.val() === "") { 
       $this.val(value); 
      } 
     }); 
    } 
}); 
+0

提案していただきありがとうございます。私は明日仕事に戻ってきます。 – GriffeyDog

関連する問題