5

से एकाधिक टाइम्स को पिलिंग करने वाली सामग्री स्क्रिप्ट्स मैं अपने क्रोम एक्सटेंशन को पूरी तरह से चलाने के बहुत करीब हूं, लेकिन अब एक आखिरी समस्या में चल रहा हूं।क्रोम एक्सटेंशन - एजेक्स लिंक/नेविगेशन

समस्या

सामग्री स्क्रिप्ट फेसबुक, जहां पूरे पृष्ठ एक लिंक पर क्लिक करने पर पुनः लोड नहीं है, आदि जैसी साइटों पर बार-बार इंजेक्शन जा रहा से संबंधित प्रतीत हो रहा है ...

मुझे लगता है कि इस मुद्दे से संबंधित है साइट बहुत AJAX- निर्भर है।

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

हालांकि, अगर मैं पृष्ठ को प्रारंभिक समय लोड करता हूं, तो साइट पर एक लिंक पर क्लिक करें, फेसबुक के "सामग्री अनुभाग" पर क्लिक किए गए लिंक को लोड किया जाएगा, जबकि शीर्ष पर चलने वाली नीली नेविगेशन बार ' रीफ्रेश या बिल्कुल बदलना नहीं है।

आईई। पूरा पृष्ठ पुनः लोड नहीं होता है। चूंकि साइट के "सामग्री अनुभाग" और नेविगेशन बार दोनों एक ही फ्रेम में हैं, इसलिए सामग्री स्क्रिप्ट केवल आपके द्वारा क्लिक किए जाने वाले प्रत्येक लिंक के लिए एक और बार इंजेक्शन लेती रहती है।

तो अंततः मैं अपने कंसोल लॉग में देखता हूं कि यह 2 एक्स, 3 एक्स, 4 एक्स, 5 एक्स आदि चल रहा है .. जैसा कि मैं अधिक लिंक पर क्लिक करता हूं, संख्या प्रत्येक बार 1 से बढ़ जाती है।

वहाँ यदि सामग्री स्क्रिप्ट के पहले ही इसे फिर से इंजेक्शन लगाने से पहले मौजूद है/सक्रिय जाँच करने के लिए एक आसान तरीका है:

तो मेरे सवाल है? या इस तरह की स्थिति के लिए काम के आसपास के रूप में और क्या उपयोग किया जा सकता है?

उत्तर

1

मैंने अपने एक्सटेंशन के लिए सामग्री स्क्रिप्ट लिखते समय भी इसी तरह की समस्या की भविष्यवाणी की, इसलिए मैंने विस्तार पृष्ठ और संस्करण के साथ प्रत्येक पृष्ठ के <body> तत्व में एक अद्वितीय विशेषता जोड़ा।

सामग्री स्क्रिप्ट की पहली बात यह जांचती है कि क्या यह विशेषता पहले से ही स्क्रिप्ट और बंद हो जाती है या नहीं। अन्यथा, यह इस विशेषता को जोड़ देगा (true के मान के साथ) और इसके उद्देश्य से जारी रखें।

यदि आप मेरा solution देखना चाहते हैं;

इस तकनीक का थोड़ा अधिक जटिल पहलू message passing का उपयोग कर संस्करण ला रहा है और एक JSON ऑब्जेक्ट में मैनिफेस्ट (AJAX अनुरोध में पुनर्प्राप्त) का विश्लेषण कर रहा है।

यह देखने के लिए कि मैंने init और onRequestHelper फ़ंक्शन here पर इस रूप को कैसे देखा है;

बेशक, आप संस्करण को कड़ी मेहनत कर सकते हैं या इसे पूरी तरह से छोड़ सकते हैं। जब तक विशेषता का नाम अद्वितीय है।

+0

लिंक और कोड नमूने के लिए धन्यवाद अपनी सामग्री स्क्रिप्ट लोड! – delta9

+0

मेरा मानना ​​है कि उसके समाधान के लिए अपडेट किया गया लिंक अब https://github.com/neocotic/template/blob/master/chrome/bin/lib/content.js –

+0

धन्यवाद @ सराहवेसेल, मैंने सभी प्रासंगिक लिंक अपडेट किए हैं। – Alasdair

1

मूल फ्रेम में, क्या आप window.doneInjecting = true; या कुछ इसी तरह जोड़ सकते हैं? (या शायद पृष्ठ पर एक छिपा तत्व जोड़ें - मुझे यकीन नहीं है कि क्या बच्चे के फ्रेम उनके माता-पिता के जावास्क्रिप्ट चर का उपयोग कर सकते हैं)

लेकिन मूल रूप से एक साधारण ध्वज सेट करना, ताकि प्रत्येक बार आपकी सामग्री स्क्रिप्ट इंजेक्शन दी जाए, जांचें कि क्या ध्वज मौजूद है और केवल तब जारी रहता है जब यह नहीं करता?

1

हर बार एक टैब के राज्य में परिवर्तन होने पर अद्यतन आग लगती है।बस changeInfo.status == "complete"

background.js

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
chrome.tabs.getSelected(null, function(tab) { 
    // Do some stuff 
    if (changeInfo.status == "complete") 
    { 
     // load your scripts here 
     chrome.tabs.executeScript(tabId, {file: "jquery.js"}); 
     chrome.tabs.executeScript(tabId, {file: "jquery.highlight.js"}); 
    } 
}); 
}); 
संबंधित मुद्दे