2011-10-29 43 views
2

特别是我想定义本地jQuery(var jQuery),其中
jQuery应该存储(也是本地$)。如何封装jQuery?

的问题是,jQuery的操作直接与窗口对象:

// Expose jQuery to the global object 
window.jQuery = window.$ = jQuery; 
})(window); 

这是来自jQuery的1.6.4
引文我怎样才能解决这个?

P.S:我的具体问题是写一些片段3,第三方网站使用
,如果我包括jQuery的有可能会出现一些不兼容与 3-第三方JS代码。目前,我做了以下内容:

// here some license notes about jQuery included 
(function() { 
    if (typeof jQuery === "undefined") { 
     // jQuery code as it is goes here 
    } 
    // my code 
})(); 
+0

你为什么要这么做? – xdazz

+0

好吧,我已经更新了我的问题 – tsds

回答

6

你可以通过true$.noconflict()拥有jQuery的全局范围内删除其所有变量:

(function($) { 
    var jQuery = $.noconflict(true); 
    // From there on, window.jQuery and window.$ are undefined. 
    var $ = jQuery; 
    // Do something with the local jQuery and $... 
})(jQuery); 
+0

noconflict做我在我的回答中做了什么? –

+0

或多或少,是的。 –

+1

但是如果哪里已经是第三方jQuery在全局命名空间 – tsds

2
var jQuery, $; 
jQuery = $ = window.jQuery; 
delete window.jQuery; 
delete window.$; 
+0

我不能只是删除全局jQuery,我已经更新了我的问题,请看看 – tsds

+0

+1漂亮的注入方法 – mate64

2

你可以用.noConflict其删除:

var localjQuery = jQuery.noConflict(true); 

但它会一直在全球范围内e之前...

1

找到这篇文章,试图找出如何注入一个完全独立的自定义扩展方法的jQuery实例到网页通过GreaseMonkey/Tampermonkey,并绕过Chrome沙箱。毋庸置疑,我需要一点点提供,下面是我结束了。

下面是注入的代码体和其他一些我肯定会帮助其他人开始使用的方法。我将其注入每个网页,以便我可以通过开发控制台或其他篡改密钥脚本访问此实例。我给它别名“z”。它延迟加载,以便它不会减慢不使用它的页面。要加载,需要调用z(),z.ProcessWaitList(),或者在加载z脚本之前向ZWaitList添加函数。

注意// BEGIN_INJECTION //和// END_INJECTION //标记以及条件包含标记/ ...和... /。条件包含标签内的代码将只包含在注入页面的实际代码中。这样可以防止脚本在GreaseMonkey中运行一次,然后再次注入时重复的自动执行。

