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


笔记:


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


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

最佳答案

与其假定将在第一个“就绪”处理程序中设置该值,不如让它处理自定义事件,然后从第二个文件触发该事件。

第一个档案:

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

09-26 13:11