এইচটিএমএল মার্কআপে আমি <script> ট্যাগগুলি কোথায় রাখব?


1485

এইচটিএমএল ডকুমেন্টে জাভাস্ক্রিপ্ট এম্বেড করার সময়, <script>ট্যাগগুলি রাখার উপযুক্ত জায়গা কোথায় এবং জাভাস্ক্রিপ্ট অন্তর্ভুক্ত? আমি মনে করি মনে হচ্ছে আপনি এটিকে <head>বিভাগে রাখবেন না, তবে বিভাগটির শুরুতে স্থাপন করা <body>খুব খারাপ, কারণ পৃষ্ঠাটি সম্পূর্ণরূপে রেন্ডার করার আগে জাভাস্ক্রিপ্টটি পার্স করতে হবে (বা এর মতো কিছু)। এই ছেড়ে বলে মনে হয় শেষ এর <body>জন্য একটি লজিক্যাল স্থান হিসেবে অধ্যায় <script>ট্যাগ।

সুতরাং, যেখানে হয় লাগাতে যথাস্থান <script>ট্যাগ?

(এই প্রশ্নের রেফারেন্স এই প্রশ্নের , যা সুপারিশ করা হয় যে জাভাস্ক্রিপ্ট ফাংশন কল থেকে সরানো হবে <a>থেকে ট্যাগ <script>ট্যাগ। আমি বিশেষভাবে jQuery ব্যবহার করছি, কিন্তু আরও সাধারণ উত্তর যথাযথ করা হয়।)


আপনি যদি কেবল একটি সহজ সমাধান সন্ধান করেন এবং আপনি জেকিলের মতো কিছু সার্ভার সাইড জেনারেটর ব্যবহার করছেন, আমি পরিবর্তে স্ক্রিপ্টটি যুক্ত করার পরামর্শ দিই। এত সহজ!
ক্রেগোক্স

উত্তর:


1861

যখন কোনও ব্রাউজার কোনও <script>ট্যাগ দিয়ে একটি ওয়েবসাইট লোড করে তখন কী হয় :

  1. এইচটিএমএল পৃষ্ঠা আনুন (উদাহরণস্বরূপ index.html)
  2. এইচটিএমএল বিশ্লেষণ শুরু করুন
  3. পার্সার <script>একটি বাহ্যিক স্ক্রিপ্ট ফাইল উল্লেখ করে একটি ট্যাগের মুখোমুখি ।
  4. ব্রাউজারটি স্ক্রিপ্ট ফাইলটির জন্য অনুরোধ করে। এদিকে, পার্সারটি আপনার পৃষ্ঠায় থাকা অন্য এইচটিএমএলকে পার্স করা বন্ধ করে এবং থামায়।
  5. কিছু সময় পরে স্ক্রিপ্টটি ডাউনলোড হয় এবং পরে সম্পাদিত হয়।
  6. বিশ্লেষক এইচটিএমএল ডকুমেন্টের বিশ্লেষণ অবিরত করে।

পদক্ষেপ # 4 খারাপ ব্যবহারকারীর অভিজ্ঞতার কারণ। আপনার ওয়েবসাইটটি সমস্ত স্ক্রিপ্টগুলি ডাউনলোড না করা পর্যন্ত লোড করা বন্ধ করে দেয়। যদি এমন একটি জিনিস থাকে যা ব্যবহারকারীরা ঘৃণা করে তবে এটি ওয়েবসাইট লোড হওয়ার জন্য অপেক্ষা করছে।

কেন এমনটা হয়?

যে কোনও স্ক্রিপ্ট তার নিজস্ব এইচটিএমএল document.write()বা অন্যান্য ডিওএম ম্যানিপুলেশনগুলির মাধ্যমে sertোকাতে পারে। এটি বোঝায় যে স্ক্রিপ্টটি ডাউনলোড করা এবং চালিত হওয়া পর্যন্ত পার্সারকে অপেক্ষা করতে হবে যতক্ষণ না এটি বাকী নথির নিরাপদে বিশ্লেষণ করতে পারে। সর্বোপরি, স্ক্রিপ্টটি নথিতে তার নিজস্ব এইচটিএমএল haveোকাতে পারত

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

<!-- index.html -->
<html>
    <head>
        <title>My Page</title>
        <script src="my-script.js"></script>
    </head>
    <body>
        <div id="user-greeting">Welcome back, user</div>
    </body>
</html>

javascript:

// my-script.js
document.addEventListener("DOMContentLoaded", function() { 
    // this function runs when the DOM is ready, i.e. when the document has been parsed
    document.getElementById("user-greeting").textContent = "Welcome back, Bart";
});

যেহেতু আপনার ব্রাউজারটি আমার স্ক্রিপ্টটি জানে না j ডকুমেন্টটি ডাউনলোড এবং সম্পাদন না করা অবধি ডকুমেন্টটি সংশোধন করবে না, পার্সার পার্সিং বন্ধ করে দেয়।

পুরানো প্রস্তাবনা

এই সমস্যাটি সমাধান করার জন্য পুরানো পদ্ধতিটি ছিল <script>আপনার নীচে ট্যাগগুলি <body>লাগানো, কারণ এটি নিশ্চিত করে যে পার্সারটি শেষ অবধি অবরুদ্ধ নয়।

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

