सामग्री स्क्रिप्ट का उपयोग करके पृष्ठ संदर्भ में कोड डालें


480

मैं क्रोम एक्सटेंशन बनाने का तरीका सीख रहा हूं। मैंने अभी-अभी YouTube ईवेंट्स को पकड़ने के लिए एक विकसित करना शुरू किया है। मैं इसे YouTube फ़्लैश प्लेयर के साथ उपयोग करना चाहता हूं (बाद में मैं इसे HTML5 के साथ संगत बनाने का प्रयास करूंगा)।

manifest.json:

{
    "name": "MyExtension",
    "version": "1.0",
    "description": "Gotta catch Youtube events!",
    "permissions": ["tabs", "http://*/*"],
    "content_scripts" : [{
        "matches" : [ "www.youtube.com/*"],
        "js" : ["myScript.js"]
    }]
}

myScript.js:

function state() { console.log("State Changed!"); }
var player = document.getElementById("movie_player");
player.addEventListener("onStateChange", "state");
console.log("Started!");

समस्या यह है कि कंसोल मुझे "प्रारंभ" देता है ! , लेकिन कोई "स्टेट चेंजेड" नहीं है। जब मैं YouTube वीडियो चलाता / रोकती हूं।

जब यह कोड कंसोल में डाला जाता है, तो यह काम करता है। मैं क्या गलत कर रहा हूं?


14
अपने फंक्शन नाम के आसपास के कोट्स को हटाने की कोशिश करें:player.addEventListener("onStateChange", state);
एडुआर्डो

2
यह भी उल्लेखनीय है कि जब मैच लिखते हैं, तो शामिल करना न भूलें https://या http://, यह www.youtube.com/*आपको विस्तार नहीं करने देगा और मिसिंग स्कीम सेपरेटर एरर
निलय विश्वकर्मा

जवाबों:


874

सामग्री स्क्रिप्ट को "पृथक विश्व" वातावरण में निष्पादित किया जाता है । आपको अपने state()तरीके को पेज में ही इंजेक्ट करना होगा ।

जब आप chrome.*स्क्रिप्ट में किसी एक एपीआई का उपयोग करना चाहते हैं , तो आपको एक विशेष ईवेंट हैंडलर लागू करना होगा, जैसा कि इस उत्तर में वर्णित है: जीमेल के मूल संदेश को पुनः प्राप्त करते हुए क्रोम एक्सटेंशन -

अन्यथा, यदि आपको chrome.*एपीआई का उपयोग नहीं करना है, तो मैं एक <script>टैग जोड़कर पृष्ठ में आपके सभी जेएस कोड को इंजेक्ट करने की दृढ़ता से सलाह देता हूं :

विषय - सूची

  • विधि 1: किसी अन्य फ़ाइल को इंजेक्ट करें
  • विधि 2: एम्बेडेड कोड इंजेक्ट करें
  • विधि 2 बी: एक फ़ंक्शन का उपयोग करना
  • विधि 3: इनलाइन ईवेंट का उपयोग करना
  • इंजेक्शन कोड में गतिशील मूल्य

विधि 1: किसी अन्य फ़ाइल को इंजेक्ट करें

जब आपके पास बहुत सारे कोड हों तो यह सबसे आसान / सर्वोत्तम तरीका है। अपने वास्तविक जेएस कोड को अपने एक्सटेंशन में एक फ़ाइल में शामिल करें, कहते हैं script.js। फिर अपनी सामग्री लिपि को इस प्रकार रखें (यहाँ बताया गया है: Google Chome "एप्लिकेशन शॉर्टकट" कस्टम जावास्क्रिप्ट ):

var s = document.createElement('script');
// TODO: add "script.js" to web_accessible_resources in manifest.json
s.src = chrome.runtime.getURL('script.js');
s.onload = function() {
    this.remove();
};
(document.head || document.documentElement).appendChild(s);

नोट: यदि आप इस विधि का उपयोग करते हैं, तो इंजेक्ट की गई script.jsफ़ाइल को "web_accessible_resources"अनुभाग ( उदाहरण ) में जोड़ना होगा । यदि आप नहीं करते हैं, तो Chrome आपकी स्क्रिप्ट को लोड करने और कंसोल में निम्न त्रुटि प्रदर्शित करने से इनकार करेगा :

