javascript - क्रोम सामग्री स्क्रिप्ट काम नहीं कर रहे हैं: DOMContentLoaded श्रोता निष्पादित नहीं करता है
google-chrome google-chrome-extension (1)
आप आग के लिए सुन रहे घटना के बाद अपनी स्क्रिप्ट इंजेक्शन कर रहे हैं (इस मामले में, 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.
}
- यदि आप
tabs.executeScript()
का उपयोग कर रहे हैं, तो मूल्य जिसे आपrunAt
लिए प्रदान करते हैं, केवल यह इंगित करता है कि स्क्रिप्ट इंजेक्शन के लिए जल्द से जल्द चाहते हैं। यदि आप उस समय से पहलेtabs.executeScript()
निष्पादित कर रहे हैं, तो निर्दिष्ट समय तक इंजेक्शन देरी हो रही है। नोट करें किdocument_start
के लिए, जबtabs.executeScript()
को निष्पादित करते हैं, तबtabs.executeScript()
को एक नया पृष्ठ एक वैध विषय के लिए मान्य होगा, जो अपने प्रश्न / उत्तर के योग्य है। - इस उत्तर के अंश मेरे "सक्रिय HTML पृष्ठ में एक बटन क्लिक का पता लगाने और संभाल करने" के जवाब से कॉपी किए गए थे।
मैं कोड विस्तार की कोशिश कर रहा हूं जो 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 हैं, हो सकता है कि सामग्री स्क्रिप्ट पृष्ठ (और टैग) का उपयोग नहीं कर सके?