<स्क्रिप्ट> तत्व को जोड़ नहीं सकते


276

कोई भी विचार क्यों नीचे दिए गए कोड का टुकड़ा डोम में स्क्रिप्ट तत्व नहीं जोड़ता है?

var code = "<script></script>";
$("#someElement").append(code);

4
"काम नहीं कर रहा" को परिभाषित करें - हालांकि मुझे संदेह है कि समस्या यह है कि स्क्रिप्ट वास्तव में डोम ट्री का हिस्सा नहीं हैं।
जोएल कोएहॉर्न

1
मेरी शर्त है कि स्क्रिप्ट नोड को DOM में जोड़ा जा रहा है, लेकिन ब्राउज़र अभी स्क्रिप्ट निष्पादित नहीं कर रहा है।
प्रोग्रामर

दान, आपने वास्तव में इसका परीक्षण कैसे किया है?
जेम्स

1
@Joel - "काम नहीं कर रहा है" = इसका कोई प्रभाव नहीं पड़ता है, अर्थात स्क्रिप्ट के भीतर कोड @Outlaw प्रोग्रामर निष्पादित नहीं किया गया है - DOM @Jimmy में नोड नहीं जोड़ा गया है, हाँ, मैंने इसका परीक्षण किया है और यह काम नहीं कर रहा है
Dan

जवाबों:


259

मैंने उन मुद्दों को देखा है जहां कुछ ब्राउज़र कुछ बदलावों का सम्मान नहीं करते हैं जब आप उन्हें सीधे करते हैं (जिसका अर्थ है कि मैं पाठ से HTML बना रहा हूं जैसे आप स्क्रिप्ट टैग के साथ प्रयास कर रहे हैं), लेकिन जब आप उन्हें अंतर्निहित कमांड के साथ करते हैं चीजें बेहतर होती जाती हैं। इसे इस्तेमाल करे:

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = url;
$("#someElement").append( script );

से: JSON jQuery के लिए


18
<Script> टैग को DOM में ही जोड़ने की आवश्यकता है, किसी मौजूदा तत्व के आंतरिक HTML में नहीं।
डायोडस - जेम्स मैकफर्लेन

6
@Diodeus इनर HTML डोम का हिस्सा है और इसे ब्राउज़र द्वारा फ्लाई पर पार्स किया गया है, इसलिए यह एक वैध मामला है।
क्रिस्टियन तोमा


5
यदि आप वास्तव में DOM में तत्व दिखाना चाहते हैं तो jQuery के एपेंड का उपयोग न करें। इसे प्राप्त करने के लिए देशी परिशिष्ट का उपयोग करें।
मिनकी पान

8
$("#someElement")[0].appendChild( script );
मिनकी पान

352

अच्छी खबर यह है:

यह 100% काम कर रहा है।

बस स्क्रिप्ट टैग के अंदर कुछ जोड़ें alert('voila!');। सही सवाल जो आप शायद पूछना चाहते हैं, "मैंने इसे DOM में क्यों नहीं देखा?"

कार्ल स्वेडबर्ग ने jQuery एपीआई साइट में आगंतुक की टिप्पणी के लिए एक अच्छी व्याख्या की है । मैं नहीं है उसके सारे शब्दों को दोहराने की, आप सीधे पढ़ सकते हैं चाहता हूँ वहाँ यहाँ (मैं इसे कठिन नेविगेट करने के लिए टिप्पणियों के माध्यम से वहाँ पाया जाता है)

JQuery के सभी सम्मिलन के तरीके डोम में डालने से पहले और बाद में तत्वों को साफ करने / संसाधित करने के लिए आंतरिक रूप से एक डॉमन मैन फ़ंक्शन का उपयोग करते हैं। उन चीजों में से एक है जो डोमनमिप फ़ंक्शन करता है, किसी भी स्क्रिप्ट तत्वों को सम्मिलित करने के बारे में बाहर खींचता है और उन्हें "डीओएलस्क्रिप्ट रूटीन" के माध्यम से चलाता है बजाए कि उन्हें डोम के बाकी हिस्सों के साथ इंजेक्ट करें। यह स्क्रिप्ट को अलग से सम्मिलित करता है, उनका मूल्यांकन करता है, और फिर उन्हें DOM से निकाल देता है।