क्रोम-एक्सटेंशन का अस्वीकृत भार: // [EXTENSIONID] /script.js। एक्सटेंशन के बाहर पृष्ठों द्वारा लोड किए जाने के लिए संसाधन web_accessible_resources मेनिफ़ेस्ट में सूचीबद्ध होने चाहिए।

विधि 2: एम्बेडेड कोड इंजेक्ट करें

यह विधि उपयोगी है जब आप जल्दी से एक छोटा सा कोड चलाना चाहते हैं। (यह भी देखें: क्रोम एक्सटेंशन के साथ फेसबुक हॉटकी को कैसे निष्क्रिय करें? )।

var actualCode = `// Code here.
// If you want to use a variable, use $ and curly braces.
// For example, to use a fixed random number:
var someFixedRandomValue = ${ Math.random() };
// NOTE: Do not insert unsafe variables in this way, see below
// at "Dynamic values in the injected code"
`;

var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.remove();

नोट: टेम्पलेट शाब्दिक केवल क्रोम 41 और इसके बाद के संस्करण में समर्थित हैं। यदि आप क्रोम 40 में काम करने के लिए एक्सटेंशन चाहते हैं, तो उपयोग करें:

var actualCode = ['/* Code here. Example: */' + 'alert(0);',
                  '// Beware! This array have to be joined',
                  '// using a newline. Otherwise, missing semicolons',
                  '// or single-line comments (//) will mess up your',
                  '// code ----->'].join('\n');

विधि 2 बी: एक फ़ंक्शन का उपयोग करना

कोड का एक बड़ा हिस्सा के लिए, स्ट्रिंग को उद्धृत करना संभव नहीं है। एक सरणी का उपयोग करने के बजाय, एक फ़ंक्शन का उपयोग किया जा सकता है, और कड़े हो सकते हैं:

var actualCode = '(' + function() {
    // All code is executed in a local scope.
    // For example, the following does NOT overwrite the global `alert` method
    var alert = null;
    // To overwrite a global variable, prefix `window`:
    window.alert = null;
} + ')();';
var script = document.createElement('script');
script.textContent = actualCode;
(document.head||document.documentElement).appendChild(script);
script.remove();

यह विधि काम करती है, क्योंकि +स्ट्रिंग और एक फ़ंक्शन पर ऑपरेटर सभी वस्तुओं को एक स्ट्रिंग में परिवर्तित करता है। यदि आप एक से अधिक बार कोड का उपयोग करने का इरादा रखते हैं, तो कोड पुनरावृत्ति से बचने के लिए फ़ंक्शन बनाना बुद्धिमानी है। एक कार्यान्वयन की तरह लग सकता है:

function injectScript(func) {
    var actualCode = '(' + func + ')();'
    ...
}
injectScript(function() {
   alert("Injected script");
});

नोट: चूंकि फ़ंक्शन क्रमबद्ध है, मूल गुंजाइश, और सभी बाध्य गुण खो गए हैं!

var scriptToInject = function() {
    console.log(typeof scriptToInject);
};
injectScript(scriptToInject);
// Console output:  "undefined"

विधि 3: इनलाइन ईवेंट का उपयोग करना

कभी-कभी, आप कुछ कोड तुरंत चलाना चाहते हैं, उदाहरण के लिए कुछ कोड चलाने से पहले <head>तत्व बनाया जाता है। यह एक <script>टैग डालने के साथ किया जा सकता है textContent(विधि 2/2 बी देखें)।

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

var actualCode = '// Some code example \n' + 
                 'console.log(document.documentElement.outerHTML);';

document.documentElement.setAttribute('onreset', actualCode);
document.documentElement.dispatchEvent(new CustomEvent('reset'));
document.documentElement.removeAttribute('onreset');

नोट: यह विधि मानती है कि कोई अन्य वैश्विक ईवेंट श्रोता नहीं है जो ईवेंट को संभालता है reset। अगर वहाँ है, तो आप अन्य वैश्विक घटनाओं में से एक को भी चुन सकते हैं। केवल जावास्क्रिप्ट कंसोल खोलें (F12), टाइप करें document.documentElement.on, और उपलब्ध घटनाओं को चुनें।

