繁体   English   中英

通过以下方式在bookmarklet中加载jQuery和jQueryUI时出现范围或时序问题<script>?

[英]Scope or timing issue while loading jQuery and jQueryUI in bookmarklet via <script>?

编辑:详细信息已更新,以增加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函数,例如即使回调本身是由jQueryUI触发的,.tabs()和.dialog()也不可用!
6)在Chrome中,如果我将setTimeout()设置为100ms,则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的$快捷方式会突然起作用。 这是最令人沮丧的部分,因为它使它看起来像示波器和/或计时问题!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM