2013-09-24 5 views
7

मेरे पास एक ऐसा एप्लिकेशन है जिसे मैं Greasemonkey स्क्रिप्ट बनाने की कोशिश कर रहा हूं। यह सामग्री को गतिशील रूप से लोड करने के लिए बहुत सारे jQuery और AJAX का उपयोग करता है।जब AJAX पृष्ठ को पुनः लोड किए बिना URL बदलता है तो मैं Greasemonkey स्क्रिप्ट को फिर से लोड कैसे करूं?

मैंने देखा है कि URL प्रत्येक बार जब मैं एक नया आइटम लोड करता हूं, तब भी बदलता है, भले ही पृष्ठ रीफ्रेश न हो।

क्या कोई श्रोता है जो मैं पृष्ठ पर प्रत्येक बार URL बदलते समय स्क्रिप्ट को फिर से लॉन्च करने के लिए रख सकता हूं?

उत्तर

0

"मैंने देखा है कि यूआरएल हर बार बदलता है" बहुत सारे AJAX मुझे नेतृत्व करेंगे कि वे इतिहास API का उपयोग कर रहे हैं। यदि ऐसा है, तो window.onpopstate पर एक नज़र डालें। इतिहास एपीआई का उपयोग करके प्रत्येक यूआरएल परिवर्तन पर आग लगनी चाहिए।

+0

greasemonkey window.onpopstate को पसंद नहीं करता है। मैं किसी भी घटना को बांधने के लिए प्रतीत नहीं कर सकता। – Sugitime

+0

@Sugitime मुझे लगता है कि आप ['unsafeWindow'] (http://wiki.greasespot.net/UnsafeWindow) और/या 'addEventListener' का उपयोग कर रहे हैं? –

+0

addEventListener – Sugitime

11

आप यह कैसे करते हैं साइट/एप्लिकेशन और आप जो करने की कोशिश कर रहे हैं उस पर निर्भर करता है।

  1. URL परिवर्तन को पकड़ने की कोशिश मत करो: आपके संभव विकल्प, सबसे आसान और सबसे मजबूत हुए हैं। Use calls to waitForKeyElements() to act on the parts of the various pages that you wanted to manipulate in the first place. यह सभी अन्य दृष्टिकोणों के साथ अंतर्निहित समय के मुद्दों को अच्छी तरह से संभालता है।
    यह भी देखें: "Choosing and activating the right controls on an AJAX-driven site"

  2. Just poll for URL changes. यह सरल है और अभ्यास # 1 के अलावा कम समय के मुद्दों के साथ अभ्यास में अच्छा काम करता है।

  3. साइट AJAX कि टुकड़ा (उर्फ "हैश") में परिवर्तन का उपयोग करता है, तो fire on the hashchange event। हां, कम और कम AJAX साइटें यह करती हैं।

  4. उपयोग उत्परिवर्तन निरीक्षक नजर रखने के लिए <title> टैग को बदल जाता है। अधिकतर AJAX पृष्ठ भी शीर्षक को बदलने के लिए काफी अच्छे हैं। हालांकि, आपकी लक्षित सामग्री लोड होने से पहले यह आग लग सकती है।

  5. Hack into the history.pushState function. यह पृष्ठ परिवर्तन के तेजी से सूचना देता है, लेकिन पहले अपने लक्ष्य तत्वों लोड समय का 95% है, यह सक्रिय करता है। आपको आमतौर पर एक टाइमर की आवश्यकता होगी। इसके अलावा, यह उपयोगकर्ताओं के पर्यावरण में क्रॉस-स्कोप समस्याओं को लाता है।


संदर्भ के लिए, यहां एक मतदान उदाहरण है। यह अभी भी सबसे अच्छा, नंगे हड्डियों, क्रॉस-ब्राउजर, कैच-ऑल विधि है:

/*--- Note, gmMain() will fire under all these conditions: 
    1) The page initially loads or does an HTML reload (F5, etc.). 
    2) The scheme, host, or port change. These all cause the browser to 
     load a fresh page. 
    3) AJAX changes the URL (even if it does not trigger a new HTML load). 
*/ 
var fireOnHashChangesToo = true; 
var pageURLCheckTimer  = setInterval (
    function() { 
     if ( this.lastPathStr !== location.pathname 
      || this.lastQueryStr !== location.search 
      || (fireOnHashChangesToo && this.lastHashStr !== location.hash) 
     ) { 
      this.lastPathStr = location.pathname; 
      this.lastQueryStr = location.search; 
      this.lastHashStr = location.hash; 
      gmMain(); 
     } 
    } 
    , 111 
); 

function gmMain() { 
    console.log ('A "New" page has loaded.'); 
    // DO WHATEVER YOU WANT HERE. 
} 
+0

यह कभी-कभी पृष्ठ बदलने से पहले यह किक करता है, इसलिए समाधान यह है कि आप 'gmMain()' में 'setTimeout()' (मैं 500 मिलीसेकंड का उपयोग करता हूं) में, जो भी आप करते हैं, वापस नेविगेट करें, फ़ंक्शन को फिर से कॉल किया जाता है, आप AJAX सामग्री का कंटेनर पा सकते हैं, और पहले तत्व में कक्षा जोड़ सकते हैं, और यदि यह कक्षाएं मौजूद हैं तो कुछ भी न करें। –

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