2011-09-11 11 views
5

मैं फेसबुक में उपयोगकर्ता.जेएस को/संदेश पेज करने की कोशिश कर रहा था, लेकिन ऐसा लगता है कि नेविगेशन जब/नेविगेशन से बदलता है तो greasemonkey नोटिस नहीं करता है। यह अन्य आंतरिक पृष्ठों में भी होता है। सबसे पहले मैंने सोचा कि यह AJAX नेविगेशन के कारण हुआ था, लेकिन यूआरएल बदलता है (हैश भाग नहीं है), तो यह सामान्य नेविगेशन है, है ना?क्यों greasemonkey फेसबुक में कुछ पेज परिवर्तन का पता नहीं लगाता है?

// ==UserScript== 
// @name   Test 
// @namespace  none 
// @description just an alert when page changes 
// @include  http*://www.facebook.com/* 
// ==/UserScript== 

alert(location.href); 

कैसे मैं सही ढंग से पेज परिवर्तन का पता लगाने कर सकते हैं:

यह एक परीक्षण पृष्ठ है कि मैं का इस्तेमाल किया है?


Firefox संस्करण: 6.0.2

Greasemonkey संस्करण: 0.9.11

+0

यह अन्य प्रश्न प्रासंगिक हो सकता है। http://stackoverflow.com/questions/3522090/event-when-window-location-href-changes – bronsoja

उत्तर

8

ब्राउज़र इसका समर्थन, Firefox 4+ सहित, फेसबुक एचटीएमएल 5 इतिहास एपीआई का लाभ लेता है। यह एपीआई history.pushState() विधि का उपयोग करके स्थान को बदलने की अनुमति देता है हालांकि वास्तव में कोई नेविगेशन नहीं होता है। यद्यपि पृष्ठ बदल गया प्रतीत होता है, लेकिन जो भी हुआ वह पीछे की ओर अजाक्स कॉल है जो अधिकांश सामग्री को बदलता है।

आप यह परिवर्तन पर कब्जा करना चाहता था, तो आप प्रॉक्सी को pushState() विधि अपने खुद के समारोह के साथ होगा:

(function (old) { 
    window.history.pushState = function() { 
     old.apply(window.history, arguments); 
     alert(window.location.href); 
    } 
})(window.history.pushState); 

https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history में इतिहास API के बारे में अधिक पढ़ें।

// ==UserScript== 
// ... 
// @include https://www.facebook.com/* 
// ... 
// ==/UserScript== 

var url = document.location.toString(); 
function scriptBody(){ 
    if (!url.match(/facebook.com\/messages/)) return; 
    // ... 
    // do stuff 
    // ... 
}); 

scriptBody(); // run on initial page load 

document.querySelector('html').addEventListener('DOMNodeInserted', function(ev){ 
    var new_url = document.location.toString(); 
    if (url == new_url) return; // already checked or processed 
    url = new_url; 

    scriptBody(); // run when URL changes 
}); 

ध्यान दें कि अगर आप उन आगे/पीछे बटन का उपयोग आप 'DOMNodeInserted' ईवेंट प्राप्त हो सकता है:

+0

मुझे नहीं लगता कि आपको प्रॉक्सी का उपयोग करना होगा - क्या आप केवल 'window.onpopstate' ईवेंट को संभाल नहीं सकते ? – Coderer

+0

'ऑनपॉपस्टेट' का पता नहीं लगाता है जब पुशस्टेट को नए पृष्ठों के लिए बुलाया जाता है, बस जब आप आगे या पीछे बटन (या आगे और पीछे एपीआई कॉल) का उपयोग करते हैं। – rampion

+0

इस दृष्टिकोण के साथ समस्या यह है कि नए पेज तत्वों को 'old.apply (window.history, तर्क)' रिटर्न के बाद लोड नहीं किया गया है, इसलिए यह आपकी स्क्रिप्ट को संसाधित करने के लिए तैयार नहीं हो सकता है। – rampion

3

एक और दृष्टिकोण पेज के लिए DOMNodeInserted हुक करने, और जब पथ प्रविष्टि के बाद /messages से मेल खाता है चलाने के लिए है उस सामग्री के लिए जो उस पृष्ठ पर पुन: सम्मिलित किया जा रहा है जिसे आपने पहले से ही अपनी स्क्रिप्ट के साथ संशोधित कर दिया है, इसलिए आपको यह सुनिश्चित करना होगा कि आप जो भी सामान्य रूप से पेज पर करते हैं, वह पहले से ही किए गए हैं, डुप्लिकेट नियंत्रण डालने से रोकने के लिए या जो भी हो ।

0

+1 @rampion सुझावों के लिए +1। मैं एक साधारण रीडायरेक्ट करना चाहता था हालांकि पेज पर तत्वों की तलाश करना बहुत उपयोगी नहीं था क्योंकि मैं उपयोगकर्ता को अप्रत्याशित रूप से रीडायरेक्ट नहीं करना चाहता था।

if (document.addEventListener){ 
    document.addEventListener("click", function(event) { 
    var targetElement = event.target || event.srcElement; 
    // TODO: support deeper search for parent element with a href attribute 
    var href = targetElement.getAttribute('href') || targetElement.parentElement.getAttribute('href') ; 
    if (href && videoURLRe.test(href)) { 
     var target = ""; 
     if (href.indexOf("/") == 0) { 
     target = "https://m.facebook.com" + href 
     } else { 
     target = href.replace("www.facebook", "m.facebook"); 
     } 
     window.location.assign(target); 
    } 
    }, true); 
} 

सुंदर स्वच्छ काम करता है:

वैसे भी, मैं एक श्रोता कि जहां विशेष href के साथ एक लिंक पर क्लिक करने पर जरूरत अनुप्रेषित हैं स्थापित करने के लिए इस कोड का इस्तेमाल किया। मुझे सही तीसरे addEventListener param को समझना था ताकि मेरा श्रोता किसी अन्य के सामने निष्पादित किया जा सके।

पूर्ण स्क्रिप्ट देखने के लिए https://greasyfork.org/en/scripts/8176-switch-to-mobile-version-on-facebook-video-page

पर मैं किसी भी तरह मज़बूती से वेब साइट के द्वारा प्रयोग किया है कि URL बदल विधि की परवाह किए बिना यूआरएल परिवर्तन का पता लगाने के लिए नहीं मिल सका। @ एंडी-ई दृष्टिकोण बहुत अच्छा लगता है लेकिन किसी कारण से मेरे लिए काम नहीं किया। शायद मैं ठीक से स्क्रिप्ट @grant टैग नहीं कर सका।

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