একটি অনুকূল সমাধানে, ব্রাউজারটি আপনার স্ক্রিপ্টগুলি যত তাড়াতাড়ি সম্ভব ডাউনলোড করা শুরু করবে, একই সময়ে আপনার বাকী নথির বিশ্লেষণ করবে।

আধুনিক পদ্ধতি

আজ, ব্রাউজারগুলি স্ক্রিপ্টগুলিতে asyncএবং deferবৈশিষ্ট্যগুলিকে সমর্থন করে । এই বৈশিষ্ট্যগুলি ব্রাউজারকে স্ক্রিপ্টগুলি ডাউনলোড করার সময় পার্সিং চালিয়ে যাওয়া নিরাপদ বলে।

ASYNC

<script src="path/to/script1.js" async></script>
<script src="path/to/script2.js" async></script>

অ্যাসিঙ্ক বৈশিষ্ট্যযুক্ত স্ক্রিপ্টগুলি অ্যাসিঙ্ক্রোনালি কার্যকর করা হয়। এর অর্থ স্ক্রিপ্টটি ডাউনলোড হওয়ার সাথে সাথেই ব্রাউজারটিকে অবরুদ্ধ না করেই এটি কার্যকর করা হবে।
এর থেকে বোঝা যায় যে স্ক্রিপ্ট 2 এ স্ক্রিপ্ট 1 এর আগে ডাউনলোড করা এবং সম্পাদন করা সম্ভব।

Http://caniuse.com/#feat=script-async অনুসারে , সমস্ত ব্রাউজারের 97.78% এটি সমর্থন করে।

মুলতবি করা

<script src="path/to/script1.js" defer></script>
<script src="path/to/script2.js" defer></script>

ডিফার অ্যাট্রিবিউটযুক্ত স্ক্রিপ্টগুলি ক্রমে কার্যকর করা হয় (যেমন প্রথম স্ক্রিপ্ট 1, তারপরে স্ক্রিপ্ট 2)। এটি ব্রাউজারটিকেও ব্লক করে না।

অ্যাসিঙ্ক স্ক্রিপ্টগুলির বিপরীতে, পুরো ডকুমেন্টটি লোড হওয়ার পরে ডিফার স্ক্রিপ্টগুলি কেবল কার্যকর করা হয়।

Http://caniuse.com/#feat=script-defer অনুসারে , সমস্ত ব্রাউজারের 97.79% এটি সমর্থন করে। 98.06% এটি অন্তত আংশিকভাবে সমর্থন করে।

ব্রাউজারের সামঞ্জস্যের উপর একটি গুরুত্বপূর্ণ নোট: কিছু পরিস্থিতিতে আই <= 9 স্থগিত স্ক্রিপ্টগুলি ক্রম থেকে কার্যকর করতে পারে। আপনি ঐ ব্রাউজার সমর্থন করার জন্য প্রয়োজন হয়, তাহলে দয়া করে পড়ুন এই প্রথম!

উপসংহার

বর্তমানের অত্যাধুনিকটি হ'ল <head>ট্যাগটিতে স্ক্রিপ্ট স্থাপন করা asyncবা deferবৈশিষ্ট্যগুলি ব্যবহার করা। এটি আপনার ব্রাউজারটিকে অবরুদ্ধ না করে আপনার স্ক্রিপ্টগুলি asap ডাউনলোড করার অনুমতি দেয়।

ভাল কথাটি হ'ল আপনার ওয়েবসাইটটি এখনও 2% ব্রাউজারগুলিতে সঠিকভাবে লোড করা উচিত যা অন্যান্য 98% গতি বাড়ানোর সময় এই বৈশিষ্ট্যগুলিকে সমর্থন করে না।


63
আমি বিস্মিত কেউ কিছু উদাহৃত গুগলের ব্যাখ্যা ... আছি developers.google.com/speed/docs/insights/BlockingJS
ক্যাসি ফাল্ক

6
আমি ডোমকে কী স্পর্শ করি এবং কী হয় না সে সম্পর্কে আমি পরিষ্কার নই। আপনি কি স্পষ্ট করতে পারেন? Jquery.js এর মতো কোনও কিছুর উপর একটি অ্যাসিঙ্ক লোড করা কি নিরাপদ?
ডগ

7
@ ডউগ উদাহরণস্বরূপ ডোমে document.writeকাজ করে। প্রশ্ন না হয় যদি একটি স্ক্রিপ্ট ডোম manipulates কিন্তু যখন এটা আছে। যতক্ষণ না domreadyঘটনাটি ট্রিগার হওয়ার পরে সমস্ত ডোম ম্যানিপুলেশন হয় ততক্ষণ আপনি ঠিক আছেন। jQuery একটি লাইব্রেরি, এবং যেমন - বা না করা উচিত - নিজেই ডমটি পরিচালনা করে।
বার্ট

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

40
কেন asyncএবং deferকোথাও ব্যবহার করা হয় না? মানে আমি ইন্টারনেট থেকে প্রচুর এইচটিএমএল উত্স দেখেছি এবং আমি কোথাও এর বৈশিষ্ট্য asyncএবং deferবৈশিষ্ট্য দেখতে পাচ্ছি না । ...?
জন সিজে

239

ক্লোজিং বডি ট্যাগের ঠিক আগে, যেমন বলা হয়েছে

http://developer.yahoo.com/performance/rules.html#js_bottom

