<script> উপাদান যুক্ত করা যায় না


276

কোনও ধারণা কেন নীচের কোডের টুকরোটি স্ক্রিপ্ট উপাদানটি ডিওমে যুক্ত করে না?

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

4
"কাজ করছে না" সংজ্ঞায়িত করুন - যদিও আমার সন্দেহ হচ্ছে সমস্যাটি হ'ল লিপিগুলি আসলে ডম গাছের অংশ নয়।
জোয়েল কোহোর্ন 15

1
আমার বাজি হ'ল স্ক্রিপ্ট নোডটি ডিওমে যুক্ত করা হচ্ছে, তবে ব্রাউজারটি কেবল স্ক্রিপ্টটি কার্যকর করছে না।
আউটলা প্রোগ্রামার

ড্যান, আপনি আসলে এটি কীভাবে পরীক্ষা করেছেন?
জেমস

1
@ জোয়েল - "কাজ করছে না" = এর কোনও প্রভাব নেই, অর্থাৎ স্ক্রিপ্টের কোডটি কার্যকর করা হয়নি @ আউটলা প্রোগ্রামার - নোডটি ডমকে যুক্ত করা হয়নি @ জিমি হ্যাঁ, আমি এটি পরীক্ষা করেছি এবং এটি কাজ করছে না
ড্যান বুর্জো

উত্তর:


259

আমি এমন সমস্যাগুলি দেখেছি যেখানে কিছু ব্রাউজার যখন আপনি সরাসরি করেন তখন কিছু পরিবর্তনকে সম্মান করে না (যার অর্থ আপনি যখন স্ক্রিপ্ট ট্যাগ দিয়ে চেষ্টা করছেন এমন পাঠ্য থেকে এইচটিএমএল তৈরি করা) তবে আপনি যখন বিল্ট-ইন কমান্ডগুলি দিয়ে থাকেন জিনিস ভাল হয়। এটা চেষ্টা কর:

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

থেকে: jQuery জন্য JSON


18
<script> ট্যাগটি ডিওমে নিজেই যুক্ত করা দরকার, কোনও বিদ্যমান উপাদানটির অভ্যন্তরীণ এইচটিএমএলে নয়।
ডায়োডিয়াস - জেমস ম্যাকফার্লেন

6
@ ডায়োডিয়াস ইনার এইচটিএমএলটি ডিওএম-র একটি অংশ এবং এটি ব্রাউজারের মাধ্যমে ফ্লাইয়ে পার্স করা হয়েছে, সুতরাং এটি একটি বৈধ কেস।
ক্রিশ্চিয়ান টোমা


5
আপনি যদি সত্যিই ডিওমে এলিমেন্টটি উপস্থিত করতে চান তবে কেবল jQuery এর অ্যাপেন্ড ব্যবহার করবেন না। এটি অর্জনের জন্য নেটিভ অ্যাপেন্ডচাইল্ড ব্যবহার করুন।
মিনকি পান

8
$("#someElement")[0].appendChild( script );
মিনকি পান

352

সুসংবাদটি হ'ল:

এটি 100% কাজ করছে।

স্ক্রিপ্ট ট্যাগের ভিতরে কেবল কিছু যুক্ত করুন alert('voila!');। আপনি সম্ভবত সঠিক প্রশ্নটি জিজ্ঞাসা করতে চাইতে পারেন, "কেন আমি এটি ডোমে দেখিনি?"

কার্ল সুইডেনবার্গ jQuery এপিআই সাইটে দর্শকদের মন্তব্য সম্পর্কে একটি দুর্দান্ত ব্যাখ্যা দিয়েছেন । আমি না আর একবার তার কথাগুলো পুনরাবৃত্তি, আপনি সরাসরি পড়তে পারেন চান সেখানে এখানে (আমি এটি হার্ড নেভিগেট করতে মন্তব্যের মাধ্যমে সেখানে পাওয়া যায়)