मेरा मानना ​​है कि jQuery का ऐसा करने का एक कारण "अनुमति अस्वीकृत" त्रुटियों से बचने के लिए है जो कुछ विशेष परिस्थितियों में स्क्रिप्ट सम्मिलित करते समय इंटरनेट एक्सप्लोरर में हो सकता है। यह एक ही स्क्रिप्ट (जो संभावित रूप से समस्याएं पैदा कर सकता है) का बार-बार डालने / मूल्यांकन करने से बचता है यदि यह एक ऐसे तत्व के भीतर है जिसे आप सम्मिलित कर रहे हैं और फिर DOM के चारों ओर घूम रहे हैं।

अगली बात यह है कि, मैं .append()एक स्क्रिप्ट जोड़ने के लिए फ़ंक्शन का उपयोग करके बुरी खबर का सारांश दूंगा ।


और बुरी खबर है ..

आप अपने कोड को डिबग नहीं कर सकते।

मैं मजाक नहीं कर रहा हूं, भले ही आप debugger;उस पंक्ति के बीच कीवर्ड जोड़ते हैं जिसे आप ब्रेकपॉइंट के रूप में सेट करना चाहते हैं, आप अंत में स्रोत कोड पर ब्रेकपॉइंट देखे बिना ऑब्जेक्ट का केवल कॉल स्टैक प्राप्त करेंगे, (यह उल्लेख नहीं करने के लिए कि यह नहीं है कीवर्ड केवल वेबकिट ब्राउज़र में काम करता है, अन्य सभी प्रमुख ब्राउज़र इस कीवर्ड को छोड़ देते हैं)

यदि आप पूरी तरह से समझते हैं कि आपका कोड क्या करता है, तो इससे छोटी सी खामी होगी। लेकिन यदि आप नहीं करते हैं, तो आप debugger;अपने स्थान (या मेरे) कोड के साथ क्या गलत है, यह पता लगाने के लिए सभी जगह एक कीवर्ड जोड़ देंगे । वैसे भी, एक विकल्प है, यह मत भूलो कि जावास्क्रिप्ट एचटीएमएल डोम को मूल रूप से हेरफेर कर सकता है।


वैकल्पिक हल।

HTML DOM को मैनिप्युलेट करने के लिए जावास्क्रिप्ट (jQuery का नहीं) का उपयोग करें

यदि आप डिबगिंग क्षमता खोना नहीं चाहते हैं, तो आप जावास्क्रिप्ट देशी HTML डोम हेरफेर का उपयोग कर सकते हैं। इस उदाहरण पर विचार करें:

var script   = document.createElement("script");
script.type  = "text/javascript";
script.src   = "path/to/your/javascript.js";    // use this for linked script
script.text  = "alert('voila!');"               // use this for inline script
document.body.appendChild(script);

वहाँ यह है, पुराने दिनों की तरह यह नहीं है। और उन चीजों को साफ करना न भूलें जो DOM में या मेमोरी में सभी ऑब्जेक्ट के लिए है जो संदर्भित है और मेमोरी लीक को रोकने के लिए अब और ज़रूरत नहीं है। चीजों को साफ करने के लिए आप इस कोड पर विचार कर सकते हैं:

document.body.removechild(document.body.lastChild);
delete UnusedReferencedObjects; // replace UnusedReferencedObject with any object you created in the script you load.

