2011-10-09 21 views
6

के साथ किसी पृष्ठ के jQuery संस्करण को बदलें, मैं greasemonkey के साथ किसी पृष्ठ के jquery संस्करण को कैसे प्रतिस्थापित कर सकता हूं?Greasemonkey

मैं jquery के एक नए संस्करण के साथ एक साइट का परीक्षण करने की कोशिश कर रहा हूं, लेकिन मेरे पास एक dev enviroment नहीं है।

उत्तर

5

मैं जानता हूँ कि यदि आप ऐसा करने के लिए jQuery और Greasemonkey के बारे में पूछ रहे हैं, लेकिन मुझे एक पूरी तरह से विभिन्न विकल्प, Fiddler बंद करते हैं।

यदि आप jQuery के नए संस्करण के साथ साइट का परीक्षण कर रहे हैं और आप वास्तव में किसी भी ब्रेकिंग परिवर्तन आदि का परीक्षण करना चाहते हैं ...आप साइट का परीक्षण करना चाहते हैं क्योंकि यह होगा, जबकि एक जावास्क्रिप्ट (greasemonkey)-तथ्य-बाद-तथ्य प्रतिस्थापन सटीक सिमुलेशन नहीं है।

फिडलर के साथ आप jQuery फ़ाइल को प्रतिस्थापित कर सकते हैं कि ब्राउज़र (ब्राउज़र जानने के बिना) का अनुरोध करता है। इस तरह आप वास्तव में इसे पूरी तरह से परीक्षण कर रहे हैं, आप सीधे पृष्ठ में नए संस्करण को छोड़ रहे हैं, कोई इन-पेज जेएस चाल नहीं है जो वहां पहुंचने के लिए बिल्कुल सही नहीं हो सकता है (हैंडलर पहले से ही जुड़ा हुआ है, ऑर्डर लोड कर सकते हैं आदि।)

Eric Law (फ़िडलर के निर्माता) कैसे बिल्कुल यह करने के लिए पर एक उत्कृष्ट ब्लॉग पोस्ट है:

Swapping out JQuery with Fiddler

पोस्ट के साथ minified संस्करण बाहर गमागमन के लिए लिखा गया था पूर्ण संस्करण (भी आसान!) या डिबगिंग के लिए एक नया संस्करण, दोनों उपयोगों को ध्यान में रखना सुनिश्चित करें ... वे बहुत कुछ डीबग/परीक्षण समय को बचाने में उपयोगी हैं।

10

स्रोत नियंत्रण और लिखित रिलीज चेकलिस्ट का उपयोग करते हुए एक देव पर्यावरण बनाना, आपको बहुत दुःख बचाएगा (और अधिकांश भुगतान किए गए कार्यों की आवश्यकता है)। लोड होने से

  1. रोक पेज के मूल jQuery:
    ~~~

    एक मौजूदा पृष्ठ पर jQuery संस्करण (है कि आप को नियंत्रित नहीं करते) को बदलने के लिए सबसे अच्छा तरीका है।

  2. <script> नोड बनाएं, जिसमें आप चाहते हैं कि jQuery संस्करण है, जो से पहले किसी भी स्क्रिप्ट को jQuery का उपयोग करता है।

