<script> ট্যাগটি দস্তাবেজ লেখার সময় কেন বিভক্ত করবেন?


268

কিছু সাইট (বা বিজ্ঞাপনদাতারা যা ক্লায়েন্টদের জাভাস্ক্রিপ্ট কোড দেয়) কলগুলিতে <script>এবং / অথবা </script>ট্যাগগুলি বিভক্ত করার একটি কৌশল কেন ব্যবহার করে document.write()?

আমি লক্ষ্য করেছি যে আমাজন এটিও করে, উদাহরণস্বরূপ:

<script type='text/javascript'>
  if (typeof window['jQuery'] == 'undefined') document.write('<scr'+'ipt type="text/javascript" src="http://z-ecx.images-amazon.com/images/G/01/javascripts/lib/jquery/jquery-1.2.6.pack._V265113567_.js"></sc'+'ript>');
</script>

উত্তর:


373

</script>ভেঙে ফেলতে হবে কারণ অন্যথায় এটি <script></script>খুব শীঘ্রই ঘেরের ব্লকটি শেষ করবে । সত্যিই এটি <এবং এর মধ্যে বিভক্ত হওয়া উচিত /, কারণ কোনও স্ক্রিপ্ট ব্লকটি (এসজিএমএল অনুসারে) যে কোনও শেষ ট্যাগ খোলা (ETAGO) অনুক্রম (যেমন </) দ্বারা সমাপ্ত করার কথা :

যদিও স্টাইল এবং স্ক্রিপ্ট উপাদানগুলি তাদের ডেটা মডেলের জন্য সিডিএটিএ ব্যবহার করে, এই উপাদানগুলির জন্য, সিডিএটিএ অবশ্যই ব্যবহারকারী এজেন্টদের দ্বারা আলাদাভাবে পরিচালনা করতে হবে। মার্কআপ এবং সত্তাগুলি অবশ্যই কাঁচা পাঠ্য হিসাবে বিবেচনা করা উচিত এবং অ্যাপ্লিকেশনটিতে যেমন পাঠানো হবে। চরিত্রের ক্রম " </" এর প্রথম উপস্থিতি (শেষ-ট্যাগ ওপেন ডিলিমিটার) উপাদানটির সামগ্রীর সমাপ্তি হিসাবে সমাপ্তি হিসাবে বিবেচিত হয়। বৈধ নথিতে, এটি উপাদানটির জন্য শেষ ট্যাগ।

তবে অনুশীলনে ব্রাউজারগুলি কেবল আসল </script>ক্লোজ-ট্যাগে একটি সিডিএটিএ স্ক্রিপ্ট ব্লককে বিশ্লেষণ করে শেষ করে ।

এক্সএইচটিএমএলে স্ক্রিপ্ট ব্লকগুলির জন্য এই জাতীয় বিশেষ কোনও হ্যান্ডলিং নেই, সুতরাং তাদের মধ্যে কোনও <(বা &) অক্ষর অবশ্যই &escaped;অন্য কোনও উপাদানগুলির মতো হওয়া উচিত । তবে তারপরে ব্রাউজারগুলি যেগুলি XHTML কে পুরানো-স্কুল এইচটিএমএল হিসাবে বিভক্ত করছে তা বিভ্রান্ত হয়ে যাবে। সিডিএটিএ ব্লকগুলির সাথে জড়িত রয়েছে, তবে এই অক্ষরগুলি অনস্কেপড ব্যবহার করা এড়ানো সহজ। স্ক্রিপ্ট থেকে স্ক্রিপ্ট উপাদান লেখার আরও ভাল উপায় যা উভয় প্রকারের পার্সারে কাজ করে তা হ'ল:

<script type="text/javascript">
    document.write('\x3Cscript type="text/javascript" src="foo.js">\x3C/script>');
</script>

30
\/এর জন্য একটি বৈধ অব্যাহতি ক্রম /, তাই কেন কেবল সেই স্ট্রিংগুলির জন্য আক্ষরিক পলায়নের পরিবর্তে এটি ব্যবহার করবেন না <? যেমন document.write('<script src=foo.js><\/script>');। এছাড়াও, </script>একমাত্র চরিত্রের ক্রম নয় যা কোনও <script>উপাদানকে বন্ধ করতে পারে । আরও কিছু তথ্য এখানে: mathiasbynens.be/notes/etago
ম্যাথিয়াস বাইনেস

