2011-02-12 13 views
22

मैं फ़ायरफ़ॉक्स के लिए प्लग-इन लिख रहा हूं और ऐसा करने के लिए greasemonkey स्क्रिप्ट का उपयोग कर रहा हूं (मैं इस टूल का उपयोग कर उपयोगकर्ता स्क्रिप्ट संकलित करता हूं http://arantius.com/misc/greasemonkey/script-compiler)।पेज सामग्री प्रदर्शित होने से पहले greasemonkey स्क्रिप्ट कैसे चलाएं?

समस्या यह है कि पृष्ठ पूरी तरह से लोड होने के बाद स्क्रिप्ट चलाया जाता है। इसका अर्थ यह है कि उपयोगकर्ता देखे गए पृष्ठ को अपने मूल रूप में देखेगा और फिर स्क्रिप्ट मेरे द्वारा किए गए परिवर्तनों को लागू करेगी। मेरा प्रश्न उपयोगकर्ता की पृष्ठ की सामग्री को उपयोगकर्ता के सामने प्रदर्शित होने से पहले उपयोगकर्ता स्क्रिप्ट चलाने का कोई तरीका है, इसलिए उपयोगकर्ता केवल वेबसाइट का अंतिम संस्करण होगा?

+0

संभवत: उस कंपाइलर द्वारा उत्पन्न ऐड-ऑन के साथ संभव नहीं है - जो, जीएम की तरह, डीओएम पूरी तरह से लोड होने और जावास्क्रिप्ट इंजेक्शन द्वारा संचालित होने के बाद चलाया जाता है। पृष्ठ को फ़िल्टर करने के लिए आपको शायद "विशिष्ट" ऐड-ऑन/एक्सटेंशन तकनीकों का उपयोग करने की आवश्यकता है। यही है, आपको एक जीएम लिपि बंदरगाह नहीं, एक एक्सटेंशन लिखने की जरूरत है। –

+0

भले ही आप एक एक्सटेंशन लिखते हैं, ब्राउज़र पूरी तरह से लोड होने से पहले पृष्ठ को अपने मूल रूप में प्रदर्शित करना शुरू कर देगा। – Neil

उत्तर

24

संपादित करें: इस पोस्ट में Greasemonkey में @run-at कुंजी के क्रियान्वयन से पहले बनाया गया था - के रूप में ब्लेज द्वारा बताया गया है, Greasemonkey 0.9.8 अब आप स्क्रिप्ट के रूप में जल्द ही पेज लोड करने के लिए शुरू होता है के रूप में निष्पादित कर सकने वाले।

@run-at document-start विकि में वर्णित इस प्रकार है:

प्रारंभ संस्करण 0.9.8 के रूप में नया है। किसी भी स्क्रिप्ट चलाने या छवियों के लोड होने से पहले, किसी भी दस्तावेज़ लोड होने से पहले स्क्रिप्ट चलाएगी।

ध्यान दें कि इसका मतलब है कि डीओएम के निर्माण से पहले स्क्रिप्ट (संभावित रूप से) चलाना और कुछ असंगत/असामान्य व्यवहार हो सकता है। आपको केवल एक-पंक्ति ड्रॉप-इन की आवश्यकता होगी (थोड़ा)। http://wiki.greasespot.net/Metadata_Block#.40run-at

साइड नोट:

Greasemonkey विकी पर अधिक कुछ और बाते हैं हाथ करने के लिए जानकारी मेरे पास है विशेष रूप से ब्राउज़र में Greasemonkey से संबंधित है। मुझे यकीन है कि @run-at document-start स्क्रिप्ट कंपाइलर के साथ अच्छी तरह से काम करता है - मैं खतरनाक रूप से रहने का सुझाव देता हूं .. इसका परीक्षण करें और पता लगाएं! ;]



यह वर्तमान में संभव नहीं से पहले पृष्ठ लोड एक उपयोगकर्ता स्क्रिप्ट चलाने के लिए है।