JQuery এর সমস্ত সন্নিবেশ পদ্ধতি DOM intoোকানোর আগে এবং পরে উপাদানগুলি পরিষ্কার / প্রক্রিয়া করার জন্য অভ্যন্তরীণভাবে একটি domManip ফাংশন ব্যবহার করে। ডোমমনিপ ফাংশনটি হ'ল একটি জিনিস sertedোকানো যেতে পারে এমন কোনও স্ক্রিপ্ট উপাদানগুলি টেনে আনা এবং এটিকে একটি "ইভালস্ক্রিপ্ট রুটিন" এর মাধ্যমে চালিত করে বাকী ডোম টুকরা দিয়ে ইনজেকশন করার পরিবর্তে। এটি স্ক্রিপ্টগুলি আলাদাভাবে সন্নিবেশ করায়, সেগুলি মূল্যায়ন করে এবং তারপরে এগুলি ডিওএম থেকে সরায়।

আমি বিশ্বাস করি যে jQuery এর একটি কারণ হ'ল "অনুমতি অস্বীকৃত" ত্রুটিগুলি এড়ানো যা নির্দিষ্ট পরিস্থিতিতে স্ক্রিপ্টগুলি সন্নিবেশ করানোর সময় ইন্টারনেট এক্সপ্লোরারে ঘটতে পারে। এটি বারবার একই স্ক্রিপ্ট সন্নিবেশ করা / মূল্যায়ন করা এড়িয়ে যায় (যা সম্ভবত সমস্যা তৈরি করতে পারে) যদি এটি যদি আপনি অন্তর্ভুক্ত করে এমন উপাদানগুলির মধ্যে থাকে এবং এটি ডিওএমের চারপাশে ঘোরাফেরা করে।

পরের বিষয়টি হ'ল, আমি .append()কোনও স্ক্রিপ্ট যুক্ত করতে ফাংশনটি ব্যবহার করে কী খারাপ খবরগুলি সংক্ষেপ করব ।


এবং খারাপ সংবাদটি হল ..

আপনি আপনার কোডটি ডিবাগ করতে পারবেন না।

আমি রসিকতা করছি না, এমনকি যদি আপনি debugger;ব্রেকআপপয়েন্ট হিসাবে সেট করতে চান এমন লাইনের মধ্যে কীওয়ার্ড যুক্ত করেন তবে উত্সের কোডটিতে ব্রেকপয়েন্টটি না দেখে আপনি কেবলমাত্র বস্তুর কল স্ট্যাকটি পেয়ে যাবেন, (এটি উল্লেখ করার জন্য নয়) কীওয়ার্ডটি কেবল ওয়েবকিট ব্রাউজারে কাজ করে, অন্যান্য সমস্ত বড় ব্রাউজারগুলি এই কীওয়ার্ডটি বাদ দেয় বলে মনে হয়)

আপনার কোডটি কী করে তা আপনি যদি পুরোপুরি বুঝতে পারেন তবে এর চেয়ে একটি ছোটখাটো কমতি দেখাবে। তবে আপনি যদি তা না debugger;করেন তবে আপনার (বা আমার) কোডটিতে কী সমস্যা আছে তা খুঁজে পাওয়ার জন্য আপনি পুরো জায়গা জুড়ে একটি কীওয়ার্ড যুক্ত করবেন । যাইহোক, একটি বিকল্প আছে, ভুলে যাবেন না যে জাভাস্ক্রিপ্টটি স্থানীয়ভাবে এইচটিএমএল ডিওএম চালাতে পারে।


কার্যসংক্রান্ত।

এইচটিএমএল ডিওএম হেরফের করতে জাভাস্ক্রিপ্ট (jQuery নয়) ব্যবহার করুন

আপনি যদি জাবা স্ক্রিপ্ট নেটিভ এইচটিএমএল ডিওএম ম্যানিপুলেশন ব্যবহার করতে পারেন তার চেয়ে ডিবাগিংয়ের ক্ষমতা হারাতে না চান। এই উদাহরণ বিবেচনা করুন:

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);

