【问题标题】:Do something once jQuery plugin has loaded加载 jQuery 插件后执行某些操作
【发布时间】:2011-09-26 21:40:12
【问题描述】:

我正在将jQueryjQuery UI 动态加载到页面中,我需要知道jQuery UI 何时成功扩展jQuery

目前我正在使用加载jQuery UI 的脚本元素的readystate 来触发我的代码的运行,但我认为此时脚本已加载,但jQuery UI 没有t 已正确初始化。

在定义 $.ui 之前是否是唯一的轮询选择?

这是我目前正在处理的代码:

(load_ui = (callback) ->
    script2 = document.createElement("script")
    script2.type = "text/javascript"
    script2.src = "http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.js"
    script2.onload = script2.onreadystatechange = ->
      console.log 'readystate:', @readystate
      if @readystate == "loaded" or @readystate == "complete"
        console.log "jquery ui is loaded"
        callback ($ = window.jQuery).noConflict(1), done = 1
        $(script,script2).remove()
    document.documentElement.childNodes[0].appendChild script2
    console.log 'jquery ui script element appended to page'
(window, document, req_version, callback, $, script, done, readystate) ->
  if not ($ = window.jQuery) or req_version > $.fn.jquery or callback($)
    console.log "begin loading jquery"
    script = document.createElement("script")
    script.type = "text/javascript"
    script.src = "http://ajax.googleapis.com/ajax/libs/jquery/" + req_version + "/jquery.min.js"
    script.onload = script.onreadystatechange = ->
      if not done and (not (readystate = @readyState) or readystate == "loaded" or readystate == "complete")
        console.log "jquery is loaded, now loading jquery ui"
        load_ui(callback)        

    document.documentElement.childNodes[0].appendChild script
    console.log 'jquery script element appended to page'
) window, document, "1.6.1", ($, L) ->
    console.log $
    console.log $.ui.version

由于某种原因,jquery ui 脚本元素的 readystate 只是返回 undefined。

【问题讨论】:

  • 我会说丑陋在于代码..

标签: javascript jquery jquery-ui jquery-plugins coffeescript


【解决方案1】:
<script src="jquery ui"></script>
<!-- jQuery UI has been initialized -->
<script src="my source"></script>

【讨论】:

  • 我没有从外部源加载我的脚本,只有 jquery 和 jquery ui 在外部加载。
  • OP 提到他们正在动态加载 jQuery 和 jQuery UI。我认为这意味着它们不包含在 &lt;script&gt; 中,而是由其他 javascript 加载。
  • 我通过在文档中插入脚本标签来加载它们,并在加载它们时运行我的代码。 (至少这是我正在尝试做的)
【解决方案2】:

我在某个项目中使用了此代码,以确保某些脚本按顺序运行。它在 IE 上不起作用(而且我没有时间调试),但在其他一切上都可以正常工作。

var node = document.createElement("script");
$.extend(node, {
    type: 'text/javascript',
    charset: 'utf-8',
    async: false,
    defer: true,
    src: /*...*/
});
$(node).bind('load', loadedCallback);
$('head')[0].appendChild(node);

【讨论】:

  • 如何在不插入 DOM 的情况下加载资源?
  • @Acorn:你不能,我记错了那部分。查看更新的答案(我没有完成的异步加载器;可能需要对 IE 兼容性进行一些调整)。
【解决方案3】:

我认为这将完全满足您的需要,尽可能多地添加更多依赖项。

(function () {
        function getScript(url, success) {
            var script = document.createElement('script');
            script.src = url;

            var head = document.getElementsByTagName('head')[0];
            var completed = false;
            script.onload = script.onreadystatechange = function () {
                if (!completed && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) {
                    completed = true;
                    success();
                    script.onload = script.onreadystatechange = null;
                    head.removeChild(script);
                }
            };
            head.appendChild(script);
        }

        getScript("Scripts/jquery-1.6.1.js", function () {
            getScript("Scripts/jquery-ui-1.8.11.js", function () {
                alert($.ui);
            });
        });
})();

测试 IE7、IE8、IE9、Firefox、Safari、Chrome 和 Opera

【讨论】:

  • 不错的解决方案!只有一个问题:为什么在加载时从head 中删除script?它有什么变化?
  • 它在大多数页面上都非常好用,但在维基百科页面上却不行。你能让它在维基百科上工作吗?谢谢。
  • for success() 我总是在 Chrome:Uncaught TypeError: undefined is not a function 中收到这条消息。为什么我会收到此消息?
猜你喜欢
  • 1970-01-01
  • 2012-02-14
  • 2014-06-18
  • 1970-01-01
  • 2020-01-18
  • 2015-10-24
  • 2023-03-03
  • 1970-01-01
  • 2011-03-19
相关资源
最近更新 更多