दुर्भाग्य से, Greasemonkey # 1 नहीं कर सकता। यह केवल के बाद पृष्ठ के मूल jQuery के साथ छेड़छाड़ कर सकता है, यह लोड हो गया है - एक दृष्टिकोण जो काम कर सकता है, लेकिन यह पृष्ठ को धीमा करता है और दौड़ की स्थिति को जोखिम देता है।

  1. सुनिश्चित करें कि आपके फ़ायरफ़ॉक्स the Adblock add-on है और/या the RequestPolicy add-on (एक उत्कृष्ट ऐड-ऑन का उपयोग करने के भले ही है):

    तो, मैं एक दो उपकरण समाधान सलाह देते हैं।

  2. उपयोग Adblock या RequestPolicy अस्थायी रूप से पुराने jQuery ब्लॉक करने के लिए।
    उदाहरण के लिए, स्टैक ओवरव्लो के लिए, http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js ब्लॉक करें। (ध्यान दें कि RequestPolicy आप केवल एक विशिष्ट साइट पर अवरुद्ध यूआरएल सीमित करने के लिए अनुमति देता है।)

  3. तो jQuery के वांछित संस्करण (जो यह की परवाह किए बिना कर सकते हैं Adblock या RequestPolicy सेटिंग्स) लोड करने के लिए Greasemonkey का उपयोग पेज की शुरुआत में।

    उदाहरण के लिए, इस स्क्रिप्ट चरण 2 से 1.6.2 के लिए मेटा तो चलो jQuery अपग्रेड कर देंगे ब्लॉक के साथ संयोजन के रूप में,:

    // ==UserScript== 
    // @name   _upgrade jQuery 
    // @include   http://meta.stackexchange.com/questions/* 
    // @run-at   document-start 
    // ==/UserScript== 
    
    /*--- Important! 
         (1) We need another add-on, besides Greasemonkey, to 
          disable the old, undesired script. 
         (2) The DOM is not available yet 
          (@run-at == document-start). 
         (3) We cannot use a loop to check for the DOM because 
          loading is halted while the loop runs. 
         (4) setTimeout() and setInterval() are not fast enough due 
          to minimum interval clamping. By the time they detect 
          the DOM, scripts that we need to precede may have 
          loaded. 
         (5) Therefor, we use a "set Zero Timeout" function as 
          explained by David Baron at 
           http://dbaron.org/log/20100309-faster-timeouts . 
         (6) By the time FF reports that the `document.head` is 
          available, several head elements have loaded! 
          (Is this a bug?) 
          That means that if any dependent scripts are loaded 
          before we can inject our jQuery version, then we must 
          also reload those dependent scripts. 
    */ 
    
    ////// setZeroTimeout() implementation: BEGIN 
    
    /*--- Only add setZeroTimeout to the window object, and hide 
        everything else in a closure. 
    */ 
    (function() { 
        var timeouts = []; 
        var messageName = "zero-timeout-message"; 
    
        /*--- Like setTimeout, but only takes a function argument. 
         There's no time argument (always zero) and no arguments. 
         You have to use a closure. 
        */ 
        function setZeroTimeout(fn) { 
         timeouts.push(fn); 
         window.postMessage(messageName, "*"); 
        } 
    
        function handleMessage(event) { 
         if (event.source == window && event.data == messageName) { 
          event.stopPropagation(); 
          if (timeouts.length > 0) { 
           var fn = timeouts.shift(); 
           fn(); 
          } 
         } 
        } 
    
        window.addEventListener ("message", handleMessage, true); 
    
        // Add the one thing we want added to the window object. 
        window.setZeroTimeout = setZeroTimeout; 
    })(); 
    
    ////// setZeroTimeout() implementation: END 
    
    /*--- Now wait for the DOM and then add our version of jQuery, 
        first thing. 
    */ 
    function SearchForDOM() { 
    
        var targetNode; 
        if (typeof document.head == "undefined") 
         targetNode = document.querySelector ("head, body"); 
        else 
         targetNode = document.head; 
        if (targetNode) { 
    
         var scriptNode  = document.createElement ("script"); 
         scriptNode.src  = 'http://ajax.googleapis.com/ajax/' 
              + 'libs/jquery/1.6.2/jquery.min.js'; 
         targetNode.appendChild (scriptNode); 
    
         /*--- By the time FF reports that the head element is 
          available, a key dependent script has loaded! 
          So, we reload it here, so that it can run with jQuery 
          available. 
         */ 
         var scriptNode  = document.createElement ("script"); 
         scriptNode.src  = location.protocol 
              + '\/\/' + location.host 
              + '/content/js/stub.js?v=49f661361016'; 
         targetNode.appendChild (scriptNode); 
        } 
        else 
         setZeroTimeout (SearchForDOM); 
    } 
    
    SearchForDOM(); 
    


    नोट: कि कारण जे एस, जीएम, और Firefox की सीमाओं के , jQuery पर निर्भर स्क्रिप्ट को फिर से लोड करना आवश्यक हो सकता है। (यह मेटा स्टैक ओवरफ़्लो के लिए मामला है, इस समय है।)

+0

बाहर निकलता है मैं वही काम करने की कोशिश कर रहा हूं! मैं एफएफ 56 में एसओ पुनः लोड करने की कोशिश कर रहा हूं, क्योंकि Google सीडीएन 0 गति तक थ्रेसहोल्ड है। मैं इसे ब्लॉक करने के लिए uMatrix का उपयोग करें। दस्तावेज़ तैयार पर, कतार में स्क्रिप्ट स्क्रिप्ट स्कैन करें, jquery से शुरू होने के लिए प्रत्येक स्क्रिप्ट को उल्टा करें और संलग्न करें। इससे पहले, मैंने भाग लेने के लिए @ दस्तावेज़-स्टार्ट और इवेंट beforescriptexecute चलाने की कोशिश की, पेज लोडिंग चोक। अब windows.eval() के साथ अपना रास्ता कोशिश कर रहा हूँ। यह बेकार ढंग से काम करता है। इसलिए। सिर्फ 0timout चाल के लिए धन्यवाद कहना है। – Ben

0

मेरे मामले के लिए क्या काम नहीं किया, इस सवाल के अनुरूप लगता है, कोई अवरोधक की आवश्यकता नहीं है। GreaseMonkey में:

// ==UserScript== 
// @name  alternative jquery 
// @namespace [email protected] 
// @description intercept 
// @include  https://somehost.com/* 
// @grant  GM_getResourceText 
// @resource jquery_new jquery_new.js 
// @run-at  document-start 
// @version  1 
// ==/UserScript== 

var jquery_source = GM_getResourceText('jquery_new'); 
console.log('jQuery Lenght =',jquery_source.length); 

window.addEventListener('beforescriptexecute', 
function(e){ 
    if (e.target.src && 
     e.target.src.search('/1.12.4/jquery.min.js') >= 0) { 
      console.log('intercepted: '+e.target.src); 
      e.preventDefault(); 
      e.stopPropagation(); 
      window.eval(jquery_source); 
     } 
}); 

नोट: नकारात्मक पक्ष यह है - beforescriptexecute आग के बाद मूल स्क्रिप्ट को पुनः प्राप्त और क्रियान्वित किया जा करने के लिए तैयार है ताकि मूल बाहरी जे एस फ़ाइल लोड करने में विफल करना चाहिए, इस दृष्टिकोण काम नहीं करेगा।

संबंधित मुद्दे