ওখানেই আছে, ঠিক যেমন পুরনো দিন তা নয়। এবং স্মৃতি ফাঁস রোধ করার জন্য ডিএমএমে বা রেফারেন্সযুক্ত এবং যে সমস্ত অবজেক্টের রেফারেন্স দেওয়া হয়েছে এবং মেমোরি ফাঁস রোধ করার জন্য আর প্রয়োজন নেই সেগুলির জন্য মেমরির জিনিসগুলি পরিষ্কার করতে ভুলবেন না। জিনিসগুলি পরিষ্কার করার জন্য আপনি এই কোডটি বিবেচনা করতে পারেন:

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
দুর্দান্ত ব্যাখ্যা, ধন্যবাদ! তবে কি "UnusedReferencesdObjects" ছিল?
acme

ধন্যবাদ। আমি অনুমান করি আপনি "অব্যবহৃত রেফারেন্সডঅবজেক্টস" এর প্রথম উপস্থিতির কথা উল্লেখ করছেন, যেটি আপনি যে স্ক্রিপ্টে লোড করবেন তাতে আপনি যে কোনও বস্তু তৈরি করেছেন বলে মনে করা হচ্ছে। আমার ধারণা, আপনি যদি ডিলিটঅবজেক্ট ফাংশনটি করেন তবে আপনি আরও ভাল বুঝতে পেরেছেন তবে এটি ফাংশনে আপনি যে কোনও বস্তুটি পাস করেছেন তা কেবল মুছে দেয়। আমি কোডটিতে কিছু মন্তব্য যুক্ত করে পরিষ্কার করব। :)
হেন্দ্র উজিয়া

সুপার পোস্ট! ক্রোসম্যানের উদাহরণটি আমার পক্ষে কার্যকর হয়নি এবং আপনার পোস্ট প্রস্তুত হওয়ার পরে আমি replaced ("# #Element") প্রতিস্থাপন করেছি app $ ("# #Element") সহ [0] .এপেন্ডচিল্ড (স্ক্রিপ্ট); যা এটি ঠিক করেছে :) ব্যাখ্যার জন্য Thnx
মার্টেন

7
$.getScriptjQuery মধ্যে নির্মিত হয়।
zzzzBov

উত্স URL গুলি ( blog.getfirebug.com/2009/08/11/… ) ডিবাগিং সমস্যাগুলিতে সহায়তা করতে পারে।
vsevik

23

JQuery ফাংশনটি ব্যবহার করে জাভাস্ক্রিপ্ট ফাইলটি গতিশীলভাবে লোড করা সম্ভবgetScript

get .GG.Script ('http://www.wishes.com/shareprice/shareprice.js', ফাংশন () {
  Display.sharePrice ();
});

এখন বাহ্যিক স্ক্রিপ্টটি বলা হবে এবং এটি লোড করা না গেলে এটি কৃপণভাবে হ্রাস পাবে।


7
এটি ডিওমে কিছু sertোকায় না। এটা কল eval()
nh2

20

"কাজ না করা" মানে কি?

jQuery সনাক্ত করে যে আপনি একটি স্ক্রিপ্ট উপাদান তৈরি করার চেষ্টা করছেন এবং স্বয়ংক্রিয়ভাবে বৈশ্বিক প্রেক্ষাপটে উপাদানটির সামগ্রীগুলি চালিত করবেন। আপনি কি আমাকে বলছেন যে এটি আপনার পক্ষে কাজ করে না? -

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