11
@ ম্যাথিয়াস: এক্ষেত্রে <\/script>ঠিক আছে, তবে এটি কেবল এইচটিএমএলে কাজ করবে; অতিরিক্ত সিডিএটিএ বিভাগ মোড়ানো ছাড়াই এক্সএইচটিএমএলে এটি এখনও একটি সু-গঠনের ত্রুটি। এছাড়াও আপনি \x3Cইনলাইন ইভেন্ট হ্যান্ডলার বৈশিষ্ট্যগুলিতে ব্যবহার করতে পারেন যেখানে <এইচটিএমএল এবং এক্সএইচটিএমএল উভয় ক্ষেত্রেই অবৈধ হতে পারে, সুতরাং এটির আরও ব্যাপক প্রয়োগযোগ্যতা: আমি যদি সমস্ত প্রসঙ্গে জেএস স্ট্রিং অক্ষরে সংবেদনশীল অক্ষরগুলি পালনের জন্য একটি সহজে, স্বয়ংক্রিয় পদ্ধতি বেছে নিই, তবে এটি আমি যার জন্য যাব
ববিনস

3
এইচটিএমএলে, <ইনলাইন ইভেন্ট হ্যান্ডলার বৈশিষ্ট্যে ব্যবহার করা যেতে পারে। এইচটিএমএল 5.অলয়েডেটর.নু.... এবং আপনি কোনও সিচের এক্সএইচটিএমএল সামঞ্জস্যতা সম্পর্কে ঠিক বলেছেন \x3C, তবে যেহেতু এক্সএইচটিএমএল সমর্থন করে না document.write(বা innerHTML) যাইহোক এটি কীভাবে প্রাসঙ্গিক তা আমি দেখতে পাই না।
ম্যাথিয়াস বাইনেস

2
@ ম্যাথিয়াসবিনেন্স— document.writeঅপ্রাসঙ্গিক, এটি উদাহরণ হিসাবে ঘটে। ওপিটি অন্তর্নিহিত এইচটিএমএল ব্যবহার করতে পারে, এটি </যেখানেই ঘটে সেখানে মার্কআপ পার্সার থেকে চরিত্রের ক্রমটি লুকিয়ে রাখার বিষয়ে । এটি ঠিক যে বেশিরভাগ পার্সাররা স্ক্রিপ্ট উপাদানগুলির মধ্যে এটিকে সহ্য করে যখন কঠোরভাবে তাদের করা উচিত নয় (তবে এইচটিএমএল পার্সারগুলি খুব সহনশীল)। আপনি সঠিক আছেন যদিও <\/এইচটিএমএল-এর ক্ষেত্রে এটি যথেষ্ট।
রবজি

3
আমি মনে করি না যে উদ্বোধন <চালানো আবশ্যক .... document.write('<script src="foo.js">\x3C/script>')সমস্ত ব্রাউজারগুলিতে আইই 6-তে যথেষ্ট বলে মনে হচ্ছে। (আমি প্রকারের বৈশিষ্ট্যটি বাদ দিয়েছি কারণ এটি HTML5 তে প্রয়োজন হয় না, বা এটি কোনও ব্রাউজার দ্বারা প্রয়োজনীয় হিসাবে প্রয়োগ করা হয় না))
ম্যাট ব্রাউন

34

স্ক্রিপ্ট ট্যাগ ইনলাইন তৈরি করতে চাইলে আমি এখানে আরও একটি প্রকরণ ব্যবহার করেছি (যাতে তা অবিলম্বে কার্যকর হয়) কোনও প্রকারের পলায়নের প্রয়োজন ছাড়াই:

<script>
    var script = document.createElement('script');
    script.src = '/path/to/script.js';
    document.write(script.outerHTML);
</script>

(দ্রষ্টব্য: নেটে বেশিরভাগ উদাহরণের বিপরীতে, আমি type="text/javascript"কোনও এনকোলেসিং ট্যাগ বা জেনারেট হওয়া কোনওটিই সেট করছি না : কোনও ব্রাউজার এটি ডিফল্ট হিসাবে নেই এবং তাই এটি অপ্রয়োজনীয়, তবে এটির কোনও ক্ষতি হবে না, যদি আপনি একমত না)


ভাল পয়েন্ট পুনরায়: টাইপ। ডিফল্টটি HTML5 হিসাবে "পাঠ্য / জাভাস্ক্রিপ্ট" হিসাবে সংজ্ঞায়িত করা হয়, সুতরাং এটি একটি অকেজো বৈশিষ্ট্য। w3.org/html/wg/drafts/html/master/…
লুক

8
এটি গ্রহণযোগ্য উত্তরের চেয়ে ভাল কারণ কারণ এই প্রকরণটি হ্রাস করা যেতে পারে। এই 'x3C / স্ক্রিপ্ট>' মিনিফিকেশনের পরে '</script>' হয়ে যাবে।
জোল্টন কোচান

20

