Javascript 我需要更新Bookmarklet的jQuery版本
我正在创建一个书签,一切都很顺利。我有一个函数,如果页面没有jQuery异步加载,然后加载我的脚本;如果页面有jQuery,则直接加载我的脚本 然后我尝试使用委托函数,该函数仅在jQuery1.4.0中可用。我可以使用Javascript 我需要更新Bookmarklet的jQuery版本,javascript,jquery,bookmarklet,Javascript,Jquery,Bookmarklet,我正在创建一个书签,一切都很顺利。我有一个函数,如果页面没有jQuery异步加载,然后加载我的脚本;如果页面有jQuery,则直接加载我的脚本 然后我尝试使用委托函数,该函数仅在jQuery1.4.0中可用。我可以使用$()检查jQuery版本。jQuery但是如果我加载jQuery,我会有两次jQuery,事件执行两次 有没有办法删除以前加载的jQuery,然后加载我需要的新版本?有,但这样做会破坏页面,因此我强烈建议不要这样做。要删除jQuery本身,请执行以下操作: jQuery.noC
$()检查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以及如何使用另一个版本的问题(因为正如您所指出的,删除现有版本可能会破坏页面)。我建议你仔细阅读另一个问题,然后阅读我的答案,特别是在参考代码顶部的注释。