इंजेक्शन कोड में गतिशील मूल्य

कभी-कभी, आपको इंजेक्ट फ़ंक्शन के लिए एक मनमाना चर पास करना होगा। उदाहरण के लिए:

var GREETING = "Hi, I'm ";
var NAME = "Rob";
var scriptToInject = function() {
    alert(GREETING + NAME);
};

इस कोड को इंजेक्ट करने के लिए, आपको अनाम फ़ंक्शन के लिए चर को तर्क के रूप में पास करना होगा। इसे सही ढंग से लागू करना सुनिश्चित करें! निम्नलिखित काम नहीं करेगा :

var scriptToInject = function (GREETING, NAME) { ... };
var actualCode = '(' + scriptToInject + ')(' + GREETING + ',' + NAME + ')';
// The previous will work for numbers and booleans, but not strings.
// To see why, have a look at the resulting string:
var actualCode = "(function(GREETING, NAME) {...})(Hi, I'm ,Rob)";
//                                                 ^^^^^^^^ ^^^ No string literals!

JSON.stringifyतर्क पारित करने से पहले समाधान का उपयोग करना है। उदाहरण:

var actualCode = '(' + function(greeting, name) { ...
} + ')(' + JSON.stringify(GREETING) + ',' + JSON.stringify(NAME) + ')';

यदि आपके पास कई चर हैं, तो JSON.stringifyपठनीयता में सुधार के लिए एक बार उपयोग करना सार्थक है, इस प्रकार है:

...
} + ')(' + JSON.stringify([arg1, arg2, arg3, arg4]) + ')';

81
यह उत्तर आधिकारिक डॉक्स का हिस्सा होना चाहिए। आधिकारिक डॉक्स को अनुशंसित तरीके से जहाज करना चाहिए -> एक ही काम करने के 3 तरीके ... गलत?
मंगल राबर्टसन

7
@ Qantas94Heavy एक्सटेंशन का CSP सामग्री स्क्रिप्ट को प्रभावित नहीं करता है। केवल पृष्ठ का CSP प्रासंगिक है। विधि 1 script-srcएक्सटेंशन के मूल को छोड़कर एक निर्देश का उपयोग करके अवरुद्ध किया जा सकता है , विधि 2 को "असुरक्षित-इनलाइन" बाहर करने वाले सीएसपी का उपयोग करके अवरुद्ध किया जा सकता है।
रोब डब्ल्यू

3
किसी ने पूछा कि मैं स्क्रिप्ट टैग का उपयोग करके क्यों निकालूं script.parentNode.removeChild(script);। ऐसा करने का मेरा कारण यह है कि मैं अपनी गंदगी को साफ करना पसंद करता हूं। जब एक इनलाइन स्क्रिप्ट दस्तावेज़ में डाली जाती है, तो इसे तुरंत निष्पादित किया जाता है और <script>टैग को सुरक्षित रूप से हटाया जा सकता है।
रोब डब्ल्यू

9
अन्य विधि: location.href = "javascript: alert('yeah')";अपनी सामग्री स्क्रिप्ट में कहीं भी उपयोग करें। कोड के छोटे स्निपेट के लिए यह आसान है, और पृष्ठ की जेएस वस्तुओं तक भी पहुंच सकता है।
21

