هل من الممكن تحميل نسخة مختلفة متعددة من مسج على نفس الصفحة؟

StackOverflow https://stackoverflow.com/questions/613808

  •  03-07-2019
  •  | 
  •  

سؤال

وأنا صنع بووكمركلت الذي سيتم تحميل مسج إذا لم يتم العثور على الكائن. سوف تحميل اطمئنان على إصدار مسج. رمز مثل:

(function(){

    var myBkl = {
         loadScript: function(src) {
            if(window.jQuery && window.jQuery.fn.jquery == '1.3.2'){
                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 == '1.3.2') { 
                callback(window.jQuery); 
            } 
            else {
                setTimeout((function() {myBkl.whenLoaded(callback); }), 100);
            } 
        },
        init: function($){
            console.log($.fn.jquery);
        }
    };
    myBkl.loadScript('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js');
    myBkl.whenLoaded(myBkl.init);

})();

وأنا استخدم هذا بووكمركلت باني لإنشاء http://subsimple.com/bookmarklets/jsbuilder.htm

من الواضح إذا كانت الصفحة بالفعل مسج تحميل. ان تحميل البرنامج النصي 1.3.2 الكتابة فوق الكائن window.jQuery على الصفحة. أنا فقط أتساءل هل هناك على أية حال السماح 1.3.2 لتحميل في تقرير المصير اسمه متغير آخر؟ باستخدام jQuery.noConflict(true);؟

هل كانت مفيدة؟

المحلول

وأظن كنت قد رأيت بالفعل كل المحاذير وفهم يمكنك نقل مسج على مساحة اسم آخر:

//Completely move jQuery to a new namespace in another object.

var dom = {};
dom.query = jQuery.noConflict(true);

وأن الإضافات ربما لن تنجح ويجب أن تفعل كل هذا قبل أن يتم تحميل النصوص الأخرى أو استخدامها.

وحظا سعيدا / غريبة نوعا ما لمعرفة ما إذا كان هذا يعمل لك ~

نصائح أخرى