इस वर्कअराउंड से दोष यह है कि आप गलती से डुप्लिकेट स्क्रिप्ट जोड़ सकते हैं, और यह बुरा है। यहां से आप .append()ऑब्जेक्ट वेरिफिकेशन को जोड़ने से पहले फंक्शन को थोड़ा मिमिक कर सकते हैं , और डोम को जोड़ने के बाद स्क्रिप्ट को राइट से हटा सकते हैं। इस उदाहरण पर विचार करें:

function AddScript(url, object){
    if (object != null){
        // add script
        var script   = document.createElement("script");
        script.type  = "text/javascript";
        script.src   = "path/to/your/javascript.js";
        document.body.appendChild(script);

        // remove from the dom
        document.body.removeChild(document.body.lastChild);
        return true;
    } else {
        return false;
    };
};

function DeleteObject(UnusedReferencedObjects) {
    delete UnusedReferencedObjects;
}

इस तरह, आप स्क्रिप्ट डुप्लिकेट से सुरक्षित रहते हुए डिबगिंग क्षमता के साथ स्क्रिप्ट जोड़ सकते हैं। यह सिर्फ एक प्रोटोटाइप है, आप जो कुछ भी चाहते हैं उसके लिए विस्तार कर सकते हैं। मैं इस दृष्टिकोण का उपयोग कर रहा हूं और इससे काफी संतुष्ट हूं। यकीन है कि मैं .append()स्क्रिप्ट जोड़ने के लिए jQuery का उपयोग कभी नहीं करूंगा ।


2
महान व्याख्या, धन्यवाद! लेकिन क्या "UnusedReferencedObjects" था?
acme

धन्यवाद। मुझे लगता है कि आप "UnusedReferencedObjects" की पहली घटना का उल्लेख कर रहे थे, जो आपके द्वारा लोड की गई स्क्रिप्ट में बनाई गई किसी भी वस्तु को माना जाता है। मुझे लगता है कि आप बेहतर तरीके से समझते हैं कि आप देखते हैं कि DeleteObject फ़ंक्शन क्या करता है, यह केवल आपके द्वारा फ़ंक्शन में दी गई किसी भी ऑब्जेक्ट को हटा देता है। मैं स्पष्ट होने के लिए कोड में कुछ टिप्पणी जोड़ूंगा। :)
हेंड उज़िया

सुपर पोस्ट! क्रॉसमैन का उदाहरण मेरे लिए काम नहीं करता था और आपकी पोस्ट तैयार होने के बाद मैंने $ ("# someElement") को बदल दिया। एपेंड (स्क्रिप्ट); $ के साथ ("# someElement") [0] .appendChild (स्क्रिप्ट); जो इसे तय किया :) अन्वेषण के लिए Thnx
Maarten Kieft

7
$.getScriptjQuery में बनाया गया है।
zzzzBov

SourceURLs ( blog.getfirebug.com/2009/08/11/… ) डिबगिंग मुद्दों के साथ मदद कर सकता है।
vsevik

23

JQuery फ़ंक्शन का उपयोग करके जावास्क्रिप्ट फ़ाइल को गतिशील रूप से लोड करना संभव हैgetScript

$ .getScript ('http://www.whatever.com/shareprice/shareprice.js', function () {
  Display.sharePrice ();
});

अब बाहरी लिपि को बुलाया जाएगा, और यदि इसे लोड नहीं किया जा सकता है तो यह इनायत से नीचा दिखाना होगा।


7
यह DOM में कुछ भी सम्मिलित नहीं करता है। यह पुकारता है eval()
nh2

20

आपका क्या मतलब है "काम नहीं कर रहा है"?

jQuery का पता लगाता है कि आप SCRIPT तत्व बनाने की कोशिश कर रहे हैं और स्वचालित रूप से वैश्विक संदर्भ में तत्व की सामग्री चलाएंगे। क्या आप मुझे बता रहे हैं कि यह आपके लिए काम नहीं करता है? -

$('#someElement').append('<script>alert("WORKING");</script>');

