javascript - क्रोम सामग्री स्क्रिप्ट काम नहीं कर रहे हैं: DOMContentLoaded श्रोता निष्पादित नहीं करता है



google-chrome google-chrome-extension (1)

मैं कोड विस्तार की कोशिश कर रहा हूं जो 1 मंच पर गलत वर्तनी सुधारता है।

मैं सामग्री स्क्रिप्ट के साथ <p> टैग का उपयोग करने की कोशिश कर रहा हूं, लेकिन यह कुछ भी नहीं बदलता है (नीचे दिए गए कोड का उपयोग करके):

document.addEventListener("DOMContentLoaded", function() {
    document.getElementsByTagName("P")[4].innerHTML = "correct_word"; 
}); 

यह एक्सटेंशन के रूप में जोड़ते समय कुछ भी नहीं बदलता है, जाहिरा तौर पर अगर मैं पेज को wget हूं, और वहां स्क्रिप्ट डालता हूं, तो सभी काम करता है कोई विचार?

मेरी manifest.json फ़ाइल:

{
    "manifest_version": 2,
    "name": "Extension",
    "description": "Description",
    "version": "1.0",
    "content_scripts": [{
        "run_at": "document_end",
        "matches": ["http://example.com/"],
        "js": ["script.js"]
    }],
    "web_accessible_resources": ["Filedeleted(really).html"]
}

मुझे पता है कि सामग्री स्क्रिप्ट और WWW पृष्ठों के अलग-अलग sandboxes हैं, हो सकता है कि सामग्री स्क्रिप्ट पृष्ठ (और टैग) का उपयोग नहीं कर सके?


आप आग के लिए सुन रहे घटना के बाद अपनी स्क्रिप्ट इंजेक्शन कर रहे हैं (इस मामले में, DOMContentLoaded )। इस प्रकार, आपके पास श्रोता में मौजूद कोई भी कोड निष्पादित नहीं किया जाएगा, क्योंकि आपके श्रोता को जोड़ने के बाद इस घटना को कभी भी आग नहीं लगती है।

क्रोम एक्सटेंशन और फ़ायरफ़ॉक्स वेबएक्सटेंशन में, इंजेक्शन के लिए सामग्री स्क्रिप्ट के लिए एक समय निर्दिष्ट करते समय, आप "document_start" , "document_end" , या "document_idle" निर्दिष्ट कर सकते हैं। 1 एक manifest.json में यह मूल्य है run_at संपत्ति के लिए कहा गया है tabs.executeScript() , यह runAt गुण है

  • document_start
    इंजेक्शन डीओएम से पहले बनाया जाता है, या पेज चलने वाले स्क्रिप्ट्स चलते हैं। इसका अर्थ है कि document.body और document.head अभी तक मौजूद नहीं हैं। DOMContentLoaded और window load घटनाओं अभी तक नहीं निकाल दिया है। आप DOM को document.documentElement . document.documentElement जोड़कर चीजों को जोड़ सकते हैं। आपको डीओएम में जोड़ा जाने वाले तत्वों के लिए देखने के लिए एक MutationObserver का उपयोग करने की आवश्यकता हो सकती है, या यह सूचित करने के लिए कि डोम उपलब्ध है, जैसे किसी ईवेंट की प्रतीक्षा करें।
  • document_end (डिफ़ॉल्ट)
    डीओएम पूर्ण होने के बाद इंजेक्शन होता है, लेकिन उप-स्रोत (जैसे छवियों और फ्रेम) लोड होने से पहले। यह आम तौर पर DOMContentLoaded बाद निकाल दिया गया है, लेकिन window load इवेंट आग से पहले।
  • document_idle
    इंजेक्शन document_end end के कुछ समय बाद होता document_end और window load इवेंट आग लगने के तुरंत बाद। उत्तर "जब रन_ैट होता है: document_idle सामग्री स्क्रिप्ट चलाता है?" इंगित करता है कि यह पहले है:

    • window load घटना के बाद आग, या
    • DOMContentLoaded घटना निकाल के बाद 200ms।

    इसका अर्थ है कि DOMContentLoaded द्वारा निकाल दिए जाने के बाद आपकी सामग्री स्क्रिप्ट को इंजेक्शन किया जाएगा, लेकिन window load ईवेंट शायद ही पहले से निकाल दिया गया हो।

जब DOMContentLoaded , या window load लिए सुन रहे window , तो आपको document.readyState जांच करनी चाहिए

किसी भी समय आप किसी DOMContentLoaded श्रोता या window load श्रोता का उपयोग करते हैं, तो आपको हमेशा document.readyState जांच करनी चाहिए। इससे पहले कि आप DOMContentLoaded ईवेंट (या load इवेंट निकाल दिया जा रहा है, अगर आप यही सुन रहे हैं) जब आप इन घटनाओं के लिए सुनना चाहते हैं तो यह सामान्य आदत होनी चाहिए। अगर ईवेंट को निकाल दिया गया है तो आप श्रोता को जोड़ते हैं, तो श्रोता कभी नहीं चलेंगे।

एक DOMContentLoaded श्रोता को जोड़ने के लिए, आपको कुछ ऐसा प्रयोग करना चाहिए:

if(document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded',afterDOMLoaded);
} else {
    afterDOMLoaded();
}

function afterDOMLoaded(){
    //Everything that needs to happen after the DOM has initially loaded.
}

एक window load श्रोता जोड़ने के लिए, आप कुछ ऐसा प्रयोग कर सकते हैं:

if(document.readyState !== 'complete') {
    window.addEventListener('load',afterWindowLoaded);
} else {
    afterWindowLoaded();
}

function afterWindowLoaded(){
    //Everything that needs to happen after the window is fully loaded.
}
  1. यदि आप tabs.executeScript() का उपयोग कर रहे हैं, तो मूल्य जिसे आप runAt लिए प्रदान करते हैं, केवल यह इंगित करता है कि स्क्रिप्ट इंजेक्शन के लिए जल्द से जल्द चाहते हैं। यदि आप उस समय से पहले tabs.executeScript() निष्पादित कर रहे हैं, तो निर्दिष्ट समय तक इंजेक्शन देरी हो रही है। नोट करें कि document_start के लिए, जब tabs.executeScript() को निष्पादित करते हैं, तब tabs.executeScript() को एक नया पृष्ठ एक वैध विषय के लिए मान्य होगा, जो अपने प्रश्न / उत्तर के योग्य है।
  2. इस उत्तर के अंश मेरे "सक्रिय HTML पृष्ठ में एक बटन क्लिक का पता लगाने और संभाल करने" के जवाब से कॉपी किए गए थे।




content-script