সম্পাদনা করুন: আপনি যদি কমান্ডটি চালানোর পরে DOM- তে (উদাহরণস্বরূপ ফায়ারব্যাগে) স্ক্রিপ্ট উপাদানটি না দেখেন কারণ jQuery, যেমন আমি বলেছিলাম, কোডটি চালাবে এবং তারপর স্ক্রিপ্ট উপাদানটি মুছে ফেলবে - আমি বিশ্বাস করি যে স্ক্রিপ্ট উপাদানগুলি সর্বদা শরীরে সংযোজন করা হয় ... তবে যাইহোক - এই পরিস্থিতিতে কোড প্রয়োগের ক্ষেত্রে স্থান নির্ধারণের কোনও ফল নেই no


17

এইটা কাজ করে:

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

দেখে মনে হচ্ছে jQuery স্ক্রিপ্টগুলির সাথে কিছু চতুর করছে তাই আপনাকে jQuery অবজেক্টের পরিবর্তে এইচটিএমএল উপাদান যুক্ত করতে হবে।


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 নথির মধ্যে এম্বেড করবেন না। বাহ্যিক স্ক্রিপ্ট ফাইলগুলিতে এই সমস্যা নেই।
ইয়ান ক্লেল্যান্ড

সিকোয়েন্স Escape: "\x3cscript\x3e\x3c/script\x3e"। এক্সএইচটিএমএলে আপনাকে কেবল একটি মন্তব্য-আউট সিডিএএটি ব্লক রাখা দরকার।
এলি গ্রে

2
বরং এটি </অনুমোদিত নয়। দেখুন stackoverflow.com/questions/236073/...
গাম্বো

2

স্ক্রিপ্ট ফাইলটিতে উত্স URL যুক্ত করা এই পৃষ্ঠায় উল্লিখিত হিসাবে সহায়তা করেছে: https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/

  1. স্ক্রিপ্ট ফাইলে, "// @ সোর্স URL = foo.js" এর মতো উত্স URL সহ একটি বিবৃতি যুক্ত করুন
  2. JQuery get .getScript () ব্যবহার করে স্ক্রিপ্টটি লোড করুন এবং স্ক্রিপ্টটি ক্রোম দেব সরঞ্জামগুলিতে "উত্স" ট্যাবে উপলব্ধ হবে

1

আপনার স্ক্রিপ্টটি কার্যকর করছে, আপনি কেবল document.writeএটি থেকে ব্যবহার করতে পারবেন না । এটি পরীক্ষা করতে এবং ব্যবহার এড়াতে সতর্কতা ব্যবহার করুন document.write। আপনার জেএস ফাইলের স্টেটমেন্টগুলি document.writeকার্যকর করা হবে না এবং বাকী ফাংশনটি কার্যকর করা হবে।


1

এটিই আমার মনে হয় সেরা সমাধান। গুগল অ্যানালিটিক্স এইভাবে ইনজেকশন করা হয়।

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

স্ক্রিপ্ট DOM এলিমেন্ট তৈরি করতে আপনার jQuery দরকার নেই । এটি ভ্যানিলা ইএস 6 এর মতো করে করা যেতে পারে:

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>"জাভা স্ক্রিপ্টের ভিতরে স্ট্রিংটির অনুমতি নেই কারণ আপনি যা করতে পারবেন না তার একমাত্র কারণ কারণ ডোম স্তর কী জেএস এবং এইচটিএমএল কী তা পার্স করতে পারে না।


0

আমি একটি লিখেছি npm প্যাকেজ যা আপনাকে স্ক্রিপ্ট ট্যাগ সহ একটি এইচটিএমএল স্ট্রিং নিতে এবং স্ক্রিপ্টগুলি সম্পাদন করার সময় একটি ধারকটিতে যুক্ত করতে দেয়

উদাহরণ:

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


এটি এখনও একই সমস্যা রয়েছে, কিছু ব্রাউজার এটি সম্মান করে না।
মার্টিন মাসেরেরা 12'17

আপনি কি দয়া করে আমাকে জানান যে আপনি কোন ব্রাউজারগুলি এবং jQuery এর কোন সংস্করণ ব্যবহার করছেন? ধন্যবাদ!
সানবার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.