স্ক্রিপ্টগুলি নীচে রাখুন

স্ক্রিপ্টগুলির কারণে সমস্যাটি হ'ল তারা সমান্তরাল ডাউনলোডগুলি ব্লক করে। এইচটিটিপি / ১.১ স্পেসিফিকেশনটি পরামর্শ দেয় যে ব্রাউজারগুলি প্রতি হোস্টনামের সমান্তরালে দুটি চেয়ে বেশি উপাদান ডাউনলোড করে না। আপনি যদি একাধিক হোস্ট-নেম থেকে আপনার চিত্রগুলি পরিবেশন করেন তবে আপনি সমান্তরালে ঘটতে আরও দুটি ডাউনলোড পেতে পারেন। কোনও স্ক্রিপ্ট ডাউনলোড করার সময়, ব্রাউজারটি অন্য কোনও ডাউনলোড শুরু করবে না, এমনকি বিভিন্ন হোস্টনামে।


7
ধারণা এবং এর ব্যাখ্যা সহ একমত। তবে ব্যবহারকারী যদি পৃষ্ঠাটি নিয়ে খেলতে শুরু করেন তবে কী হয়। ধরুন আমি একটি এজেএক্স ড্রপডাউন করেছি যা পৃষ্ঠাটি ব্যবহারকারীর সামনে উপস্থিত হওয়ার পরে লোড করা শুরু হবে তবে এটি লোড হওয়ার সময়, ব্যবহারকারী এটি ক্লিক করে! এবং যদি কোনও 'সত্যিই অধৈর্য' ব্যবহারকারী ফর্মটি জমা দেয় তবে কী হবে?
হেমন্ত ট্যাঙ্ক

9
@ হারমান্ট ওল্ড মন্তব্য কিন্তু আপনি ডিএমএল দ্বারা ক্ষেত্রগুলি অক্ষম করার কৌশলটি করতে পারেন তারপর ডওম সম্পূর্ণরূপে লোড হওয়ার পরে জেএস ব্যবহার করে তাদের সক্ষম করতে পারেন। আজকাল ফেসবুক এমনটাই করছে বলে মনে হচ্ছে।
নোভাটো

2
এটি এখনও একই কিনা তা পরীক্ষা করার জন্য ক্রোম দিয়ে এটি পরীক্ষা করে দেখুন। এটাই. আপনি এখানে আপনার ব্রাউজারগুলির পৃষ্ঠা লোড সময়ের পার্থক্যগুলি পরীক্ষা করতে পারেন। স্টিভসওয়ার্ডার্স
সাইফার

46
যদি এটি সর্বোত্তম অনুশীলন হয় তবে স্ট্যাক ওভারফ্লো কেন তাদের সমস্ত স্ক্রিপ্ট ট্যাগ <হেড> এ অন্তর্ভুক্ত করে? :
ফিলিপ

10
কিছু ক্ষেত্রে, বিশেষত এজাক্স ভারী সাইটগুলিতে, মাথা লোড করার ফলে দ্রুত লোডের সময় আসতে পারে। দেখুন: encosia.com/dont-let-jquerys-docament-ready-slow-you-down (নোট করুন যে "লাইভ ()" ফাংশনটি jquery এ অবমূল্যায়িত হয়েছে, তবে নিবন্ধটি এখনও "অন ()" বা "এর সাথে প্রযোজ্য প্রতিনিধি "ফাংশন)। <হেডম্যান্ট> এ লোড করাও হেরমান্টের নির্দেশিত সঠিক আচরণের গ্যারান্টি হিসাবে প্রয়োজন হতে পারে। পরিশেষে, আধুনিকীকরণ.ডাক্সস সাইটগুলিতে ব্যাখ্যা করার কারণে এর স্ক্রিপ্টগুলি <হেড> এ রাখার পরামর্শ দেয়।
নাথন

76

নন-ব্লকিং স্ক্রিপ্ট ট্যাগগুলি যে কোনও জায়গায় রাখা যেতে পারে:

<script src="script.js" async></script>
<script src="script.js" defer></script>
<script src="script.js" async defer></script>
  • async স্ক্রিপ্টটি এটি পাওয়া মাত্রই অযৌক্তিকভাবে কার্যকর করা হবে
  • defer ডকুমেন্টটি বিশ্লেষণ শেষ করার পরে স্ক্রিপ্টটি কার্যকর করা হয়
  • async defer এসিঙ্ক সমর্থিত না হলে স্ক্রিপ্ট পিছনে পিছনে আচরণে ফিরে আসে

এই জাতীয় স্ক্রিপ্টগুলি অ্যাসিনক্রোনাক্যভাবে / ডকুমেন্ট প্রস্তুত হওয়ার পরে কার্যকর করা হবে যার অর্থ আপনি এটি করতে পারবেন না:

<script src="jquery.js" async></script>
<script>jQuery(something);</script>
<!--
  * might throw "jQuery is not defined" error
  * defer will not work either
-->

অথবা এটা:

<script src="document.write(something).js" async></script>
<!--
  * might issue "cannot write into document from an asynchronous script" warning
  * defer will not work either
-->

অথবা এটা:

<script src="jquery.js" async></script>
<script src="jQuery(something).js" async></script>
<!--
  * might throw "jQuery is not defined" error (no guarantee which script runs first)
  * defer will work in sane browsers