Greasemonkey के वर्तमान संस्करण का उपयोग कर झिलमिलाहट रोकने के लिए, आप अपने Firefox प्रोफ़ाइल के लिए एक उपयोगकर्ता के शैली जोड़ने Greasemonkey wiki में वर्णित के रूप में (जो तब स्क्रिप्ट का उपयोग कर नष्ट कर दिया जाता है) की कोशिश कर सकते हैं लेकिन यह भी में से प्रत्येक की आवश्यकता होगी आपकी उपयोगकर्ताओं से इसका लाभ उठाने के लिए ऐसा ही करना है।

यह कुछ है कि एक लंबे समय के लिए वांछित किया गया है और issue #1103 Greasemonkey के Github साइट पर के माध्यम से देख, एक कार्यशील प्रोटोटाइप बनाया गया है प्रतीत होता है (लेकिन कोई timescale के लिए यह एक रिलीज़ संस्करण के लिए afaik जोड़े जाने के लिए है)।

+2

वह बग ठीक कर दिया गया है और अब आप इसे मेटा सेक्शन में जोड़कर पेज लोड से पहले स्क्रिप्ट चला सकते हैं: '@ run-at document-start' – Blaise

+0

चीयर्स ब्लेज़ - मैंने पहले से ही Greasemonkey में हुए बदलावों को प्रतिबिंबित करने के लिए अपना उत्तर अपडेट किया है जवाब पोस्ट करना मुझे यकीन नहीं है कि '@ रन-ऑन दस्तावेज़-स्टार्ट' स्क्रिप्ट कंपाइलर के साथ कितनी अच्छी तरह काम करता है क्योंकि मैं थोड़ी देर के लिए Greasemonkey के साथ शामिल नहीं हूं। – kwah

2

@run-at document-start का उपयोग करते हुए 0kका उपयोग करते हुए जैसा कि मेरी स्क्रिप्ट द्वारा उत्तर में दी गई सामग्री से पहले निष्पादित किया गया था, जिसे मैं मैनिपुलेट करना चाहता था, दस्तावेज़ निकाय में था। एक काम के आसपास के रूप में मैंने अपनी स्क्रिप्ट को 5 बार/सेकंड तक document.readyState == "complete" तक (या 20 सेकंड बीतने तक) अंतराल स्थापित किया।

// ==UserScript== 
// ... 
// @run-at  document-start 
// ==/UserScript== 

var greasemonkeyInterval = setInterval(greasemonkey, 200); 
var greasemonkeyStart = (new Date()).getTime(); 

function greasemonkey() { 

    // ... 

    // waiting for readyState (or timeout) 
    if (
     (new Date()).getTime() - greasemonkeyStart > 20000 
     || document.readyState == "complete" 
    ) { 
     clearInterval(greasemonkeyInterval); 
    } 

}; 

आप के बारे में है कि सामग्री documentready पर होगा अधिक आश्वस्त हैं कि मुझे लगता है कि कुछ इस तरह अधिक बेहतर होगा:

function greasemonkey() { 

    if (
     document.readyState != "interactive" 
     && document.readyState != "complete" 
    ) { 
     return; 
    } 

    // ... 

    clearInterval(greasemonkeyInterval); 

} 
2

यह मेरे मामले के लिए अच्छी तरह से काम पिछले उत्तरों के अलावा मुझे एक समाधान मिला है जो फ़ायरफ़ॉक्स & ग्रीसमोन्की के पिछले संस्करणों की तरह ही काम करता है। पहले, रन पर जल्द से जल्द पल में सेट होना चाहिए, तो दस्तावेज़ से शुरू:

// @run-at  document-start 

क्योंकि डोम शायद अभी तक लोड नहीं है, दस्तावेज़ प्राप्त करने के लिए प्रतीक्षा एक इंटरैक्टिव की readyState:

document.onreadystatechange = function() { 
    if (document.readyState === "interactive") { 
     // Do something 
    } 
} 

जबकि Greasemonkey दस्तावेज़-अंत के साथ समान या कम लागू करता है, मैंने देखा है कि ऊपर की तकनीक तेजी से काम करती है। इसका उपयोग करके फ़ायरफ़ॉक्स में मेरे द्वारा किए गए सभी मुद्दों को हल किया गया है जब पेजों पर चमकते/कूदते हुए स्क्रीन होते हैं, जब डोम बदलता है और उपयोगकर्ता को कॉपीराइट के साथ सीधे पृष्ठ लोड करता है।