Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我需要更新Bookmarklet的jQuery版本_Javascript_Jquery_Bookmarklet - Fatal编程技术网

Javascript 我需要更新Bookmarklet的jQuery版本

Javascript 我需要更新Bookmarklet的jQuery版本,javascript,jquery,bookmarklet,Javascript,Jquery,Bookmarklet,我正在创建一个书签,一切都很顺利。我有一个函数,如果页面没有jQuery异步加载,然后加载我的脚本;如果页面有jQuery,则直接加载我的脚本 然后我尝试使用委托函数,该函数仅在jQuery1.4.0中可用。我可以使用$()检查jQuery版本。jQuery但是如果我加载jQuery,我会有两次jQuery,事件执行两次 有没有办法删除以前加载的jQuery,然后加载我需要的新版本?有,但这样做会破坏页面,因此我强烈建议不要这样做。要删除jQuery本身,请执行以下操作: jQuery.noC

我正在创建一个书签,一切都很顺利。我有一个函数,如果页面没有jQuery异步加载,然后加载我的脚本;如果页面有jQuery,则直接加载我的脚本

然后我尝试使用委托函数,该函数仅在jQuery1.4.0中可用。我可以使用
$()检查jQuery版本。jQuery
但是如果我加载jQuery,我会有两次jQuery,事件执行两次


有没有办法删除以前加载的jQuery,然后加载我需要的新版本?

有,但这样做会破坏页面,因此我强烈建议不要这样做。要删除jQuery本身,请执行以下操作:

 jQuery.noConflict(true);
这只是为了表明它是可以做到的(尽管它并没有消除它所产生的所有效果),在你的情况下我不会这样做,你所做的会真正破坏你的书签运行的网页


取而代之的是,如果您的书签需要最新的jQuery API,后面的版本是否符合您的所有需求?如果是这样,那么使用它,即使它的效率稍低一点,这样无论页面是否有稍旧的版本,它都可以工作。

可以将jQuery移动到另一个名称空间

//Completely move jQuery to a new namespace in another object.
var dom = {};
dom.query = jQuery.noConflict(true);
下面是一些与另一个代码略有不同的代码,asker能够让它与您的bookmarklet使用完全相同的用法

/* I have attempted to change the code to check for the 1.4.x and if its not then  
   load the latest version of jQUery.  */ 
    (function(){

        var myBkl = {
                 jq: null,
                 loadScript: function(src) {
                        if(window.jQuery && window.jQuery.fn.jquery.indexOf('1.4') >= 0){
                                return;
                        }
                        var s = document.createElement('script');
                        s.setAttribute('src', src);
                        s.setAttribute('type', 'text/javascript');
                        document.getElementsByTagName('head')[0].appendChild(s); 
                },
                whenLoaded: function(callback){
                        if (typeof(window.jQuery) !== 'undefined' && window.jQuery.fn.jquery.indexOf('1.4') >= 0) { 
                                myBkl.jq = window.jQuery.noConflict(true);
                                callback(myBkl.jq); 
                        } 
                        else {
                                setTimeout((function() {myBkl.whenLoaded(callback); }), 100);
                        } 
                },
                init: function($){
                        console.log($.fn.jquery);
                        console.log(window.jQuery.fn.jquery);
                }
        };
        myBkl.loadScript('http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'); //this will load the latest version from google cdn
        myBkl.whenLoaded(myBkl.init);

})();
原始来源参考:

如果必须这样做,另一个选项是(在发现没有
.delgate()
就无法重写bookmarklet之后,正如其他人所建议的那样),可以在同一页面上使用多个版本的jQuery。请看下面:

if (typeof jQuery == ‘undefined’) {
    appendLatestJQuery();
}
else {
    jQVersion = $().jquery;
    versionArray = jQVersion.split(‘.’);
    if (versionArray[1] < 4) {
        appendLatestJQuery();
    }
    else {
        runthis();
    }
}

function appendLatestJQuery() {
    var jQ = document.createElement('script');
    jQ.type = 'text/javascript';
    jQ.onload=runthis;
    jQ.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js';
    document.body.appendChild(jQ);
}
function runthis() {
    var $j = jQuery.noConflict(true);

    //now use $j for your code here

}
if(typeof jQuery==“未定义”){
appendLatestJQuery();
}
否则{
jQVersion=$().jquery;
versionArray=jQVersion.split('.');
if(versionArray[1]<4){
appendLatestJQuery();
}
否则{
runthis();
}
}
函数appendLatestJQuery(){
var jQ=document.createElement('script');
jQ.type='text/javascript';
jQ.onload=runthis;
jQ.src=http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js';
文件.正文.附件(jQ);
}
函数runthis(){
var$j=jQuery.noConflict(true);
//现在在这里使用$j作为代码
}

我会编辑,但我不能完全确定我是否错过了你建议的意图:“我不会这么做,你这样做真的是为了……”@David-…不确定我在那里吸烟,谢谢!,更新:)这确实更有意义。我很高兴我没有编辑,因为我有一半的把握它只是一个d-for-g打字错误+我感谢你没有这样做。jQuery是一个大的侵入式框架,在书签中,您应该尽可能轻触。您是第三方页面上的访客,不应该通过加载或更改主要框架来制造麻烦。您的bookmarklet是否如此复杂,以至于您真的无法离开
delegate()
(使用
live()
)呢。你的bookmarklet太复杂了,你真的不能没有jQuery句号吗?@bobince-+1-我对事情的时间和地点非常同意,这对于一个bookmarklet来说似乎非常非常沉重,并且改变你作为客人的页面的框架……我也无法想象一个有效的例子,这个问题只会带来麻烦。你不应该抄袭另一个答案,或者只是发布一个链接到另一个问题作为你的答案。我想我也没有这样做。我补充了我认为这个问题需要改变的地方。仔细看看。但是在这种情况下最好的做法是什么呢?问题不是要移动到另一个名称空间,你也没有包括作者需要的jQuery版本,1.3.2没有委托…你只是复制了另一个答案,它仍然不能回答这个问题。@Nick:最终的结果是解决了页面上已经有一个版本的jQuery以及如何使用另一个版本的问题(因为正如您所指出的,删除现有版本可能会破坏页面)。我建议你仔细阅读另一个问题,然后阅读我的答案,特别是在参考代码顶部的注释。