-->

অথবা এটা:

<script src="document.getElementById(header).js" async></script>
<div id="header"></div>
<!--
  * might not locate #header (script could fire before parser looks at the next line)
  * defer will work in sane browsers
-->

এই কথাটি বলে, অ্যাসিনক্রোনাস স্ক্রিপ্টগুলি এই সুবিধা দেয়:

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

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


2
এটি আজকের সঠিক উত্তর - এই পদ্ধতির ব্যবহারের অর্থ আপনার উইজেটগুলিকে স্বতঃস্ফূর্ত রাখা আরও সহজ, অভিনবতা করার দরকার নেই <head>যুক্তিকে অন্তর্ভুক্ত।
ড্যানিয়েল সোকলোভস্কি

1
আমি বিভ্রান্ত করছি কেন আপনি ব্যবহার করতে পারবেন না asyncবা deferহিসাবে আপনি আপনার দ্বিতীয় ব্লকের উল্লেখ যখন jQuery এর অন্তর্ভুক্ত রয়েছে: <script src="jquery.js" async></script>। কেন আপনি ব্যাখ্যা করতে সক্ষম? আমি ভেবেছিলাম পারফরম্যান্সের জন্য আমার async ট্যাগ থাকা দরকার - গ্রহণযোগ্য উত্তর অনুসারে - যাতে আমার পৃষ্ঠাটি jQuery এখনও লোড হওয়ার সময়ও লোড হতে পারে]। ধন্যবাদ!
এলবোলোস্টারস্টকস্ট্যান্ড

3
@ এলবো 99% বার পৃষ্ঠার কোথাও ব্লক <script src=jquery.js>অনুসরণ করে $(function(){ ... })। অ্যাসিঙ্ক্রোনাস লোডিং গ্যারান্টি দেয় না যে সেই সময় ব্রাউজারগুলি সেই ব্লকগুলিকে পার্স করার চেষ্টা করবে তাই এটি উত্থাপিত হবে defined এটি ত্রুটিযুক্ত নয় (জিকুয়েরি ক্যাশে থেকে লোড করা থাকলে আপনি ত্রুটিটি পেতে পারেন না)। আমি jQuery ভারসাম্যহীনভাবে লোড করা এবং সংরক্ষণ সম্পর্কে একটি প্রশ্নের উত্তর দিয়েছি $(function(){ ... })। আমি এটি দেখতে পেতাম কিনা তা আমি দেখতে পাচ্ছি বা আপনি এই প্রশ্নটি দেখতে পারেন: stackoverflow.com/q/14811471/87015
সালমান এ

1
@ সালমানআ আপনাকে ধন্যবাদ! হ্যাঁ, আমি সেই 99% এ পড়ি। আমার প্রথমে jqueryলোড করার জন্য লিব দরকার , তারপরে আমার বাকী .jsস্ক্রিপ্টগুলি। যখন আমি ঘোষণা asyncবা deferউপর jqueryliberal এর সংক্ষিপ্ত রূপ স্ক্রিপ্ট ট্যাগ, আমার .jsস্ক্রিপ্ট কাজ করে না। আমি ভেবেছিলাম $(function(){ ... })যে সুরক্ষিত ess অনুমান হয় না। বর্তমান সমাধান: আমি যোগ না deferবা asyncউপর jqueryliberal এর সংক্ষিপ্ত রূপ স্ক্রিপ্ট, কিন্তু আমি যুক্ত করব asyncআমার ফলো আপ .jsস্ক্রিপ্ট। দ্রষ্টব্য: আমি এর যে কোনও কাজ করার কারণটি হ'ল গুগল পেজ স্পিডকে খুশি করা। আবারও সাহায্যের জন্য! অন্য কোন পরামর্শ স্বাগত। (বা আপনার আগের উত্তরের একটি লিঙ্ক)। :)
এলবোলোস্টারস্টারস্ট্যান্ড 21

@elbow দেখুন stackoverflow.com/a/21013975/87015 , এটি শুধুমাত্র আপনার একটি ধারণা কিন্তু সম্পূর্ণ সমাধান দিতে হবে। পরিবর্তে আপনি "jquery async লোডার লাইব্রেরি" অনুসন্ধান করতে পারেন।
সালমান এ

38

ইয়াহু দ্বারা প্রচারিত স্ট্যান্ডার্ড পরামর্শ! ব্যতিক্রমী পারফরম্যান্স টিমটি হ'ল <script>ট্যাগগুলি নথির বডির শেষে রেখে দেওয়া যাতে তারা পৃষ্ঠার রেন্ডারিংয়ে বাধা না দেয়।

তবে গুগল অ্যানালিটিক্স জাভাস্ক্রিপ্ট ফাইলটির লোড সময় সম্পর্কে এই উত্তরে বর্ণিত হিসাবে আরও কিছু নতুন পদ্ধতির উন্নত পারফরম্যান্সের প্রস্তাব রয়েছে :