संपादित करें: यदि आप कमांड चलाने के बाद DOM (उदाहरण के लिए Firebug में) में SCRIPT तत्व नहीं देख रहे हैं, तो क्योंकि jQuery, जैसा कि मैंने कहा था, कोड को चलाएगा और फिर SCRIPT तत्व को हटा देगा - मुझे विश्वास है कि RCRIPT तत्व हमेशा शरीर से जुड़े होते हैं ... लेकिन इस स्थिति में कोड निष्पादन पर प्लेसमेंट का कोई असर नहीं होता है।


17

यह काम:

$('body').append($("<script>alert('Hi!');<\/script>")[0]);

ऐसा लगता है कि jQuery स्क्रिप्ट के साथ कुछ चालाक कर रहा है, इसलिए आपको jQuery ऑब्जेक्ट के बजाय html तत्व को जोड़ना होगा।


2
थिस एकमात्र समाधान है जो मेरे मामले में काम करता है। ऊपर के अन्य सॉल्यूशंस HTML फ़ाइल में समय से पहले मौजूद जावास्क्रिप्ट कोड पर निर्भर करते हैं। चूंकि मैं कोड गतिशील रूप से जोड़ रहा हूं, ऐसे जावास्क्रिप्ट कोड को समय से पहले नहीं जाना जा सकता है! धन्यवाद डार्विन !!
tgoneil

14

कोशिश करें कि यह मददगार हो सकता है:

var fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src","scriptAnalytics.js");
document.getElementsByTagName("head")[0].appendChild(fileref);

9
पता नहीं क्यों इस आदमी नकारात्मक सब कुछ के लिए jquery का उपयोग कर रखने के लिए पर्याप्त बेवकूफ नहीं है!
एसएसपोक

संभवतः अधिकांश उत्तर jQuery का उपयोग करते हैं क्योंकि प्रश्न में ओपी jQuery का उपयोग कर रहा है।
अभयारण्य

3

मैं एक ही काम करना चाहता हूं लेकिन एक स्क्रिप्ट टैग को दूसरे फ्रेम में जोड़ना है!

var url = 'library.js'; 
var script = window.parent.frames[1].document.createElement('script' ); 
script.type = 'text/javascript'; 
script.src = url;
$('head',window.parent.frames[1].document).append(script);

3
<script>
    ...
    ...jQuery("<script></script>")...
    ...
</script>

</script>स्ट्रिंग शाब्दिक समाप्त पूरी स्क्रिप्ट, के भीतर उस से बचने के लिए "</scr" + "ipt>"उपयोग किया जा सकता।


या HTML दस्तावेज़ के भीतर सीधे अपनी जावास्क्रिप्ट एम्बेड न करें। बाहरी स्क्रिप्ट फ़ाइलों में यह समस्या नहीं है।
इयान क्लेलैंड

बच क्रम "\x3cscript\x3e\x3c/script\x3e":। एक्सएचटीएमएल में, आपको केवल एक टिप्पणी-आउट सीडीएटीए ब्लॉक में रखना होगा।
एली ग्रे

2
ऐसा नहीं है </कि अनुमति नहीं है। देखें stackoverflow.com/questions/236073/…
गुमो

2

इस फ़ाइल में बताए अनुसार पटकथा फ़ाइल में sourceURL जोड़ने से https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/

  1. स्क्रिप्ट फ़ाइल में, जैसे स्रोत के साथ एक बयान जोड़ें "// @ sourceURL = foo.js"
  2. JQuery $ .getScript () का उपयोग करके स्क्रिप्ट लोड करें और स्क्रिप्ट क्रोम देव टूल्स में "स्रोत" टैब में उपलब्ध होगी

1

आपकी स्क्रिप्ट निष्पादित हो रही है, आप बस इसका उपयोग नहीं कर सकते document.write। इसका परीक्षण करने और उपयोग करने से बचने के लिए अलर्ट का उपयोग करें document.write। आपके js फ़ाइल के स्टेटमेंट्स को document.writeनिष्पादित नहीं किया जाएगा और बाकी फ़ंक्शन को निष्पादित किया जाएगा।