3
@ क्रिस का उपयोग करने के साथ सावधान रहें javascript:। कई लाइनों पर फैले कोड अपेक्षा के अनुरूप काम नहीं कर सकते हैं। एक पंक्ति-टिप्पणी ( //) शेष को छोटा कर देगी, इसलिए यह विफल हो जाएगा location.href = 'javascript:// Do something <newline> alert(0);';:। यह सुनिश्चित करके कि आप बहु-पंक्ति टिप्पणियों का उपयोग करते हैं, को दरकिनार किया जा सकता है। इससे सावधान रहने वाली एक और बात यह है कि अभिव्यक्ति का परिणाम शून्य होना चाहिए। javascript:window.x = 'some variable';दस्तावेज़ को उतारने का कारण होगा, और 'कुछ चर' वाक्यांश के साथ प्रतिस्थापित किया जाएगा। अगर ठीक से उपयोग किया जाता है, तो यह वास्तव में एक आकर्षक विकल्प है <script>
रॉब डब्ल्यू

61

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

प्राप्तकर्ता पक्ष (या तो आपकी सामग्री स्क्रिप्ट या इंजेक्शन पृष्ठ स्क्रिप्ट) पर एक ईवेंट श्रोता जोड़ें:

document.addEventListener('yourCustomEvent', function (e) {
  var data = e.detail;
  console.log('received', data);
});

आरंभकर्ता पक्ष पर (सामग्री स्क्रिप्ट या इंजेक्शन पृष्ठ स्क्रिप्ट) ईवेंट भेजें:

var data = {
  allowedTypes: 'those supported by structured cloning, see the list below',
  inShort: 'no DOM elements or classes/functions',
};

document.dispatchEvent(new CustomEvent('yourCustomEvent', { detail: data }));

टिप्पणियाँ:

  • DOM मैसेजिंग संरचित क्लोनिंग एल्गोरिथ्म का उपयोग करता है, जो आदिम मूल्यों के अलावा केवल कुछ प्रकार के डेटा को स्थानांतरित कर सकता है । यह क्लास इंस्टेंसेस या फ़ंक्शंस या DOM एलिमेंट्स नहीं भेज सकता।
  • फ़ायरफ़ॉक्स में, कंटेंट स्क्रिप्ट से पेज संदर्भ के लिए एक ऑब्जेक्ट (यानी एक आदिम मूल्य नहीं) भेजने के लिए आपको स्पष्ट रूप से इसे cloneInto(एक अंतर्निहित फ़ंक्शन) का उपयोग करके लक्ष्य में क्लोन करना होगा, अन्यथा यह सुरक्षा उल्लंघन त्रुटि के साथ विफल हो जाएगा। ।

    document.dispatchEvent(new CustomEvent('yourCustomEvent', {
      detail: cloneInto(data, document.defaultView),
    }));

मैं वास्तव में अपने जवाब की दूसरी पंक्ति में stackoverflow.com/questions/9602022/… से कोड और स्पष्टीकरण से जुड़ा हुआ हूं ।
रॉब डब्ल्यू

1
आप अपना अपडेट किया विधि के लिए एक संदर्भ है (उदाहरण के लिए एक बग रिपोर्ट या एक टेस्ट केस?) CustomEventनिर्माता पदावनत प्रतिस्थापित करता है document.createEventएपीआई।
रॉ डब्ल्यू डब्ल्यू

मेरे लिए 'dispatchEvent (नया CustomEvent ...' काम किया। मेरे पास Chrome 33 है। पहले भी यह काम नहीं किया था क्योंकि मैंने js कोड इंजेक्ट करने के बाद addEventListener लिखा था।
jscripter

आप अपने दूसरे पैरामीटर के रूप में CustomEventकंस्ट्रक्टर के लिए क्या करते हैं, इसके बारे में अतिरिक्त सावधान रहें । मैंने 2 बहुत भ्रामक असफलताओं का अनुभव किया है: 1. nullमेरे कंटेंट स्क्रिप्ट के श्रोता द्वारा प्राप्त किए जाने के दौरान केवल 'विस्तार' के आसपास एकल उद्धरण डाल देने से मान बना । 2. इससे भी महत्वपूर्ण बात JSON.parse(JSON.stringify(myData))यह है कि किसी कारण से मुझे यह करना पड़ा या फिर यह बन गया null। यह देखते हुए, यह मुझे प्रतीत होता है कि निम्नलिखित क्रोमियम डेवलपर के दावे - कि "संरचित क्लोन" एल्गोरिथ्म स्वचालित रूप से उपयोग किया जाता है - सच नहीं है। Bugs.chromium.org/p/chromium/issues/detail?id=260378#c18
jdunk

मुझे लगता है कि आधिकारिक तरीका window.postMessage: developer.chrome.com/extensions/…
Enrique

9

मैंने भरी हुई लिपियों के आदेश देने की समस्या का भी सामना किया है, जिसे लिपियों के क्रमिक लोडिंग के माध्यम से हल किया गया था। लोडिंग रॉब डब्ल्यू के जवाब पर आधारित है ।

function scriptFromFile(file) {
    var script = document.createElement("script");
    script.src = chrome.extension.getURL(file);
    return script;
}

function scriptFromSource(source) {
    var script = document.createElement("script");
    script.textContent = source;
    return script;
}

function inject(scripts) {
    if (scripts.length === 0)
        return;
    var otherScripts = scripts.slice(1);
    var script = scripts[0];
    var onload = function() {
        script.parentNode.removeChild(script);
        inject(otherScripts);
    };
    if (script.src != "") {
        script.onload = onload;
        document.head.appendChild(script);
    } else {
        document.head.appendChild(script);
        onload();
    }
}

उपयोग का उदाहरण होगा:

var formulaImageUrl = chrome.extension.getURL("formula.png");
var codeImageUrl = chrome.extension.getURL("code.png");

inject([
    scriptFromSource("var formulaImageUrl = '" + formulaImageUrl + "';"),
    scriptFromSource("var codeImageUrl = '" + codeImageUrl + "';"),
    scriptFromFile("EqEditor/eq_editor-lite-17.js"),
    scriptFromFile("EqEditor/eq_config.js"),
    scriptFromFile("highlight/highlight.pack.js"),
    scriptFromFile("injected.js")
]);

वास्तव में, मैं JS के लिए नया हूँ, इसलिए मुझे बेहतर तरीके से पिंग करने के लिए स्वतंत्र महसूस करें।


3
स्क्रिप्ट सम्मिलित करने का यह तरीका अच्छा नहीं है, क्योंकि आप वेब पेज के नाम स्थान को प्रदूषित कर रहे हैं। यदि वेब पेज एक चर नाम का उपयोग करता है formulaImageUrlया codeImageUrl, तो आप प्रभावी रूप से पृष्ठ की कार्यक्षमता को नष्ट कर रहे हैं। यदि आप वेब पेज के लिए एक चर पास करना चाहते हैं, तो मैं सुझाव देता हूं कि डेटा को स्क्रिप्ट तत्व ( e.g. script.dataset.formulaImageUrl = formulaImageUrl;) में संलग्न करें और डेटा का उपयोग (function() { var dataset = document.currentScript.dataset; alert(dataset.formulaImageUrl;) })();करने के लिए स्क्रिप्ट में उदाहरण का उपयोग करें।
रॉब डब्ल्यू

@RobW आपके नोट के लिए धन्यवाद, हालांकि यह नमूने के बारे में अधिक है। क्या आप कृपया स्पष्ट कर सकते हैं, मुझे केवल प्राप्त करने के बजाय IIFE का उपयोग क्यों करना चाहिए dataset?
दिमित्री गिंजबर्ग

4
document.currentScriptनिष्पादित करते समय केवल स्क्रिप्ट टैग की ओर इशारा करता है। यदि आप कभी भी स्क्रिप्ट टैग और / या इसकी विशेषताओं / गुणों (जैसे dataset) का उपयोग करना चाहते हैं , तो आपको इसे एक चर में संग्रहीत करने की आवश्यकता है। हमें वैश्विक नाम स्थान को प्रदूषित किए बिना इस चर को स्टोर करने के लिए एक आईआईएफई की आवश्यकता है।
रॉब डब्ल्यू

@RobW उत्कृष्ट! लेकिन क्या हम सिर्फ कुछ वैरिएबल नाम का उपयोग नहीं कर सकते हैं, जो कि मौजूदा के साथ मुश्किल होगा। क्या यह सिर्फ गैर-मुहावरेदार है या हमें इसके साथ कुछ अन्य समस्याएं हो सकती हैं?
दिमित्री गिंजबर्ग

2
आप कर सकते हैं, लेकिन एक IIFE का उपयोग करने की लागत नगण्य है, इसलिए मुझे IIFE पर नाम स्थान प्रदूषण को प्राथमिकता देने का कोई कारण नहीं दिखता है। मैं निश्चित रूप से महत्व देता हूं कि मैं किसी भी तरह से दूसरों के वेब पेज को नहीं तोड़ूंगा , और छोटे चर नामों का उपयोग करने की क्षमता। IIFE का उपयोग करने का एक और फायदा यह है कि आप स्क्रिप्ट को पहले चाहें तो बाहर निकाल सकते हैं ( return;)।
रॉब डब्ल्यू

6

सामग्री स्क्रिप्ट में, मैं उस सिर पर स्क्रिप्ट टैग जोड़ता हूं जो 'ऑनमेसेज' हैंडलर को बांधता है, हैंडलर के अंदर मैं उपयोग करता हूं, कोड निष्पादित करने के लिए eval। बूथ कंटेंट स्क्रिप्ट में मैं ऑनमेस्स हैंडलर का उपयोग करता हूं, इसलिए मुझे दो तरह से संचार मिलता है। क्रोम डॉक्स

//Content Script

var pmsgUrl = chrome.extension.getURL('pmListener.js');
$("head").first().append("<script src='"+pmsgUrl+"' type='text/javascript'></script>");


//Listening to messages from DOM
window.addEventListener("message", function(event) {
  console.log('CS :: message in from DOM', event);
  if(event.data.hasOwnProperty('cmdClient')) {
    var obj = JSON.parse(event.data.cmdClient);
    DoSomthingInContentScript(obj);
 }
});

pmListener.js एक पोस्ट संदेश url श्रोता है

//pmListener.js

//Listen to messages from Content Script and Execute Them
window.addEventListener("message", function (msg) {
  console.log("im in REAL DOM");
  if (msg.data.cmnd) {
    eval(msg.data.cmnd);
  }
});

console.log("injected To Real Dom");

इस तरह, मेरे पास CS से रियल डोम के बीच 2 तरह का संचार हो सकता है। उदाहरण के लिए इसका बहुत उपयोगी है अगर आपको वेबस्कैट ईवेंट या किसी भी मेमोरी चर या इवेंट को सुनने की आवश्यकता है।


1

आप एक उपयोगिता फ़ंक्शन का उपयोग कर सकते हैं जो मैंने पृष्ठ संदर्भ में कोड चलाने और लौटे मूल्य को वापस पाने के उद्देश्य से बनाया है।

यह एक फ़ंक्शन को स्ट्रिंग में क्रमबद्ध करके और इसे वेब पेज पर इंजेक्ट करके किया जाता है।

GitHub पर यहां उपयोगिता उपलब्ध है

उपयोग के उदाहरण -



// Some code that exists only in the page context -
window.someProperty = 'property';
function someFunction(name = 'test') {
    return new Promise(res => setTimeout(()=>res('resolved ' + name), 1200));
}
/////////////////

// Content script examples -

await runInPageContext(() => someProperty); // returns 'property'

await runInPageContext(() => someFunction()); // returns 'resolved test'

await runInPageContext(async (name) => someFunction(name), 'with name' ); // 'resolved with name'

await runInPageContext(async (...args) => someFunction(...args), 'with spread operator and rest parameters' ); // returns 'resolved with spread operator and rest parameters'

await runInPageContext({
    func: (name) => someFunction(name),
    args: ['with params object'],
    doc: document,
    timeout: 10000
} ); // returns 'resolved with params object'


0

यदि आप पाठ के बजाय शुद्ध फ़ंक्शन इंजेक्ट करना चाहते हैं, तो आप इस विधि का उपयोग कर सकते हैं:

function inject(){
    document.body.style.backgroundColor = 'blue';
}

// this includes the function as text and the barentheses make it run itself.
var actualCode = "("+inject+")()"; 

document.documentElement.setAttribute('onreset', actualCode);
document.documentElement.dispatchEvent(new CustomEvent('reset'));
document.documentElement.removeAttribute('onreset');

और आप मापदंडों को पारित कर सकते हैं (फ़ंक्शन के लिए unfortunatelly नहीं ऑब्जेक्ट और सरणियों को स्ट्रिंग किया जा सकता है)। इसे नंगे पलों में जोड़ें, जैसे:

function inject(color){
    document.body.style.backgroundColor = color;
}

// this includes the function as text and the barentheses make it run itself.
var color = 'yellow';
var actualCode = "("+inject+")("+color+")"; 


यह बहुत अच्छा है ... लेकिन रंग के लिए एक चर के साथ दूसरा संस्करण, मेरे लिए काम नहीं करता है ... मुझे 'अपरिचित' मिलता है और कोड एक त्रुटि फेंकता है ... इसे एक चर के रूप में नहीं देखता है।
11:02
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.