Как инкапсулировать jQuery?

#javascript #jquery

#javascript #jquery

Вопрос:

В частности, я хочу определить локальный jQuery (var jQuery), где
должен храниться jQuery (а также local $ ).

Проблема в том, что jQuery работает непосредственно с объектом window:

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

это цитата из jQuery 1.6.4
Как я могу обойти это?

PS: моя конкретная проблема заключается в написании некоторого фрагмента для использования сторонним веб
-сайтом, и если я включу jQuery, могут возникнуть некоторые несовместимости с этим сторонним js-кодом. В настоящее время я делаю следующее:

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

Ответ №1:

Вы можете перейти 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);
  

Комментарии:

1. Но что, если where уже 3-й участник jQuery в глобальном пространстве имен

2. Будет ли jQuery удалять сторонний глобальный экземпляр jQuery?

3. @tsds, ну, я не знаю, что ты имеешь в виду 3rd party jQuery , но noconflict() метод будет вызываться для этого объекта, поэтому он должен отменить регистрацию в глобальном пространстве имен.

Ответ №2:

 var jQuery, $;
jQuery = $ = window.jQuery;
delete window.jQuery;
delete window.$;
  

Комментарии:

1. Я не могу просто удалить глобальный jQuery, я обновил свой вопрос, пожалуйста, взгляните

Ответ №3:

Вы можете удалить его с помощью .noConflict :

 var localjQuery = jQuery.noConflict(true);
  

Но он будет находиться в глобальной области видимости до этого вызова…

Ответ №4:

Нашел этот пост, пытаясь выяснить, как внедрить полностью независимый экземпляр jQuery с пользовательскими методами расширения на веб-страницу через GreaseMonkey / Tampermonkey и обойти изолированную среду Chrome. Излишне говорить, что мне нужно было немного больше, чем предусмотрено, вот что у меня получилось.

Ниже приведен вводимый текст кода и некоторые другие методы, которые, я уверен, помогут другим начать работу. Я добавляю это на каждую веб-страницу, чтобы я мог получить доступ к этому экземпляру через консоль разработчика или через другие скрипты tampermonkey. Я дал ему псевдоним «z». Он лениво загружается, чтобы не замедлять работу страниц, которые его не используют.

Для загрузки необходимо вызвать z(), z.ProcessWaitList() или добавить функции в ZWaitList до загрузки z-скрипта.

Обратите внимание на теги //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 amp;amp; 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) amp;amp; 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' amp;amp; typeof z=== 'function' amp;amp; !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.