نعم. أنا حصلت عليه العمل من خلال هذا الرمز:

    (function(){

    var myBkl = {
         jq: null,
         loadScript: function(src) {
            if(window.jQuery && window.jQuery.fn.jquery == '1.3.2'){
                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 == '1.3.2') { 
                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.3.2/jquery.js');
    myBkl.whenLoaded(myBkl.init);

})();

عند تشغيل "jQuery.noConflict (صحيح)؛" التعليمات البرمجية التي تستخدم النسخة الأولى مسج قد كسر.
في بعض الحالات، رمز لا بل ملكا لك. أن تكتب السيناريو، والتي من المفترض أن تضاف إلى صفحات والذي يستخدم مسج، وأنت تعرف شيئا عن الصفحة استضافة.
مدونة استضافة قد تحميل نسخة مسج لها، الكشف الذي تم تحميله، وبدء العمل به، ثم الانتظار (setTimeout)، ثم يبدأ التعليمات البرمجية، القيام به "jQuery.noConflict (صحيح)؛" وينتظر حتى أنه يتم تحميل. بينما ينتظر التعليمات البرمجية، قد ترجع عنصر التحكم إلى رمز استضافة الذي يحاول تشغيل مسج ويجد أنه غير موجود.

واقتراحي، لهذه الحالة، هو تحميل مسج في نافذة جديدة مختلفة، دون إزالته من نسخة أصلية واحدة. بعد ذلك، عندما يتم تحميله، واستخدام "jQuery.noConflict (صحيح)؛" على نافذة جديدة لبنسخه إلى الإطار الأصلي. ومع ذلك الكائن مسج جديد يعمل في الواقع على نافذة جديدة وثيقتها. حتى عند استخدام مسج الجديد window.document الأصلي يجب أن تمر كمعلمة الثانية من هذا القبيل:

newJq("#elementInOriginalDocument", window.document).html("some text");

وبعد تنفيذ بلدي لهذه الفكرة:

<html>
    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js"></script>
    </head>
    <body>
        Test jQuery
        <br />
        <span id="hostScope">hostScope</span>
        <br />
        <span id="guestScope">guestScope</span>

        <script>
            (function(hostWin){
                    var myBkl = {
                            win: null,
                            doc: null,
                            jq: null,
                            loadScript: function(src) {
                                if (this.doc == null){
                                    var nAgt = navigator.userAgent;
                                    if ((verOffset=nAgt.indexOf("MSIE"))!=-1) {
                                        var iframe = document.createElement('iframe');
                                        iframe.id = "if1";
                                        iframe.src= window.location.href;
                                        document.getElementsByTagName('head')[0].appendChild(iframe);
                                        this.whenIEIFrameLoaded(src, 0);
                                    } else {
                                        var iframe = document.createElement('iframe');
                                        iframe.id = "if1";
                                        document.getElementsByTagName('head')[0].appendChild(iframe);
                                        setTimeout((function() {myBkl.whenIframeLoaded(src); }), 1);
                                    }
                                }
                            },
                            whenIframeLoaded: function(src){
                                var oIframe = document.getElementById('if1');
                                var newdocument = (oIframe.contentWindow || oIframe.contentDocument);
                                if (newdocument.document) {
                                    newdocument = newdocument.document;
                                }
                                var newwin = oIframe.contentWindow;

                                if (newwin.document.documentElement.innerHTML){
                                    newwin.document.documentElement.innerHTML = '<!DOCTYPE html><html><head></head><body>N</body></html>';
                                }
                                this.doc = newwin.document;
                                this.win = newwin;

                                var script = this.doc.createElement('script');
                                script.setAttribute('src', src);
                                script.setAttribute('type', 'text/javascript');

                                this.doc.getElementsByTagName('head')[0].appendChild(script); 
                                this.whenLoaded(this.callback, 0);
                            },
                            whenIEIFrameLoaded: function(src, times){
                                var oIframe = document.getElementById('if1');

                                if (oIframe && oIframe.contentWindow && oIframe.contentWindow.document && oIframe.contentWindow.document.body){
                                    var newdocument = (oIframe.contentWindow || oIframe.contentDocument);
                                    if (newdocument.document) {
                                        newdocument = newdocument.document;
                                    }

                                    var script = newdocument.createElement('script');
                                    script.setAttribute('src', src);
                                    script.setAttribute('type', 'text/javascript');

                                    newdocument.getElementsByTagName('head')[0].appendChild(script); 

                                    this.doc = newdocument;
                                    this.win = oIframe.contentWindow;
                                    this.whenLoaded(myBkl.callback, 0);
                                } else {
                                    if (times < 5000){
                                        times++;
                                        setTimeout((function() {myBkl.whenIEIFrameLoaded(src, times); }), 2);
                                    }
                                } 
                            },
                            whenLoaded: function(callback, times){
                                    if (this.win && this.win.jQuery && typeof(this.win.jQuery) !== 'undefined' && this.win.jQuery.fn.jquery == '1.3.2') { 
                                        myBkl.jq = this.win.jQuery.noConflict(true);
                                        callback(myBkl.jq);
                                    } 
                                    else {
                                        if (times < 5000){
                                            times++;
                                            setTimeout((function() {myBkl.whenLoaded(callback, times); }), 5);
                                        }
                                    } 
                            },
                            callback: function(loadedJq){
                                    hostWin.myJq = loadedJq;
                                    //console.log("callback: The loaded jQuery ver is " + loadedJq.fn.jquery);
                                    whenLoadedOut();
                            }
                    };
                    myBkl.loadScript('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js');
            })(window);

            function whenLoadedOut(){
                if (window.jQuery) { 
                    //console.log("Host jQuery ver (window.jQuery.fn.jquery) is " + jQuery.fn.jquery);
                    //console.log("guest jQuery ver (window.lpJq)  is " + myJq.fn.jquery);
                    $("#hostScope").html("The jQuery ver of host is " + jQuery.fn.jquery);
                    myJq("#guestScope", document).html("The jQuery ver of guest is " + myJq.fn.jquery);
                } 
                else {
                    setTimeout((function() {whenLoadedOut(); }), 2);
                } 
            }
        </script>
    </body>
</html>

هذا بلوق

يمكنك استخدام الأسلوب

$.noConflict(true);

ولتحقيق ذلك. على سبيل المثال:

<script src="http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.3.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
    //create this naming for Jquery 1.3.2 version
    var jQuery_1_3_2 = $.noConflict(true);
</script>
<script src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js" type="text/javascript"></script>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top