2009-04-24 17 views
1

JQueryを使用して、リンクをクリックして追加の入力フィールドを作成しています。現在のところ、ページ読み込み時に作成されたフィールドで正常に動作するオートコンプリートプラグインが実装されています。ユーザーが新しいフィールドを追加すると、オートコンプリートはその特定のフィールドでは機能しません。私は誰かが私にそれを働かせる方法を理解するのを助けることができるかどうか疑問に思っていただけです。JQueryで追加フィールドのオートコンプリート

<script type="text/javascript"> 
    $(document).ready(function() { 
     $('#addingredient').click(function() { 
      $('<li />').append('<input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" />') 
      .append('<input type="text" class="amount" name="amount[]" id="amount[]" size="5" />') 
      .append('<select class="unit" name="unit[]" id="unit[]"><?=$units ?></select>') 
      .appendTo('#ingredients') 
      .hide() 
      .fadeIn('normal'); 
     }); 
</script> 

<script> 
    $(document).ready(function(){ 
     var data = "http://mywebsite.com/ingredients.php"; 
     $(".ingredient").autocomplete(data); 
    }); 
</script> 


<ul id="ingredients"> 
    <li><input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" /><input type="text" class="amount" name="amount[]" id="amount[]" size="5" /><select class="unit" name="unit[]" id="unit[]"><?=$units ?></select></li> 
    <li><input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" /><input type="text" class="amount" name="amount[]" id="amount[]" size="5" /><select class="unit" name="unit[]" id="unit[]"><?=$units ?></select></li> 
    <li><input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" /><input type="text" class="amount" name="amount[]" id="amount[]" size="5" /><select class="unit" name="unit[]" id="unit[]"><?=$units ?></select></li> 
</ul> 
+0

使用tvanfossonの答え。 – Kezzer

答えて

3

新しい要素がDOMに追加された後で、その要素に対してオートコンプリートを再実行する必要があります。次の要素は、要素が色あせてしまうまで待ってから、新しい要素のオートコンプリートを正しいクラスで設定します。

<script type="text/javascript"> 
    var data = "http://mywebsite.com/ingredients.php"; 
    $(document).ready(function() { 
     $('#addingredient').click(function() { 
      $('<li />').append('<input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" />') 
      .append('<input type="text" class="amount" name="amount[]" id="amount[]" size="5" />') 
      .append('<select class="unit" name="unit[]" id="unit[]"><?=$units ?></select>') 
      .appendTo('#ingredients') 
      .hide() 
      .fadeIn('normal', function() { 
       $(this).find('.ingredient').autocomplete(data); 
      }); 
     }); 
     $(".ingredient").autocomplete(data); 
    }); 
</script> 
+0

私はちょうどURLデータをキャッシュするのを見なければなりません。 –

1

問題は、ページ読み込み時にオートコンプリートのみが初期化されることです。動的に追加された入力には追加されません。オートコンプリートをもう一度呼び出すことで、オートコンプリートもそれらに追加する必要があります。あなたが新しい入力をapendedた後、だから、再びオートコンプリート機能を呼び出す:

$(".ingredient").autocomplete(data); 
+0

私はそれを試み、それは動作しませんでした。 –

+0

または私はそれを間違って行ったかもしれません。 –

+0

正しく使用していなかったので「うまくいきませんでした」。他のコードは、それを使用する方法として明示しました。それが私がそれを受け入れた理由です。それはいずれの方法でも緊急電話でした。 –

2

を新しいものが作成される前にオートコンプリートをやっているので。自動的に適用するだけでなく、DOMの準備が整ったときにのみ行います。

<script type="text/javascript"> 

$(document).ready(function() { 
    $('#addingredient').click(function() { 
     $('<li />').append('<input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" />') 
     .append('<input type="text" class="amount" name="amount[]" id="amount[]" size="5" />') 
     .append('<select class="unit" name="unit[]" id="unit[]"><?=$units ?></select>') 
     .appendTo('#ingredients') 
     .hide() 
     .fadeIn('normal'); 

     var data = "http://mywebsite.com/ingredients.php"; 
     $('.ingredient').autocomplete(data); 
    }); 
} 

</script> 

代わりにお試しください。

+2

これは、新しい要素だけでなく、すべての要素に対してオートコンプリートを再実行します。それはおそらく大丈夫ですが、過度のことです。 – tvanfosson

+0

ええ、私はそれが私がやったことだと思っていた。それが少量であれば、ブラウザーに大きな負担をかけるべきではありません。 – Kezzer

+0

これは私の答えからどれくらい排他的に延期されていますか? (d03boyはそれが問題ではないとコメントしました) –

0

(不要なDOMのルックアップを防止する)tvanfossonで前の回答に改善:

<script type="text/javascript"> 
    var data = "http://mywebsite.com/ingredients.php"; 
    $(document).ready(function() { 
     $('#addingredient').click(function() { 
      var newIngredient = $('<input type="text" class="ingredient" name="ingredient[]" id="ingredient[]" size="60" />'); 
      $('<li />').append(newIngredient) 
       .append('<input type="text" class="amount" name="amount[]" id="amount[]" size="5" />') 
       .append('<select class="unit" name="unit[]" id="unit[]"><?=$units ?></select>') 
       .appendTo('#ingredients') 
       .hide() 
       .fadeIn('normal'); 
      newIngredient.autocomplete(data); 
     }); 
     $(".ingredient").autocomplete(data); 
    }); 
</script> 
関連する問題