1

मेरे विचार से यह सबसे अच्छा उपाय है। Google Analytics को इस तरह से इंजेक्ट किया जाता है।

var (function(){
    var p="https:" == document.location.protocol ? "https://" : "http://";
        d=document,
        g=d.createElement('script'),
        s=d.getElementsByTagName('script')[0];
        g.type='text/javascript';
        g.src=p+'url-to-your-script.js';
        s.parentNode.insertBefore(g,s); })();

1

आपको Script DOM Element बनाने के लिए jQuery की आवश्यकता नहीं है । यह वैनिला ES6 के साथ किया जा सकता है जैसे:

const script = "console.log('Did it work?')"
new Promise((resolve, reject) => {
  (function(i,s,o,g,r,a,m){
      a=s.createElement(o),m=s.getElementsByTagName(o)[0];
      a.innerText=g;
      a.onload=r;m.parentNode.insertBefore(a,m)}
  )(window,document,'script',script, resolve())
}).then(() => console.log('Sure did!'))

इसमें लिपटे जाने की आवश्यकता नहीं है Promise, लेकिन ऐसा करने से आप स्क्रिप्ट को लोड होने पर लंबे समय से चल रही स्क्रिप्ट की दौड़ की स्थिति को रोकने में मदद करते हैं।



0

एक और तरीका है कि आप इसे कर सकते हैं यदि आप चाहते हैं कि कोड जोड़ना document.createElementविधि का उपयोग कर रहा है, लेकिन .innerHTMLइसके बजाय का उपयोग कर रहा है .src

var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.innerHTML = 'alert("Hey there... you just appended this script to the body");';
$("body").append( script );

0

मैंने यह एक कोशिश की और ठीक काम करता है। बस <उस के साथ प्रतीक को बदलें \x3C

// With Variable
var code = "\x3Cscript>SomeCode\x3C/script>";
$("#someElement").append(code);

या

//Without Variable
$("#someElement").append("\x3Cscript>SomeCode\x3C/script>");

आप यहां कोड का परीक्षण कर सकते हैं


0

इस तरह की कोशिश कर सकते हैं

var code = "<script></" + "script>";
$("#someElement").append(code);

एकमात्र कारण जो आप नहीं कर सकते, वह यह "<script></script>"है कि स्ट्रिंग को जावास्क्रिप्ट के अंदर अनुमति नहीं है क्योंकि DOM लेयर js को पार्स नहीं कर सकता है और HTML क्या है।


0

मैंने एक npmपैकेज लिखा है जो आपको स्क्रिप्ट टैग सहित HTML स्ट्रिंग लेने की अनुमति देता है और लिपियों को निष्पादित करते समय इसे कंटेनर में जोड़ता है

उदाहरण:

import appendHtml from 'appendhtml';

const html = '<p>Hello</p><script src="some_js_file.js"></script>'; 
const container = document.getElementById('some-div');

await appendHtml(html, container);

// appendHtml returns a Promise, some_js_file.js is now loaded and executed (note the await)

इसे यहां ढूंढें: https://www.npmjs.com/package/appendhtml


-1

बस इसे jQuery के साथ पार्स करके एक तत्व बनाएं।

<div id="someElement"></div>
<script>
    var code = "<script>alert(123);<\/script>";
    $("#someElement").append($(code));
</script>

काम करने का उदाहरण: https://plnkr.co/edit/V2FE28Q2eBrJoJ6PUEBz


यह अभी भी एक ही समस्या है, कुछ ब्राउज़र इसका सम्मान नहीं करते हैं।
मार्टिन मस्सेरा

क्या आप कृपया मुझे बता सकते हैं कि ब्राउज़र और jQuery के किस संस्करण का आप उपयोग कर रहे हैं? धन्यवाद!
अभयारण्य
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.