javascript - क्रोम पर Greasemonkey स्क्रिप्ट से पृष्ठ में जेएस कार्यों इंजेक्शन




google-chrome google-chrome-extension (3)

मैंने Greasemonkey विकी पर असुरक्षित विन्डो के विकल्पों पर एक त्वरित नज़र डाली , लेकिन वे सभी बहुत बदसूरत लग रहे हैं। क्या मैं पूरी तरह से गलत ट्रैक पर हूं या क्या मुझे इनका अधिक बारीकी से देखना चाहिए?

आपको देखना चाहिए, क्योंकि यह केवल उपलब्ध विकल्प है। मैं स्थान हैक का उपयोग करना पसंद करूंगा।

myscript.user.js:

function myFunc(){
  alert('Hello World!');
}

location.href="javascript:(function(){" + myFunc + "})()"

example.com/mypage.html

<script>
myFunc() // Hello World!
</script>

निश्चित रूप से, यह बदसूरत है। लेकिन यह अच्छी तरह से काम कर रहा है।

मैक्स एस द्वारा वर्णित सामग्री स्कोप धावक विधि स्थान हैक से बेहतर है, क्योंकि इसे डीबग करना आसान है।

मेरे पास Greasemonkey स्क्रिप्ट है जो फ़ायरफ़ॉक्स और ओपेरा में ठीक काम करती है। हालांकि, मैं इसे क्रोम में काम करने के लिए संघर्ष करने के साथ संघर्ष करता हूं। समस्या उस पृष्ठ में फ़ंक्शन इंजेक्शन दे रही है जिसे पृष्ठ से कोड द्वारा बुलाया जा सकता है। यहां मैं अब तक क्या कर रहा हूं:

सबसे पहले, मुझे फ़ायरफ़ॉक्स के लिए unsafeWindow एक सहायक संदर्भ मिलता है। यह मुझे एफएफ और ओपेरा (और क्रोम, मैंने सोचा) के लिए एक ही कोड रखने की अनुमति देता है।

var uw = (this.unsafeWindow) ? this.unsafeWindow : window;

इसके बाद, मैं पृष्ठ में एक फ़ंक्शन इंजेक्ट करता हूं। यह वास्तव में सिर्फ एक बहुत ही पतला आवरण है जो मेरी जीएम लिपि के संदर्भ में संबंधित कार्य को आमंत्रित करने के अलावा कुछ भी नहीं करता है:

uw.setConfigOption = function(newValue) {
    setTimeout(setConfigOption, 0, newValue);
}

फिर, मेरी स्क्रिप्ट में संबंधित फ़ंक्शन सही है:

setConfigOption = function(newValue) {
    // do something with it, e.g. store in localStorage
}

अंत में, मैं फ़ंक्शन को आमंत्रित करने के लिंक के साथ पृष्ठ में कुछ HTML इंजेक्ट करता हूं।

var p = document.createElement('p');
p.innerHTML = '<a href="javascript:setConfigOption(1)">set config option to 1</a>';
document.getElementById('injection-point').appendChild(p);

संक्षेप में: फ़ायरफ़ॉक्स में, जब उपयोगकर्ता उस इंजेक्शन वाले लिंक पर क्लिक करता है, तो यह असुरक्षित विन्डो पर फ़ंक्शन कॉल निष्पादित करेगा, जो तब एक टाइमआउट ट्रिगर करता है जो मेरी जीएम स्क्रिप्ट के संदर्भ में संबंधित फ़ंक्शन को आमंत्रित करता है, जो तब वास्तविक प्रसंस्करण करता है। (अगर मैं यहाँ गलत हूं तो मुझे सही करें।)

क्रोम में, मुझे बस एक "अनचाहे संदर्भ त्रुटि प्राप्त करें: setConfigOption परिभाषित नहीं किया गया है" त्रुटि। और वास्तव में, कंसोल में "window.setConfigOption" दर्ज करना एक "अपरिभाषित" उत्पन्न करता है। फायरबग और ओपेरा डेवलपर कंसोल में, फ़ंक्शन वहां है।

शायद ऐसा करने का एक और तरीका है, लेकिन मेरे कुछ कार्यों को पृष्ठ पर एक फ्लैश ऑब्जेक्ट द्वारा बुलाया जाता है, जो मुझे विश्वास है कि यह आवश्यक है कि मेरे पास पृष्ठ संदर्भ में कार्य हो।

मैंने Greasemonkey विकी पर असुरक्षित विन्डो के विकल्पों पर एक त्वरित नज़र डाली , लेकिन वे सभी बहुत बदसूरत लग रहे हैं। क्या मैं पूरी तरह से गलत ट्रैक पर हूं या क्या मुझे इनका अधिक बारीकी से देखना चाहिए?

समाधान: मैक्स एस का पीछा किया सलाह और यह अब फ़ायरफ़ॉक्स और क्रोम दोनों में काम करता है। चूंकि मुझे पृष्ठ पर उपलब्ध होने वाले कार्यों को नियमित रूप से वापस कॉल करना था, इसलिए मैंने अपनी पूरी स्क्रिप्ट को पृष्ठ पर ले जाया, यानी यह पूरी तरह से उस समारोह में लपेटा गया जिसे उसने 'मुख्य ()' कहा था।

उस हैक की अतिरिक्त बदसूरतता थोड़ा और अधिक सहनशील बनाने के लिए, मैं कम से कम असुरक्षित विन्डो और wrappedJSObject के उपयोग को छोड़ सकता है।

मैं अभी भी Greasemonkey विकी काम से सामग्री स्कोप धावक प्राप्त करने में कामयाब नहीं रहा है। यह वही करना चाहिए और ऐसा लगता है कि यह ठीक है, लेकिन उदाहरण के लिए, मेरे कार्य पृष्ठ से <a> तत्वों तक कभी भी पहुंच योग्य नहीं हैं। मैंने अभी तक यह नहीं पता लगाया है कि वह क्यों है।


अन्य उत्तरों या तो आपको फ़ंक्शन एक्सप्रेशन का उपयोग करने, बाहरी अतिरिक्त फ़ाइल आयात करने या लंबे पैच किए गए हैक का उपयोग करने के लिए मजबूर करते हैं।

यह उत्तर सीधे पृष्ठ में जावास्क्रिप्ट को आपके स्रोत कोड से जोड़ देगा। यह पृष्ठ पर आसानी से बहु-लाइन जावास्क्रिप्ट स्ट्रिंग प्राप्त करने के लिए ईसीएमएस्क्रिप्ट 6 (ES6) टेम्पलेट अक्षर का उपयोग करेगा।

var script = document.createElement('script'); 
script.type = "text/javascript"; 
script.innerHTML = ` 
   function test() {
      alert(1);
   }
`;
document.getElementsByTagName('head')[0].appendChild(script);

कृपया बैकटिक्स `` नोट करें जो एक बहु-पंक्ति स्ट्रिंग की शुरुआत और अंत को परिभाषित करता है।


मेरे पास यह है :

contentcript.js:

function injectJs(link) {
var scr = document.createElement('script');
scr.type="text/javascript";
scr.src=link;
document.getElementsByTagName('head')[0].appendChild(scr)
//document.body.appendChild(scr);
}

injectJs(chrome.extension.getURL('injected.js'));

इंजेक्शन.जेएस:

function main() {
     alert('Hello World!');
}

main();




userscripts