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());
});

第二个 JS 文件:

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

笔记:

  1. JS 文件位于 head 标签内。
  2. 我被迫在第二个 JS 文件中设置输入值。
  3. 它适用于 Firefox、Opera、Chrome、Safari。
  4. IE7 和 IE8 返回一个空值。

任何帮助表示赞赏!谢谢!

4

1 回答 1

6

不要假设该值已在您的第一个“就绪”处理程序中设置,而是使其处理自定义事件,然后从第二个文件触发该事件。

第一个文件:

jQuery(function($) {

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

});

第二个文件:

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

等一下......这有同样的问题:-)等一下,我会解决它......在我这样做之前不要再给我投票了:-)

好吧,假设我是对的,这个问题取决于“就绪”处理程序的评估顺序(这本质上是“代码味道”的猜测;可能还有其他问题),我所做的改变不会真的帮助。如果第二个块首先运行,那么事件处理程序将不会被设置!

我认为强制排序的唯一真正方法是设置某种“承诺”系统,或者简单地在元素上使用标记以及处理程序。这样,第一个块中的代码可以检查值分配是否已经发生。这有点笨拙,但至少它是明确的:

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());
    });
});

然后在第二个文件中:

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