কোনও ধারণা কেন নীচের কোডের টুকরোটি স্ক্রিপ্ট উপাদানটি ডিওমে যুক্ত করে না?
var code = "<script></script>";
$("#someElement").append(code);
কোনও ধারণা কেন নীচের কোডের টুকরোটি স্ক্রিপ্ট উপাদানটি ডিওমে যুক্ত করে না?
var code = "<script></script>";
$("#someElement").append(code);
উত্তর:
আমি এমন সমস্যাগুলি দেখেছি যেখানে কিছু ব্রাউজার যখন আপনি সরাসরি করেন তখন কিছু পরিবর্তনকে সম্মান করে না (যার অর্থ আপনি যখন স্ক্রিপ্ট ট্যাগ দিয়ে চেষ্টা করছেন এমন পাঠ্য থেকে এইচটিএমএল তৈরি করা) তবে আপনি যখন বিল্ট-ইন কমান্ডগুলি দিয়ে থাকেন জিনিস ভাল হয়। এটা চেষ্টা কর:
var script = document.createElement( 'script' );
script.type = 'text/javascript';
script.src = url;
$("#someElement").append( script );
থেকে: jQuery জন্য JSON
$("#someElement")[0].appendChild( script );
সুসংবাদটি হ'ল:
এটি 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 ব্যবহার করব না ।
$.getScriptjQuery মধ্যে নির্মিত হয়।
JQuery ফাংশনটি ব্যবহার করে জাভাস্ক্রিপ্ট ফাইলটি গতিশীলভাবে লোড করা সম্ভবgetScript
get .GG.Script ('http://www.wishes.com/shareprice/shareprice.js', ফাংশন () {
Display.sharePrice ();
});
এখন বাহ্যিক স্ক্রিপ্টটি বলা হবে এবং এটি লোড করা না গেলে এটি কৃপণভাবে হ্রাস পাবে।
eval()।
"কাজ না করা" মানে কি?
jQuery সনাক্ত করে যে আপনি একটি স্ক্রিপ্ট উপাদান তৈরি করার চেষ্টা করছেন এবং স্বয়ংক্রিয়ভাবে বৈশ্বিক প্রেক্ষাপটে উপাদানটির সামগ্রীগুলি চালিত করবেন। আপনি কি আমাকে বলছেন যে এটি আপনার পক্ষে কাজ করে না? -
$('#someElement').append('<script>alert("WORKING");</script>');
সম্পাদনা করুন: আপনি যদি কমান্ডটি চালানোর পরে DOM- তে (উদাহরণস্বরূপ ফায়ারব্যাগে) স্ক্রিপ্ট উপাদানটি না দেখেন কারণ jQuery, যেমন আমি বলেছিলাম, কোডটি চালাবে এবং তারপর স্ক্রিপ্ট উপাদানটি মুছে ফেলবে - আমি বিশ্বাস করি যে স্ক্রিপ্ট উপাদানগুলি সর্বদা শরীরে সংযোজন করা হয় ... তবে যাইহোক - এই পরিস্থিতিতে কোড প্রয়োগের ক্ষেত্রে স্থান নির্ধারণের কোনও ফল নেই no
এইটা কাজ করে:
$('body').append($("<script>alert('Hi!');<\/script>")[0]);
দেখে মনে হচ্ছে jQuery স্ক্রিপ্টগুলির সাথে কিছু চতুর করছে তাই আপনাকে jQuery অবজেক্টের পরিবর্তে এইচটিএমএল উপাদান যুক্ত করতে হবে।
এটি সহায়ক হতে পারে চেষ্টা করুন:
var fileref=document.createElement('script');
fileref.setAttribute("type","text/javascript");
fileref.setAttribute("src","scriptAnalytics.js");
document.getElementsByTagName("head")[0].appendChild(fileref);
<script>
...
...jQuery("<script></script>")...
...
</script>
এর পরিবর্তে ব্যবহার করা যায় না </script>এড়ানোর জন্য স্ট্রিং আক্ষরিক মধ্যে থাকা পুরো স্ক্রিপ্টটি সমাপ্ত করে "</scr" + "ipt>"।
"\x3cscript\x3e\x3c/script\x3e"। এক্সএইচটিএমএলে আপনাকে কেবল একটি মন্তব্য-আউট সিডিএএটি ব্লক রাখা দরকার।
</অনুমোদিত নয়। দেখুন stackoverflow.com/questions/236073/...
স্ক্রিপ্ট ফাইলটিতে উত্স URL যুক্ত করা এই পৃষ্ঠায় উল্লিখিত হিসাবে সহায়তা করেছে: https://blog.getfirebug.com/2009/08/11/give-your-eval-a-name-with-sourceurl/
আপনার স্ক্রিপ্টটি কার্যকর করছে, আপনি কেবল document.writeএটি থেকে ব্যবহার করতে পারবেন না । এটি পরীক্ষা করতে এবং ব্যবহার এড়াতে সতর্কতা ব্যবহার করুন document.write। আপনার জেএস ফাইলের স্টেটমেন্টগুলি document.writeকার্যকর করা হবে না এবং বাকী ফাংশনটি কার্যকর করা হবে।
এটিই আমার মনে হয় সেরা সমাধান। গুগল অ্যানালিটিক্স এইভাবে ইনজেকশন করা হয়।
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); })();
স্ক্রিপ্ট 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, তবে এটি আপনাকে স্ক্রিপ্টটি লোড করার পরে প্রতিশ্রুতিটি সমাধান করতে দেয়, দীর্ঘকাল ধরে চলমান স্ক্রিপ্টগুলির জন্য রেস শর্ত রোধ করতে সহায়তা করে।
স্ক্রিপ্টটি দেহে যুক্ত করুন:
$(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 );
এই মত চেষ্টা করতে পারেন
var code = "<script></" + "script>";
$("#someElement").append(code);
"<script></script>"জাভা স্ক্রিপ্টের ভিতরে স্ট্রিংটির অনুমতি নেই কারণ আপনি যা করতে পারবেন না তার একমাত্র কারণ কারণ ডোম স্তর কী জেএস এবং এইচটিএমএল কী তা পার্স করতে পারে না।
আমি একটি লিখেছি 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
শুধু jQuery দিয়ে পার্ট করে একটি উপাদান তৈরি করুন।
<div id="someElement"></div>
<script>
var code = "<script>alert(123);<\/script>";
$("#someElement").append($(code));
</script>
কার্যকারী উদাহরণ: https://plnkr.co/edit/V2FE28Q2eBrJoJ6PUEBz