1

HTML:

<div id="fields">
    <input type="text" name="someField" />
    <!-- NOTE: There are some more fields here -->
</div>
<!-- NOTE: There are some more fields here -->

最初の JS ファイル:

jQuery(document).ready(function($) {
    alert($('#fields input[type="text"]').val());
});

2 番目の JS ファイル:

jQuery(document).ready(function($) {
    $('#fields input[type="text"]').val('someValue');
});

ノート:

  1. JS ファイルは head タグ内にあります。
  2. 2 番目の JS ファイルに入力値を設定する必要があります。
  3. Firefox、Opera、Chrome、Safari で動作します。
  4. IE7 および IE8 は空の値を返します。

どんな助けでも大歓迎です!ありがとうございました!

4

1 に答える 1

6

値が最初の「準備完了」ハンドラーに設定されていると想定する代わりに、カスタムイベントを処理するようにしてから、2番目のファイルからそのイベントをトリガーします。

最初のファイル:

jQuery(function($) {

   $('#fields input[type="text"]').on('value-ready', function() {
      alert(this.value);
   });

});

2番目のファイル:

jQuery(function($) {
  $('#fields input[type="text"]').val("whatever").trigger('value-ready');
});

ちょっと待ってください...これは同じ問題を抱えています:-)ちょっと待ってください、そして私はそれを修正します...そして私がそうするまで私を賛成するのをやめます:-)

私が正しいと仮定すると、問題は「準備完了」ハンドラーの評価の順序に依存していると仮定します(これは本質的に「コードの臭い」の推測です。他の問題がある可能性があります)、私が行った変更は実際にはありませんヘルプ。2番目のブロックが最初に実行される場合、イベントハンドラーは設定されていません。

順序付けを課す唯一の実際の方法は、ある種の「約束」システムを設定するか、要素にマーカーとハンドラーを使用することだと思います。このようにして、最初のブロックのコードは、値の割り当てがすでに行われているかどうかを確認できます。それは少し不格好ですが、少なくともそれは明白です:

jQuery(function($) {
  var input = $('#fields input[type="text"]');
  if (input.data('value-ready'))
    alert("value already set: " + input.val());
  else
    input.on('value-ready', function() {
      alert("value is now set: " + input.val());
    });
});

次に、2番目のファイルで:

jQuery(function($) {
  $('#fields input[type="text"]').val("whatever")
    .data("value-ready", true)
    .trigger("value-ready");
});
于 2012-06-06T13:32:22.793 に答える