স্টিভ সোডার্স (ক্লায়েন্ট-পার্শ্ব পারফরম্যান্স বিশেষজ্ঞ) সম্পর্কে কয়েকটি দুর্দান্ত স্লাইড রয়েছে :

  • সমান্তরালে বাহ্যিক জাভাস্ক্রিপ্ট ফাইলগুলি লোড করার জন্য বিভিন্ন কৌশল
  • সময় এবং পৃষ্ঠা রেন্ডারিংয়ের উপর তাদের প্রভাব
  • কী ধরণের "অগ্রগতি" সূচকগুলি ব্রাউজারটি প্রদর্শন করে (উদাহরণস্বরূপ স্ট্যাটাস বারে 'লোডিং', ঘন্টাঘরের মাউস কার্সার)।

25

আপনি যদি জিকুয়ারি ব্যবহার করছেন তবে জাভাস্ক্রিপ্টটি যেখানে ভাল লাগবে সেখানে রেখে দিন এবং $(document).ready()কোনও ফাংশন কার্যকর করার আগে জিনিসগুলি যথাযথভাবে লোড হচ্ছে কিনা তা নিশ্চিত করতে ব্যবহার করুন ।

পাশের নোটে: আমি <head>বিভাগটিতে আমার সমস্ত স্ক্রিপ্ট ট্যাগ পছন্দ করি কারণ এটি মনে হয় পরিষ্কার জায়গা।


14
মাথায় ... ইর? <header>?
ড্যান লাগ

7
নোট করুন যে ব্যবহারের $(document).ready()অর্থ এই নয় যে আপনি নিজের জাভাস্ক্রিপ্টটি আপনার পছন্দ মতো যে কোনও জায়গায় রাখতে পারেন - আপনি এখনও <script src=".../jquery.min.js">jQuery যেখানে অন্তর্ভুক্ত করেছেন সেখানে রেখে দিতে হবে , যাতে এটি $বিদ্যমান that
ররি ও'কেনে

2
<হেড> বিভাগে স্ক্রিপ্ট ট্যাগগুলি স্থাপন করা অনুকূল নয় - স্ক্রিপ্টগুলি লোড না হওয়া পর্যন্ত এটি পৃষ্ঠার দৃশ্যমান অংশটি প্রদর্শন করতে বিলম্ব করবে।
সাইবারমঙ্ক