আমি মনে করি যে ব্রাউজারের এইচটিএমএল পার্সারকে <script> এবং মূলত </ translation >টিকে আসল স্ক্রিপ্টের সমাপ্তি ট্যাগ হিসাবে ব্যাখ্যা করতে বাধা দেওয়ার জন্য, তবে আমি মনে করি না যে ডকুমেন্ট.রাইট ব্যবহার স্ক্রিপ্ট মূল্যায়নের জন্য একটি দুর্দান্ত ধারণা ব্লক, কেন ডোম ব্যবহার করবেন না ...

var newScript = document.createElement("script");
...

4
স্ক্রিপ্ট-ব্লক
অকালব্যাপী

9

ববিন্স পোস্ট করা সমাধানটি আমার পক্ষে নিখুঁতভাবে কাজ করে। আমি ভবিষ্যতের দর্শকদের জন্য একটি বিকল্প পদ্ধতিও অফার করতে চেয়েছিলাম:

if (typeof(jQuery) == 'undefined') {
    (function() {
        var sct = document.createElement('script');
        sct.src = ('https:' == document.location.protocol ? 'https' : 'http') +
          '://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js';
        sct.type = 'text/javascript';
        sct.async = 'true';
        var domel = document.getElementsByTagName('script')[0];
        domel.parentNode.insertBefore(sct, domel);
    })();
}

এই উদাহরণে, jQuery ব্যবহারের ক্ষেত্রে প্রদর্শন করার জন্য আমি একটি শর্তযুক্ত লোড অন্তর্ভুক্ত করেছি। আশা করি এটি কারও উপকারী!


3
কোন প্রোটোকল সনাক্ত করতে প্রয়োজন নেই - প্রোটোকল-কম কোনো URI শুধু কাজ করে জরিমানা ( '//foo.com/bar.js' ইত্যাদি)
ডিএমপি

3
অ্যাসিঙ্ক সেট করার দরকার নেই। এটি সমস্ত গতিময় তৈরি স্ক্রিপ্ট ট্যাগগুলির জন্য সেট করা আছে।
নয়েশ

আমাকে বাঁচিয়েছে! ডকুমেন্ট.ওরাইট (<script>) ব্যবহার করার সময় আমার সাইটটি ফাঁকা স্ক্রিন দেখাচ্ছে। এটি কাজ করে।
টমাস গঞ্জালেজ

@dmp ফাইল সিস্টেম থেকে চালিত থাকাকালীন যেখানে প্রোটোকল ফাইল হবে: //
এমপিপ্লুজন

9

</script>জাভাস্ক্রিপ্ট স্ট্রিং litteral ভিতরে ক্লোজিং ট্যাগ HTML হিসাবে পার্সার দ্বারা ব্যাখ্যা করা হয়, অপ্রত্যাশিত আচরণ (ঘটাচ্ছে JSFiddle উপর উদাহরণ দেখতে )।

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

<script type="text/javascript">
    <!--
    if (jQuery === undefined) {
        document.write('<script type="text/javascript" src="http://z-ecx.images-amazon.com/images/G/01/javascripts/lib/jquery/jquery-1.2.6.pack._V265113567_.js"></script>');
    }
    // -->
</script>

... তবে সত্যি কথা বলতে, ব্যবহার করা document.writeএমন কিছু নয় যা আমি সেরা অনুশীলনটিকে বিবেচনা করব। সরাসরি ডিওএমকে কেন হেরফের করছে না?

<script type="text/javascript">
    <!--
    if (jQuery === undefined) {
        var script = document.createElement('script');
        script.setAttribute('type', 'text/javascript');
        script.setAttribute('src', 'http://z-ecx.images-amazon.com/images/G/01/javascripts/lib/jquery/jquery-1.2.6.pack._V265113567_.js');
        document.body.appendChild(script);
    }
    // -->
</script>

1
আপনি যদি খাঁটি জেএস ব্যবহার করতে চান তবে আপনি এখনও ডকুমেন্ট.ও
রাইট

দুঃখিত, আমি লিখতে চেয়েছিলাম - এর জন্য jQuery লাইব্রেরি দরকার, তাইনা? আমি যখন document.body.append ব্যবহার করেছি, তখন এটি একটি ত্রুটি ছুঁড়েছে যে ডকুমেন্ট.বডি.পেন্ড কোনও ফাংশন নয়।
নীরভ জাভেরি

1
দুঃখিত, আমার ভুল: আমি appendপরিবর্তে লিখেছি appendChild। উত্তরটি সংশোধন করেছেন। দেখার জন্য আপনাকে ধন্যবাদ!
ম্যাথিউ রডিক

1
এটি স্ট্রিংটিকে ম্যানুয়ালি বিভক্ত করার চেয়ে অনেক বেশি সাধারণ দেখায়। উদাহরণস্বরূপ স্প্লিটিংটি কোনও টেম্পলেট ইঞ্জিন দ্বারা স্ট্রিং .োকানো সম্ভব নয়।
w1th0utnam3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.