使用该功能
(function ZInjectionContainer() { 
    if(!document.querySelector('script[id="ZInjectionContainer"]')){ 
     //BEGIN_INJECTION// 
     /*... z = (function (_jQuery, _$) { ...*/  

     function SubstrBetween(s, start,end){ return s.substring(s.indexOf(start) + start.length, s.lastIndexOf(end));} 

     function AppendScript(id, src, callback){ 
      var js = document.querySelector('script[id="'+ id +'"]'); 
      if(!js){ 
       js = document.createElement('script'); js.id = id; js.type = 'text/javascript'; 
       document.getElementsByTagName('body')[0].appendChild(js); 
      } 
      if(callback) js.onload = callback;  
      if(src && String(src).endsWith('.js')) js.src = src; 
      else if(src)js.text += "\n" + String(src); 
      return js; 
     } 

     function ProcessWaitList(){ 
      function process(){ console.log(' Processing WaitList.'); while(ZWaitList.length > 0){ ZWaitList.shift().call(); } } 
      if(typeof ZWaitList == 'undefined') ZWaitList = [];    
      if(Array.isArray(ZWaitList) && ZWaitList.length > 0){  
       if(!IsInitialized()) { 
        console.log('ZWaitList sizeof ' + ZWaitList.length + ' detected. Auto Initializing'); 
        ZInitialize(process);       
       } 
       else{ process(); } 
      }  
     } 

     function ZInitialize(callback) { 
      var _version = 'jquery-2.2.0.min'; 
      AppendScript(_version, 'https://code.jquery.com/'+ _version +'.js',function(){ 
       z = jQuery.noConflict(true); 
       jQuery = _jQuery; $ = _$; 
       z.extend(createLocalInstance());    
       console.log(' Loaded jQuery-' + z().jquery + ' as z. Page Version is jQuery-' + (_jQuery ? _jQuery().jquery : 'undefined'));               
       z(document).ready(function(){ 
        console.log(' document loaded'); 
        if(callback) z(callback); 
        if(callback != ProcessWaitList){ ProcessWaitList();} 
       }); 
      });     
     }; 

     function IsInitialized(){ 
      return (typeof z !== 'undefined' && typeof z=== 'function' && !String(z).startsWith(ZInitialize.toString())); 
     } 

     function createLocalInstance(){ 
      var local = ZInitialize; 
      local.IsInitialized = IsInitialized; 
      local.SubstrBetween = SubstrBetween; 
      local.AppendScript = AppendScript; 
      local.ProcessWaitList = ProcessWaitList; 
      return local; 
     } 

    /*... 
     if(typeof z == 'undefined') {z = createLocalInstance();} 
     else if (typeof z !== 'function' || !String(z).startsWith(ZInitialize.toString())) { 
      console.log('Error. z is already defined as: ' + z +'\n Overwriting anyway'); 
      z = createLocalInstance(); 
     } 

     ProcessWaitList(); 
     return z; 
    })(typeof jQuery !== 'undefined' ? jQuery : null, typeof $ !== 'undefined' ? $ : null); 
    ...*/ 
    //END_INJECTION// 

     var inject = SubstrBetween(ZInjectionContainer.toString(),"//BEGIN_INJECTION//", "/"+"/END_INJECTION//"); 
     inject = inject.split('/*...').join('').split('...*/').join(''); 
     AppendScript("ZInjectionContainer", inject); 
    } 
})(); 

其他脚本调用它是这样的:

function RemoveStupidStuff(){  
    //Example code 
    z('td.logo1').parents('table').remove(); 
    z('#bodyarea').prev().remove(); 
    z('#bodyarea').css('padding','0') 
    z('#bodyarea #mcol').prev().remove(); 
} 

function FixIndexPage(){ 
    //Example code - Remove show image on hover and instead just make it the thumbnail 
    console.log('making the index page less crappy'); 
    z('#bodyarea #mcol table[width="75%"] tr td table.lista').attr('id','thegoods').css('width','100%');; 
    z('#thegoods tr:not(:first-child)').addClass('listing'); 

    var listings = z('.listing') 
    for(var i=0; i < listings.length; i++){  
     var row = listings[i]; 
     var thumb = z(row.children[0]).find('a')[0]; 
     var hoverimg = z(row.children[1]).find('a')[0]; 
     var link = z.SubstrBetween(hoverimg.onmouseover.toString(), "<img src=", " width="); 
     thumb.href = hoverimg.href;    
     z(thumb).find('img').attr('src', link).attr('width','350px'); 
    }  
} 

var operations = [RemoveStupidStuff]; 
if(location.search.indexOf('page=index')>=0){ 
    operations.push(FixIndexPage); 
} 

console.log('pushin site fixes to waitlist'); 
if(typeof ZWaitList === 'undefined') 
    ZWaitList = operations; 
else { 
    ZWaitList = ZWaitList.concat(operations); 
    z.ProcessWaitList(); 
} 

这里的Chrome浏览器开发控制台将使用上面的代码是什么输出。注意它运行在不同的虚拟机和一切。

VM300:59 pushin site fixes to waitlist 
VM298:24 ZWaitList sizeof 2 detected. Auto Initializing 
VM298:35 Loaded jQuery-2.2.0 as z. Page Version is jQuery-1.6.4 
VM298:37  document loaded 
VM298:20 Processing WaitList. 
VM300:30 making the index page less crappy 
VM298:20 Processing WaitList.