【问题标题】:$(document).ready(function() {...}) runs before plugin script loads$(document).ready(function() {...}) 在插件脚本加载之前运行
【发布时间】:2010-06-05 00:37:45
【问题描述】:

我收到一个 JS 错误,因为我的 $(function () {...}) 处理程序似乎在加载必备插件脚本之前被触发。仅在 IE 中发生(在 IE7 中测试)。

我的<head> 中有一些 HTML,如下所示:

<script type="text/javascript" src="../resources/org.wicketstuff.jwicket.JQuery/jquery-1.4.2-special.js"></script>
...
<script type="text/javascript" id="noConflict"><!--/*--><![CDATA[/*><!--*/
jQuery.noConflict();
/*-->]]>*/</script>
...
<script type="text/javascript" src="../resources/com.csc.aims.wicket.components.collapsiblefieldset.CollapsibleFieldsetBehavior/jquery.collapsiblefieldset.js"></script>
<link rel="stylesheet" type="text/css" href="../resources/com.csc.aims.wicket.components.collapsiblefieldset.CollapsibleFieldsetBehavior/jquery.collapsiblefieldset.css" />
<script type="text/javascript">
jQuery(function(){
jQuery('#collapse119').collapse({"iconClosedUrl":"../resources/img/white_plus","iconOpenUrl":"../resources/img/white_minus"});
});
</script>

所以请注意,根据 HTML 代码,顺序如下:

  1. jquery-1.4.2-special.js
  2. jQuery.noConflict() 调用
  3. jquery.collapsiblefieldset.js //定义$.fn.collapse
  4. jQuery('#collapse119').collapse(...) 被调用

当这段代码在 FF 中运行时,一切正常。当我在 IE7(或 IE8 w/Compat。查看:IE7 标准模式)中测试它时,我收到一个 javascript 错误。调试器显示 jQuery.fn.collapse 未定义。

使用 IE8 开发工具,我尝试查看 jquery.collapsiblefieldset.js。我在列表中看到了该脚本,但该工具告诉我无法设置断点,因为该脚本未加载。

为什么 collapsiblefieldset.js 在我的 $() 就绪处理程序运行之前没有被加载?任何见解将不胜感激!谢谢。

【问题讨论】:

    标签: javascript jquery jquery-plugins internet-explorer-7 ready


    【解决方案1】:

    你正在使用

    $(function(){...});
    

    这是

    的同义词
    $(document).ready( function(){...} );
    

    你可以试试

    $(window).load( function(){...} );
    

    在页面加载序列的后期触发。

    【讨论】:

    • 谢谢!这似乎很有希望;我会在星期一试一试
    • 我误以为这是时间问题。我得到的错误掩盖了实际问题,这是有问题的外部 .js 文件中的语法错误。将命令脚本分配给窗口加载事件似乎暴露了潜在的问题。
    【解决方案2】:

    将所有脚本放在页面底部,就在&lt;/body&gt; 标记之前。

    如果这不能解决问题,请将似乎未及时加载的脚本移回&lt;head&gt;,并将其余脚本留在底部。

    【讨论】:

    • 我使用的 web 框架不允许我将它放在 的底部。我对其进行了更改,以便 collapsiblefieldset.js 位于 中,而 jQuery 就绪处理程序位于 body 中,位于定义小部件的位置。这似乎无法解决问题。
    • 另外,还有很多其他的脚本在这个页面上运行;其中最昂贵的发生在 $() 就绪处理程序中。不确定这是否相关。
    • 看起来您将不得不使用 IE8 中的开发人员工具来尝试调试 Javascript 代码。 coolwebdeveloper.com/2009/03/…
    • 我确实使用了 IE8 调试器,如原帖中所述。 =)
    【解决方案3】:

    对于遇到此问题的其他任何人,可能值得仔细检查一下您没有多次引用 jQuery。如果你在头部定义了插件,那么它们将被正文中的第二个 jQuery 调用覆盖。

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2010-12-11
      相关资源
      最近更新 更多