javascript - 通过 <script> 在书签中加载 jQuery 和 jQueryUI 时出现范围或计时问题?

标签 javascript jquery scope bookmarklet timing

编辑:更新了详细信息以添加 Firefox/Chrome 行为的差异

我正在尝试创建一个可以加载 jQuery 和 jQueryUI 的书签。 jQuery 加载使用 javascript,但我想既然 jQuery 已加载,我会继续使用它来加载 UI。 除了让它工作之外,我真的很想了解为什么这不起作用。我仍然在思考范围/闭包/等问题。但我只是不明白为什么在 Firefox 中 $ 不起作用,而“jQuery”却起作用! $ 在 Chrome 中工作正常,但我在那里遇到了不同的问题。

注释:
1) 在 FireBug/FireFox 中,我得到 '$("head") 未定义'
2) 在 Chrome 中,“$”工作正常,但 jQueryUI 调用失败,对象 [object Object] 没有方法“dialog”
3) 回调保证 jQuery 在我尝试使用它时已加载。在 Firefox 中,如果我将“$”替换为“jQuery”(例如 jQuery("head) ),那么代码就可以工作!
4) 页面上没有其他库已在使用 $
5) 更令人沮丧的是,在 Firefox 中,如果我只是屈服并使用“jQuery”而不是“$”,然后设置 $("#jquilib").load() 的回调来调用第三个函数,jQueryUI 函数,如 .tabs() 和 .dialog() 不可用,即使回调本身是由可用的 jQueryUI 触发的!
6) 在 Chrome 中,如果我将 setTimeout() 设置为 100 毫秒,jQueryUI 问题就会消失。如果我降低到 1 毫秒或其他时间,问题仍然存在。

我正在使用这篇文章中的 getScript 函数:http://www.learningjquery.com/2009/04/better-stronger-safer-jquerify-bookmarklet .

下面是我的代码:

function getScript(url,success){
    var script=document.createElement('script');
    script.src=url;
    var head=document.getElementsByTagName('head')[0],
        done=false;
    // Attach handlers for all browsers
    script.onload=script.onreadystatechange = function(){
      if ( !done && (!this.readyState
           || this.readyState == 'loaded'
           || this.readyState == 'complete') ) {
        done=true;
        success();
        script.onload = script.onreadystatechange = null;
        head.removeChild(script);
      }
    };
    head.appendChild(script);
}

function initializejQueryUI(){
    if (typeof jQuery.ui == 'undefined'){
        // jQueryUI library & jQueryUI cupertino theme
        $('head').append("<link href='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/themes/cupertino/jquery-ui.css' type='text/css' rel='stylesheet'>");
        $('head').append("<script id='jquilib' type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js'></script>");
    }
    $("#jquilib").load($("<div>jQuery & UI Loaded!</div>").dialog());
}
getScript('https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js', initializejQueryUI); // call initializejQueryUI as callback when jQuery loads

最佳答案

好的,经过多次尝试错误后弄清楚了。我继续在 Chrome 中开发我的脚本,看起来我比 Firefox 走得更远。当我完成我的小书签时,我突发奇想在 Firefox 中尝试了它,它也在那里工作!这是我学到的:

1) $("#jquilib").load($("<div>jQuery & UI Loaded!</div>").dialog());调用不起作用,因为 jQuery 在处理脚本后删除了通过 DOM 追加添加的元素!重复使用 getScript() 会更容易函数还获取 jQueryUI 并将警报放入从回调调用的函数中。我遇到的选项卡创建问题(上述问题中的第 5 项)就是这个怪癖的结果。

引用: http://api.jquery.com/append/
搜索 Karl Swedberg 说“是的,这很正常”

2) Firebug 似乎在控制台中使用了“$”,导致了像我上面描述的情况,其中“$”不起作用,但 jQuery() 起作用。似乎有一些规则控制何时释放“$”,因为如果我尝试再次运行脚本,jQuery 的 $ 快捷方式会突然起作用。这是最令人沮丧的部分,因为它看起来像是范围和/或时间问题!

关于javascript - 通过 &lt;script&gt; 在书签中加载 jQuery 和 jQueryUI 时出现范围或计时问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7329000/

相关文章:

javascript - Jquery 悬停在 div 上,在祖 parent 上添加样式

JavaScript 作用域和闭包 : value property does not return incremented value

php - PHP 和并发中静态成员的作用域

scala - Scala 中带有方括号的私有(private)作用域 (private[...])

javascript - 重新调用返回 Rxjs observable 的函数

javascript - Mutation 组件中 Apollo Optimistic UI 的语法?

javascript - 使用 VanillaJS 从执行的字符串创建脚本元素

javascript - 按升序显示多个 html 文本框值

javascript - 单击时仅显示前 4 行和幻灯片过渡

javascript - 如何选择:after element using jquery