না, @ ড্যান, একটি headerউপাদান এইচটিএমএল ডকুমেন্ট সামগ্রীর অংশ, এবং এর মধ্যে এক বা একাধিকবার হওয়া উচিতbody উপাদান . The প্রধানের `ট্যাগটি নথির জন্য মেটা-ডেটা এবং নন-সামগ্রী ডেটার জন্য। এটি আজকাল সহ deferএবং asyncস্ক্রিপ্ট ট্যাগগুলির জন্য একটি আদর্শ জায়গা। headerউপাদানগুলিতে কেবল এমন তথ্য থাকা উচিত যা নথির বিভাগটিকে অনুসরণ করে describes
প্রফেক

1
প্রফিকে, ড্যান যখন ৪ বছর আগে এটি পোস্ট করেছিলেন তখন মূল অশিক্ষিত প্রশ্নটির কথা উল্লেখ করছিলেন। আপনি দেখতে পাচ্ছেন, প্রশ্নটি এক বছর পরে সম্পাদিত হয়েছিল।
kojow7

18

2019 এর আধুনিক পদ্ধতির ES6 মডিউল ধরণের স্ক্রিপ্ট ব্যবহার করা হচ্ছে

<script type="module" src="..."></script>

ডিফল্টরূপে, মডিউলগুলি অ্যাসিনক্রোনাসলি লোড হয় এবং পরাজিত হয়। উদাহরণস্বরূপ আপনি এগুলি যে কোনও জায়গায় রাখতে পারেন এবং পৃষ্ঠাটি লোডিং শেষ হলে তারা সমান্তরালে লোড হবে এবং কার্যকর করবে।

স্ক্রিপ্ট এবং মডিউলের মধ্যে পার্থক্যগুলি এখানে বর্ণিত হয়েছে:

https://stackoverflow.com/a/53821485/731548

স্ক্রিপ্টের সাথে তুলনা করে মডিউলের সম্পাদন এখানে বর্ণিত হয়েছে:

https://developers.google.com/web/fundamentals/primers/modules#defer

সমর্থন এখানে প্রদর্শিত হয়:

https://caniuse.com/#feat=es6-module


জ্ঞান বেসে যুক্ত করতে সুন্দর তথ্য
সাগর

1
কেবলমাত্র একটি নোট যে আপনি কোনও সার্ভারবিহীন আপনার স্থানীয় ফাইল সিস্টেমে জিনিস চেষ্টা করে দেখলে এটি কাজ করবে না। Chrome এ অন্ততপক্ষে আপনি দুটি ফাইলের একই সিস্টেম, তবুও এইচটিএমএল থেকে জেএস লোড করার চেষ্টা করে ক্রস-অরিজিন ত্রুটি পাবেন।
হিপ্পিট্রেইল

11

স্ক্রিপ্ট প্রধান উপাদানটির বাইরে অন্য কোথাও থাকলে এক্সএইচটিএমএলকে বৈধতা দেওয়া হবে না। দেখা যাচ্ছে এটি সর্বত্রই হতে পারে।

আপনি jQuery এর মতো কিছু দিয়ে মৃত্যুদণ্ড স্থগিত করতে পারেন যাতে এটি কোথায় রাখা হয়েছে তা বিবেচনা করে না (পার্সিংয়ের সময় একটি ছোট পারফরম্যান্স হিট বাদে)।


1
এক্সএইচটিএমএল কঠোর এবং ক্রান্তিকাল উভয়ই শরীরে স্ক্রিপ্ট ট্যাগগুলির সাথে বৈধতা দেবে। স্টাইল ট্যাগগুলি কেবল মাথার মধ্যে থাকতে পারে।
আই.দেবরিজ

11
<script src="myjs.js"></script>
</body>

এইচটিএমএল ফাইলে বডি ক্লোজ বা নীচে যাওয়ার আগে স্ক্রিপ্ট ট্যাগটি সর্বদা ব্যবহার করা উচিত ।

তারপরে আপনি জেএস ফাইল লোড করার আগে প্রথমে পৃষ্ঠার সামগ্রী দেখতে পাবেন ।

প্রয়োজন হলে এটি পরীক্ষা করে দেখুন: http://stevesouders.com/hpws/rule-js-bottom.php


2
এটি আসলে প্রশ্নের উত্তর দিয়েছিল। আমি প্রায় সমস্ত উদাহরণ পোস্ট করে যাচ্ছিলাম তা কখনই "পৃষ্ঠার শেষ"
কেন ইংগ্রাম

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

এটি ২০০৯ সালে করা পয়েন্টগুলিও উল্লেখ করে এবং প্রাসঙ্গিক নয়।
toxaq

7

প্রচলিত (এবং ব্যাপকভাবে স্বীকৃত) উত্তরটি "নীচে রয়েছে", কারণ কোনও কিছুই কার্যকর করা শুরুর আগে পুরো ডিওএমটি লোড হয়ে যাবে।

বিভিন্ন কারণে বিতর্কিত রয়েছে, উপলভ্য অনুশীলনটি শুরু করে একটি পৃষ্ঠা অনলোড ইভেন্টের মাধ্যমে ইচ্ছাকৃতভাবে কার্যকর করা শুরু করে।


6

করা সবচেয়ে ভাল জায়গা <script>ট্যাগ বন্ধ করার আগে হয় </body>ট্যাগটি , তাই ডাউনলোড এবং নির্বাহ এটা নথিতে HTML বিশ্লেষণ করতে ব্রাউজার ব্লক নয়,

এছাড়াও JS ফাইল বাহ্যিকভাবে এটা নিজস্ব সুফল রয়েছে লোড এটা পছন্দ হবে ব্রাউজার দ্বারা ক্যাশে পারে এবং পৃষ্ঠা লোড বার গতি বাড়াতে , এটা HTML এবং জাভাস্ক্রিপ্ট কোড আলাদা এবং কোড বেস ভাল পরিচালনা করতে সাহায্য

কিন্তু আধুনিক ব্রাউজারে এছাড়াও মত কিছু অন্যান্য অনুকূল উপায়ে সমর্থন asyncএবং deferবহিরাগত লোড করতে javascriptফাইল।

অ্যাসিঙ্ক এবং ডিফার

সাধারণত এইচটিএমএল পৃষ্ঠার এক্সিকিউশন লাইনে এক এক করে শুরু হয়। যখন কোনও বাহ্যিক জাভাস্ক্রিপ্ট উপাদান উপস্থিত হয়, একটি জাভাস্ক্রিপ্ট ডাউনলোড না করা এবং কার্যকর করার জন্য প্রস্তুত না হওয়া অবধি HTML পার্সিং বন্ধ হয়ে যায়। এই সাধারণ পৃষ্ঠাগুলি প্রয়োগ deferএবং asyncগুণাবলী ব্যবহার করে পরিবর্তন করা যেতে পারে ।

Defer

যখন একটি ডিফার অ্যাট্রিবিউট ব্যবহার করা হয়, তখন জাভাস্ক্রিপ্ট HTML পার্সিংয়ের সাথে সমান্তরালভাবে ডাউনলোড করা হয় তবে সম্পূর্ণ এইচটিএমএল পার্সিংয়ের পরে কার্যকর করা হবে।

<script src="/local-js-path/myScript.js" defer></script>

Async

যখন অ্যাসিঙ্ক বৈশিষ্ট্য ব্যবহৃত হয়, স্ক্রিপ্টটি আসার সাথে সাথেই জাভাস্ক্রিপ্ট ডাউনলোড হয় এবং ডাউনলোডের পরে, এটি HTML পার্সিংয়ের সাথে অ্যাসিনক্রোনাস (সমান্তরালভাবে) সম্পাদন করা হবে।

<script src="/local-js-path/myScript.js" async></script>

কোন বৈশিষ্ট্য কখন ব্যবহার করবেন

  • যদি আপনার স্ক্রিপ্ট অন্যান্য স্ক্রিপ্টগুলির থেকে পৃথক এবং মডুলার হয় তবে ব্যবহার করুন async
  • আপনি যদি স্ক্রিপ্ট 1 এবং স্ক্রিপ্ট 2 লোড করছেন async, উভয়ই
    ডাউনলোড
    এবং উপলব্ধ হওয়ার সাথে সাথে এইচটিএমএল পার্সিংয়ের সাথে সমান্তরালভাবে চলবে ।
  • যদি আপনার স্ক্রিপ্ট অন্য স্ক্রিপ্টের উপর নির্ভর করে তবে deferউভয়ের জন্য ব্যবহার করুন :
  • স্ক্রিপ্ট 1 এবং স্ক্রিপ্ট 2 যখন সেই ক্রমে লোড হয় defer, তখন স্ক্রিপ্ট 1 প্রথমে কার্যকর করার গ্যারান্টিযুক্ত হয়,
  • স্ক্রিপ্ট 2 সম্পূর্ণ সম্পাদন হওয়ার পরে স্ক্রিপ্ট 2 এক্সিকিউট হবে।
  • স্ক্রিপ্ট 2 স্ক্রিপ্ট 1 এর উপর নির্ভর করে তবে এটি অবশ্যই করতে হবে।
  • যদি আপনার স্ক্রিপ্টটি যথেষ্ট ছোট এবং প্রকারের অন্য স্ক্রিপ্টের উপর নির্ভরশীল asyncতবে আপনার স্ক্রিপ্টটি কোনও বৈশিষ্ট্য ছাড়াই ব্যবহার করুন এবং এটিকে সমস্ত asyncস্ক্রিপ্টের উপরে রাখুন ।

তথ্যসূত্র: জ্ঞানহিলস.কম


3

নির্ভর করে, আপনি যদি কোনও পৃষ্ঠায় স্টাইল করার জন্য প্রয়োজনীয় কোনও স্ক্রিপ্ট লোড করছেন / আপনার পৃষ্ঠায় ক্রিয়াগুলি ব্যবহার করতে (যেমন একটি বোতামের ক্লিক) তবে আপনি আরও ভাল করে শীর্ষে রাখুন। যদি আপনার স্টাইলিংটি 100% সিএসএস হয় এবং আপনার বোতাম ক্রিয়াগুলির জন্য সমস্ত ফ্যালব্যাক বিকল্প রয়েছে তবে আপনি এটিকে নীচে রাখতে পারেন।

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


3

স্ক্রিপ্টগুলি অন্তর্ভুক্ত করে মূলত সেখানে ব্যবহার করা হয় যেখানে ওয়েবসাইটের সামগ্রী / স্টাইলগুলি প্রথমে দেখানো হবে।

মাথার স্ক্রিপ্টগুলি সহ স্ক্রিপ্টগুলি প্রারম্ভিকভাবে লোড করে এবং পুরো ওয়েব সাইটটি লোড হওয়ার আগে ব্যবহার করা যেতে পারে।

যদি স্ক্রিপ্টগুলি শেষ পর্যন্ত প্রবেশ করা হয় তবে পুরো শৈলী এবং ডিজাইনের লোডিংয়ের পরে বৈধতাটি ঘটবে যা দ্রুত প্রতিক্রিয়াশীল ওয়েবসাইটগুলির জন্য প্রশংসিত নয়।


2

স্ক্রিপ্ট এবং এর ব্যবহারের উপর নির্ভর করে সর্বোত্তম সম্ভব (পৃষ্ঠা লোড এবং রেন্ডারিংয়ের শর্তাবলী) প্রতি সেম্পরাগত একটি <স্ক্রিপ্ট> -ট্যাগ ব্যবহার না করা, তবে স্ক্রিপ্টের লোডিংকে অবিচ্ছিন্নভাবে গতিশীল করতে হতে পারে।

কিছু আলাদা কৌশল রয়েছে তবে উইন্ডো.অনলোড ইভেন্টটি ট্রিগার করা হলে ডকুমেন্ট.ক্রেটএলিমেন্ট ("স্ক্রিপ্ট") ব্যবহার করা সবচেয়ে সোজা ফরোয়ার্ড। তারপরে পৃষ্ঠাটি নিজেই রেন্ডার হয়ে গেলে স্ক্রিপ্টটি প্রথমে লোড হয়, সুতরাং পৃষ্ঠাটি প্রদর্শিত হওয়ার জন্য ব্যবহারকারীকে অপেক্ষা করতে থাকা সময়টিকে প্রভাবিত করে না।

এটি স্বাভাবিকভাবেই প্রয়োজন যে পৃষ্ঠার রেন্ডারিংয়ের জন্য স্ক্রিপ্টটি নিজেই প্রয়োজন নেই।

আরও তথ্যের জন্য, স্টিভ সাউডারস (ওয়াইস্লো এর স্রষ্টা তবে এখন গুগলে) সংযুক্ত পোস্টটি সংযোগকারী এ্যাসিঙ্ক স্ক্রিপ্টগুলি দেখুন


2
  • আপনি যদি এখনও আই <10 তে সমর্থন এবং কর্মক্ষমতা সম্পর্কে অনেক চিন্তা করেন তবে সর্বদা আপনার স্ক্রিপ্ট ট্যাগগুলি আপনার এইচটিএমএল বডিটির শেষ ট্যাগগুলি করা সর্বদা সেরা। এইভাবে, আপনি নিশ্চিত যে বাকী ডিওএম লোড হয়েছে এবং আপনি ব্লক এবং উপস্থাপনা করবেন না।

  • আপনি যদি আই <10 সম্পর্কে খুব বেশি চিন্তা না করেন তবে আপনি আপনার ডকুমেন্টের মাথায় আপনার স্ক্রিপ্টগুলি রাখতে পারেন এবং এটি deferকেবল আপনার ডোম লোড হওয়ার পরে চালানো হবে তা নিশ্চিত করতে ব্যবহার করতে পারেন ( <script type="text/javascript" src="path/to/script1.js" defer></script>)। আপনি যদি এখনও আপনার কোডটি আইই <10 তে কাজ করতে চান তবে আপনার কোডটি window.onloadএমনকি সন্ধ্যায় মোড়ানো ভুলবেন না !


গৃহীত উত্তরে, এটি "পুরানো প্রস্তাবনা" হিসাবে উল্লেখ করা হয়। যদি আপনি এখনও এটি বোঝায়, আপনার সম্ভবত এটির পিছনে কিছু রেফারেন্স তৈরি করা উচিত।
ডাকাব

1

স্ক্রিপ্ট এটি লোড করা এবং সম্পাদন করা অবধি ডম লোডকে অবরুদ্ধ করে।

আপনি যদি <body>সমস্ত ডিওএম এর শেষে স্ক্রিপ্টগুলি রাখেন তবে লোড এবং রেন্ডার করার সুযোগ রয়েছে (পৃষ্ঠাটি "দ্রুত" প্রদর্শিত হবে ")।<script>এই সমস্ত DOM উপাদানগুলির অ্যাক্সেস থাকবে।

অন্যদিকে এটিকে <body>শুরু করার পরে বা উপরে রাখার ফলে স্ক্রিপ্ট কার্যকর হবে (যেখানে এখনও কোনও ডোমের উপাদান নেই)।

আপনি jQuery অন্তর্ভুক্ত করছেন যার অর্থ আপনি যেখানে ইচ্ছা সেখানে এটি স্থাপন করতে পারেন ready প্রস্তুতি ()


1

আমি মনে করি এটি ওয়েবপৃষ্ঠার প্রয়োগের উপর নির্ভর করে। আপনি যে পৃষ্ঠাটি প্রদর্শন করতে চান তা যদি প্রথমে জাভাস্ক্রিপ্ট লোড না করে সঠিকভাবে প্রদর্শিত না হয় তবে আপনার প্রথমে জাভাস্ক্রিপ্ট ফাইলটি অন্তর্ভুক্ত করা উচিত। তবে আপনি যদি প্রাথমিকভাবে জাভাস্ক্রিপ্ট ফাইল ডাউনলোড না করে কোনও ওয়েবপৃষ্ঠা প্রদর্শন / রেন্ডার করতে পারেন তবে আপনার জাভাস্ক্রিপ্ট কোডটি পৃষ্ঠার নীচে রাখা উচিত। কারণ এটি একটি দ্রুত পৃষ্ঠা লোড অনুকরণ করবে এবং ব্যবহারকারীর দৃষ্টিকোণ থেকে মনে হবে যে পৃষ্ঠাটি দ্রুত লোড হচ্ছে।


1

আপনি বেশিরভাগ <script>রেফারেন্সের শেষে রেখে দিতে পারেন <body>,
তবে আপনার পৃষ্ঠায় যদি সক্রিয় উপাদানগুলি থাকে যা বাহ্যিক স্ক্রিপ্টগুলি ব্যবহার করে থাকে,
তবে তাদের নির্ভরতা (জেএস ফাইলগুলি) এর আগে আসবে (আদর্শভাবে হেড ট্যাগে)।



-1

এইচটিএমএল ডকুমেন্টের শেষে

যাতে এটি কার্যকর করার সময় ব্রাউজারে এইচটিএমএল ডকুমেন্টের লোডিংয়ের উপর প্রভাব ফেলবে না।


-2

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

আমি শুনেছি যে সাফারিটির পুরানো সংস্করণগুলি আপনার স্ক্রিপ্টটি হেড ট্যাগের বাইরে যুক্ত করার সময় অদ্ভুত ছিল তবে আমি বলি কে পাত্তা দেয় না। আমি জানি না যে আপনি কেউ সেই পুরানো বাজে ব্যবহার করছেন।

যাইহোক ভাল প্রশ্ন।


-2

JavaScriptডকুমেন্টটি লোড করার জন্য ডকুমেন্ট কোডের শেষে আপনার কোডটি লেখার সেরা জায়গা, তারপরে জেএস কোডটি কার্যকর করুন। এবং আপনি JQueryকোড লিখুন

$(document).ready(function(){

//your code here...

});

এটা ছুড়ে ফেলেSyntaxError
রাজ

-6

আপনি যেখানে স্ক্রিপ্ট চান সেখানে রাখতে পারেন এবং একটি অন্য অনুশীলনের চেয়ে ভাল নয়।

পরিস্থিতি নিম্নরূপ:

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

ভাল অনুশীলন সনাক্ত করা কোথায় নির্ভর করে না।

আপনাকে সমর্থন করার জন্য, আমি নিম্নলিখিতগুলি উল্লেখ করব:

আপনি রাখতে পারেন:

এবং পৃষ্ঠাটি রৈখিকভাবে লোড হবে

পৃষ্ঠাটি অন্যান্য বিষয়বস্তু সহ অ্যাসক্রোনিকভাবে লোড করা হয়েছে

পৃষ্ঠার সামগ্রীটি স্ক্রিপ্টগুলি লোড হওয়ার আগে এবং শেষ হওয়ার পরে লোড হবে

এখানে ভাল অনুশীলন হবে, কখন বাস্তবায়ন করবে?

আমি আশা করি আমি সহায়ক হয়েছি, যে কোনও কিছু আমাকে এই সমস্যার উত্তর দেয়।

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