कोई भी विचार क्यों नीचे दिए गए कोड का टुकड़ा डोम में स्क्रिप्ट तत्व नहीं जोड़ता है?
var code = "<script></script>";
$("#someElement").append(code);
कोई भी विचार क्यों नीचे दिए गए कोड का टुकड़ा डोम में स्क्रिप्ट तत्व नहीं जोड़ता है?
var code = "<script></script>";
$("#someElement").append(code);
जवाबों:
मैंने उन मुद्दों को देखा है जहां कुछ ब्राउज़र कुछ बदलावों का सम्मान नहीं करते हैं जब आप उन्हें सीधे करते हैं (जिसका अर्थ है कि मैं पाठ से HTML बना रहा हूं जैसे आप स्क्रिप्ट टैग के साथ प्रयास कर रहे हैं), लेकिन जब आप उन्हें अंतर्निहित कमांड के साथ करते हैं चीजें बेहतर होती जाती हैं। इसे इस्तेमाल करे:
var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = url;
$("#someElement").append( script );
$("#someElement")[0].appendChild( script );
अच्छी खबर यह है:
यह 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 का उपयोग कभी नहीं करूंगा ।
$.getScriptjQuery में बनाया गया है।
JQuery फ़ंक्शन का उपयोग करके जावास्क्रिप्ट फ़ाइल को गतिशील रूप से लोड करना संभव हैgetScript
$ .getScript ('http://www.whatever.com/shareprice/shareprice.js', function () {
Display.sharePrice ();
});
अब बाहरी लिपि को बुलाया जाएगा, और यदि इसे लोड नहीं किया जा सकता है तो यह इनायत से नीचा दिखाना होगा।
eval()।
आपका क्या मतलब है "काम नहीं कर रहा है"?
jQuery का पता लगाता है कि आप SCRIPT तत्व बनाने की कोशिश कर रहे हैं और स्वचालित रूप से वैश्विक संदर्भ में तत्व की सामग्री चलाएंगे। क्या आप मुझे बता रहे हैं कि यह आपके लिए काम नहीं करता है? -
$('#someElement').append('<script>alert("WORKING");</script>');
संपादित करें: यदि आप कमांड चलाने के बाद DOM (उदाहरण के लिए Firebug में) में SCRIPT तत्व नहीं देख रहे हैं, तो क्योंकि jQuery, जैसा कि मैंने कहा था, कोड को चलाएगा और फिर SCRIPT तत्व को हटा देगा - मुझे विश्वास है कि RCRIPT तत्व हमेशा शरीर से जुड़े होते हैं ... लेकिन इस स्थिति में कोड निष्पादन पर प्लेसमेंट का कोई असर नहीं होता है।
यह काम:
$('body').append($("<script>alert('Hi!');<\/script>")[0]);
ऐसा लगता है कि jQuery स्क्रिप्ट के साथ कुछ चालाक कर रहा है, इसलिए आपको jQuery ऑब्जेक्ट के बजाय html तत्व को जोड़ना होगा।
कोशिश करें कि यह मददगार हो सकता है:
var fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src","scriptAnalytics.js");
document.getElementsByTagName("head")[0].appendChild(fileref);
मैं एक ही काम करना चाहता हूं लेकिन एक स्क्रिप्ट टैग को दूसरे फ्रेम में जोड़ना है!
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);
<script>
...
...jQuery("<script></script>")...
...
</script>
</script>स्ट्रिंग शाब्दिक समाप्त पूरी स्क्रिप्ट, के भीतर उस से बचने के लिए "</scr" + "ipt>"उपयोग किया जा सकता।
"\x3cscript\x3e\x3c/script\x3e":। एक्सएचटीएमएल में, आपको केवल एक टिप्पणी-आउट सीडीएटीए ब्लॉक में रखना होगा।
</कि अनुमति नहीं है। देखें stackoverflow.com/questions/236073/…
इस फ़ाइल में बताए अनुसार पटकथा फ़ाइल में sourceURL जोड़ने से https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/
आपकी स्क्रिप्ट निष्पादित हो रही है, आप बस इसका उपयोग नहीं कर सकते document.write। इसका परीक्षण करने और उपयोग करने से बचने के लिए अलर्ट का उपयोग करें document.write। आपके js फ़ाइल के स्टेटमेंट्स को document.writeनिष्पादित नहीं किया जाएगा और बाकी फ़ंक्शन को निष्पादित किया जाएगा।
मेरे विचार से यह सबसे अच्छा उपाय है। 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); })();
आपको 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, लेकिन ऐसा करने से आप स्क्रिप्ट को लोड होने पर लंबे समय से चल रही स्क्रिप्ट की दौड़ की स्थिति को रोकने में मदद करते हैं।
शरीर के लिए स्क्रिप्ट जोड़ें:
$(document).ready(function() {
$("<script>", { src : "bootstrap.min.js", type : "text/javascript" }).appendTo("body");
});
एक और तरीका है कि आप इसे कर सकते हैं यदि आप चाहते हैं कि कोड जोड़ना 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 );
मैंने यह एक कोशिश की और ठीक काम करता है। बस <उस के साथ प्रतीक को बदलें \x3C।
// With Variable
var code = "\x3Cscript>SomeCode\x3C/script>";
$("#someElement").append(code);
या
//Without Variable
$("#someElement").append("\x3Cscript>SomeCode\x3C/script>");
इस तरह की कोशिश कर सकते हैं
var code = "<script></" + "script>";
$("#someElement").append(code);
एकमात्र कारण जो आप नहीं कर सकते, वह यह "<script></script>"है कि स्ट्रिंग को जावास्क्रिप्ट के अंदर अनुमति नहीं है क्योंकि DOM लेयर js को पार्स नहीं कर सकता है और HTML क्या है।
मैंने एक 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
बस इसे jQuery के साथ पार्स करके एक तत्व बनाएं।
<div id="someElement"></div>
<script>
var code = "<script>alert(123);<\/script>";
$("#someElement").append($(code));
</script>
काम करने का उदाहरण: https://plnkr.co/edit/V2FE28Q2eBrJoJ6PUEBz