জিকুয়েরি বা একটি ডোম পদ্ধতি যেমন getElementById কেন উপাদান খুঁজে পাবে না?


483

সম্ভাব্য কারণগুলি কী কী document.getElementById, $("#id")বা অন্য কোনও ডিওএম পদ্ধতি / jQuery নির্বাচক উপাদানগুলি খুঁজে পাচ্ছে না?

উদাহরণস্বরূপ সমস্যার মধ্যে রয়েছে:

  • jQuery নিঃশব্দে কোনও ইভেন্ট হ্যান্ডলারকে বাঁধতে ব্যর্থ
  • jQuery এর "সংগ্রহকারী" পদ্ধতি ( .val(), .html(), .text()) ফিরেundefined
  • একটি স্ট্যান্ডার্ড ডিওএম পদ্ধতি ফিরে আসা nullযার ফলে বেশ কয়েকটি ত্রুটি হয়:

আনকাচড টাইপ এরিয়ার: নাল আনকচড প্রকারের '...' সম্পত্তি সেট করা যায় না: নালীর সম্পত্তি '...' পড়তে পারে না

সর্বাধিক সাধারণ ফর্মগুলি হ'ল:

আনকড টাইপ এরির: নালীর 'অনক্লিক' সম্পত্তি সেট করা যায় না

আনকচড টাইপ এয়ারার: ​​নালীর সম্পত্তি 'অ্যাডভেন্টেস্টলিস্টার' পড়তে পারে না

আনকড টাইপ এরির: নালার সম্পত্তি 'স্টাইল' পড়তে পারে না


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

উত্তর:


481

আপনার স্ক্রিপ্টটি যখন চলছিল তখন আপনি যে উপাদানটি সন্ধান করার চেষ্টা করছেন তা ডোমে ছিল না ।

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

নিম্নলিখিত মার্কআপ বিবেচনা করুন; স্ক্রিপ্ট # 1 <div>যখন স্ক্রিপ্ট # 2 সাফল্য পেয়ে যায় তা খুঁজে পেতে ব্যর্থ হয় :

<script>
  console.log("script #1: %o", document.getElementById("test")); // null
</script>
<div id="test">test div</div>
<script>
  console.log("script #2: %o", document.getElementById("test")); // <div id="test" ...
</script>

তাহলে এখন তোমার কি করা উচিত? আপনি কয়েকটি বিকল্প পেয়েছেন:


বিকল্প 1: আপনার স্ক্রিপ্ট সরান

ক্লোজড বডি ট্যাগের ঠিক আগে, আপনার স্ক্রিপ্টটি আরও নীচে পৃষ্ঠায় সরান। এই ফ্যাশনে সংগঠিত, আপনার স্ক্রিপ্টটি কার্যকর হওয়ার আগে বাকী নথিকে পার্স করা হয়েছে:

<body>
  <button id="test">click me</button>
  <script>
    document.getElementById("test").addEventListener("click", function() {
      console.log("clicked: %o", this);
    });
  </script>
</body><!-- closing body tag -->

দ্রষ্টব্য: নীচে স্ক্রিপ্টগুলি স্থাপন করা একটি সেরা অনুশীলন হিসাবে বিবেচিত হয় ।


বিকল্প 2: jQuery এর ready()

আপনার স্ক্রিপ্ট স্থগিত করুন যতক্ষণ না ডিওএম পুরোপুরি বিশ্লেষণ না করা হয় :$(handler)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
  $(function() {
    $("#test").click(function() {
      console.log("clicked: %o", this);
    });
  });
</script>
<button id="test">click me</button>

দ্রষ্টব্য: আপনি কেবল DOMContentLoadedবা কেবল বাঁধতে পারেন তবে প্রত্যেকের এর ক্যাভেট রয়েছে। jQuery এর একটি সংকর সমাধান সরবরাহ করে।window.onloadready()


বিকল্প 3: ইভেন্ট ডেলিগেশন

ডেলিগেটেড ইভেন্টগুলির সুবিধা রয়েছে যে তারা পরবর্তী সময়ে নথিতে যুক্ত হওয়া বংশধর উপাদানগুলি থেকে ইভেন্টগুলি প্রক্রিয়া করতে পারে।

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

jQuery এর on()আমাদের জন্য সেই যুক্তি সম্পাদন করে। আমরা কেবল একটি ইভেন্টের নাম, পছন্দসই বংশধরদের জন্য নির্বাচক এবং ইভেন্ট হ্যান্ডলার সরবরাহ করি:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
  $(document).on("click", "#test", function(e) {
    console.log("clicked: %o",  this);
  });
</script>
<button id="test">click me</button>

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


বিকল্প 4: deferবৈশিষ্ট্য

এর deferবৈশিষ্ট্যটি ব্যবহার করুন <script>

[ defer, একটি বুলিয়ান অ্যাট্রিবিউট,] একটি ব্রাউজারকে নির্দেশ করতে সেট করা হয়েছে যে ডকুমেন্টটি বিশ্লেষণের পরে স্ক্রিপ্টটি কার্যকর করা হয়েছিল, তবে গুলি চালানোর আগে DOMContentLoaded

<script src="https://gh-canon.github.io/misc-demos/log-test-click.js" defer></script>
<button id="test">click me</button>

রেফারেন্সের জন্য, external বাহ্যিক স্ক্রিপ্ট থেকে কোডটি এখানে :

document.getElementById("test").addEventListener("click", function(e){
   console.log("clicked: %o", this); 
});

নোট: deferঅ্যাট্রিবিউট অবশ্যই মনে হয় একটি ম্যাজিক বুলেট মত কিন্তু এটা আদেশ সহকারে সচেতন হতে হবে গুরুত্বপূর্ণ ...
1. deferশুধুমাত্র বাহ্যিক স্ক্রিপ্ট ব্যবহার করা যেতে পারে, অর্থাত্: এই একটি থাকার srcঅ্যাট্রিবিউট।
২. ব্রাউজার সমর্থন সম্পর্কে সচেতন থাকুন , যেমন: আইই <10 তে বগি প্রয়োগ


এটি এখন ২০২০ - "নীচে স্ক্রিপ্টগুলি স্থাপন করা" এখনও "সেরা অনুশীলন হিসাবে বিবেচিত"? আমি (আজকাল) আমার সমস্ত সংস্থানগুলি স্ক্রিপ্টগুলিতে <head>ব্যবহার করি এবং ব্যবহার deferকরি (আমাকে খারাপ-পুরাতন অসম্পূর্ণ ব্রাউজারগুলি সমর্থন করতে হবে না)
স্টিফেন পি

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

146

সংক্ষিপ্ত এবং সহজ: কারণ আপনি যে উপাদানগুলির সন্ধান করছেন সেগুলি দস্তাবেজে বিদ্যমান নেই (এখনও)।


এই উত্তরটি বাকি জন্য আমি ব্যবহার করবে getElementByIdউদাহরণ হিসেবে, কিন্তু একই ক্ষেত্রে প্রযোজ্য getElementsByTagName, querySelectorএবং অন্য কোন করে DOM পদ্ধতি যা নির্বাচন উপাদান।

সম্ভাব্য কারণগুলি

উপাদানটির অস্তিত্ব না থাকার দুটি কারণ রয়েছে:

  1. পাস করা আইডি সহ একটি উপাদান সত্যই নথিতে উপস্থিত নেই। আপনার দ্বিগুণ পরীক্ষা করে দেখতে হবে যে আপনি যে আইডিটি পাস করেছেন তা getElementByIdসত্যই (উত্পন্ন) এইচটিএমএলে বিদ্যমান উপাদানটির আইডির সাথে মেলে এবং আপনি যে আইডিটি ভুল বানান করেন নি (আইডিগুলি কেস-সংবেদনশীল !)।

    ঘটনাচক্রে, বেশিরভাগ সমসাময়িক ব্রাউজারগুলিতে , যা প্রয়োগ করে querySelector()এবং querySelectorAll()পদ্ধতিগুলিতে, সিএসএস-স্টাইল সংকেত দ্বারা কোনও উপাদান পুনরুদ্ধার করতে ব্যবহৃত হয় id, উদাহরণস্বরূপ: document.querySelector('#elementID')যে পদ্ধতির মাধ্যমে কোনও উপাদান তার idঅধীনে পুনরুদ্ধার করা হয় তার বিপরীতে document.getElementById('elementID'); প্রথমটিতে #চরিত্রটি অপরিহার্য, দ্বিতীয়টিতে এটি উপাদান পুনরুদ্ধার না করার দিকে পরিচালিত করবে।

  2. আপনি কল করার মুহুর্তে উপাদানটির অস্তিত্ব নেই getElementById

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

নিম্নলিখিত উদাহরণ বিবেচনা করুন:

<script>
    var element = document.getElementById('my_element');
</script>

<div id="my_element"></div>

divমনে হচ্ছে, পরেscript । স্ক্রিপ্টটি কার্যকর হওয়ার মুহুর্তে উপাদানটি এখনও বিদ্যমান নেই এবং getElementByIdফিরে আসবে null

jQuery এর

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

যুক্ত হওয়া মোচড়টি হল যখন jQuery পাওয়া যায় না কারণ আপনি প্রোটোকল ছাড়াই স্ক্রিপ্টটি লোড করেছেন এবং ফাইল সিস্টেম থেকে চালাচ্ছেন:

<script src="//somecdn.somewhere.com/jquery.min.js"></script>

এই সিনট্যাক্সটি প্রোটোকল https: // সহ একটি পৃষ্ঠায় এইচটিটিপিএসের মাধ্যমে স্ক্রিপ্টটি লোড করার জন্য এবং প্রোটোকল HTTP: // সহ একটি পৃষ্ঠায় HTTP সংস্করণটি লোড করার জন্য ব্যবহৃত হয়

এটি লোড করতে ব্যর্থ এবং ব্যর্থ হওয়ার দুর্ভাগ্যজনক পার্শ্ব প্রতিক্রিয়া রয়েছে file://somecdn.somewhere.com...


সলিউশন

আপনি getElementById(বা কোনও বিষয়ে কোনও ডিওএম পদ্ধতিতে) কল করার আগে নিশ্চিত হয়ে নিন যে আপনি যে উপাদানগুলিতে অ্যাক্সেস করতে চান সেগুলি বিদ্যমান রয়েছে, অর্থাৎ ডিওএম লোড হয়েছে।

এটি কেবল আপনার জাভাস্ক্রিপ্টটি সম্পর্কিত ডিওএম উপাদানটির পরে রেখে নিশ্চিত করা যেতে পারে

<div id="my_element"></div>

<script>
    var element = document.getElementById('my_element');
</script>

সেক্ষেত্রে আপনি ক্লোজিং বডি ট্যাগের ঠিক আগে কোডটিও রেখে দিতে পারেন ( </body>) (স্ক্রিপ্টটি কার্যকর হওয়ার সময় সমস্ত ডিওএম উপাদান উপলব্ধ থাকবে)।

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

উদাহরণ:

window.onload = function() {
    // process DOM elements here
};

// or

// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
    // process DOM elements here
});

ইভেন্ট পরিচালনা ও ব্রাউজারের পার্থক্য সম্পর্কিত আরও তথ্যের জন্য দয়া করে নিবন্ধগুলি quirksmode.org এ দেখুন।

jQuery এর

প্রথমে নিশ্চিত হয়ে নিন যে jQuery সঠিকভাবে লোড হয়েছে। ব্রাউজারের বিকাশকারী সরঞ্জামগুলি ব্যবহার করুন jQuery ফাইলটি পাওয়া গেছে কিনা তা অনুসন্ধান করতে এবং URL টি সঠিক না হলে সংশোধন করুন (যেমন শুরুতে http:বা https:স্কিম যোগ করুন , পথটি সামঞ্জস্য করুন ইত্যাদি) etc.

শোনা load/ DOMContentLoaded ঘটনা ঠিক কি jQuery সঙ্গে করছে .ready() [ডক্স] । আপনার সমস্ত jQuery কোড যা DOM উপাদানকে প্রভাবিত করে সেই ইভেন্ট হ্যান্ডলারের অভ্যন্তরে থাকা উচিত।

আসলে, jQuery টিউটোরিয়াল স্পষ্টভাবে বলে:

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

এটি করার জন্য, আমরা দস্তাবেজের জন্য প্রস্তুত ইভেন্টটি নিবন্ধভুক্ত করি।

$(document).ready(function() {
   // do stuff when DOM is ready
});

বিকল্পভাবে আপনি শর্টহ্যান্ড সিনট্যাক্সও ব্যবহার করতে পারেন:

$(function() {
    // do stuff when DOM is ready
});

দুটোই সমান।


1
ready"নতুন" পছন্দের সিনট্যাক্সটি প্রতিবিম্বিত করার জন্য ইভেন্টটি সম্পর্কে সর্বশেষ বিটটি সংশোধন করার উপযুক্ত হবে , বা এটি পুরানো সংস্করণগুলি জুড়ে কাজ করে তাই সেটিকে ছেড়ে দেওয়া কি ভাল?
টাইসন টি।

1
JQuery এর জন্য, এটি বিকল্পের সাথে যুক্ত হওয়াও $(window).load()(এবং সম্ভবত, সিন্টেক্সটিক বিকল্পগুলি $(document).ready(), $(function(){})এটি সম্পর্কিত বলে মনে হচ্ছে, তবে আপনি যে পয়েন্টটি তৈরি করছেন তার থেকে কিছুটা স্পর্শকাতর অনুভূত হয়
ডেভিড বলেছেন

@ ডেভিড: সাথে ভাল পয়েন্ট .load। বাক্য গঠন বিকল্প সম্পর্কে, তাদের ডকুমেন্টেশনে সন্ধান করা যেতে পারে তবে যেহেতু উত্তরগুলি স্বয়ংসম্পূর্ণ থাকতে হবে, এটি আসলে এগুলি যুক্ত করার উপযুক্ত হতে পারে। তারপরে আবার, আমি দৃ pretty়ভাবে নিশ্চিত যে jQuery সম্পর্কে এই নির্দিষ্ট বিটের উত্তর ইতিমধ্যে দেওয়া হয়েছিল এবং সম্ভবত অন্য উত্তরে inাকা রয়েছে এবং এর সাথে লিঙ্ক করা যথেষ্ট হতে পারে।
ফেলিক্স ক্লিং

1
@ ডেভিড: আমাকে সংশোধন করতে হবে: স্পষ্টতই হ্রাস.load করা হয়েছে: api.jquery.com/load-event । আমি জানি না এটি কেবল চিত্রগুলির জন্য বা windowপাশাপাশি।
ফেলিক্স ক্লিং

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

15

আইডি ভিত্তিক নির্বাচকরা কাজ না করার কারণগুলি

  1. নির্দিষ্ট আইডি সহ উপাদান / ডিওএম এখনও বিদ্যমান নেই।
  2. উপাদানটি বিদ্যমান, তবে এটি ডোমে নিবন্ধভুক্ত নয় [এইচএমএল নোডের ক্ষেত্রে অ্যাজাক্স প্রতিক্রিয়াগুলি থেকে গতিশীলভাবে সংযোজন করা হয়েছে]।
  3. একই আইডি সহ একাধিক উপাদান উপস্থিত রয়েছে যা দ্বন্দ্ব সৃষ্টি করছে।

সলিউশন

  1. উপাদানটি ঘোষণার পরে অ্যাক্সেস করার চেষ্টা করুন বা বিকল্প হিসাবে স্টাফ ব্যবহার করুন $(document).ready();

  2. আজাক্স প্রতিক্রিয়া থেকে আসা উপাদানগুলির জন্য, .bind()jQuery এর পদ্ধতিটি ব্যবহার করুন । JQuery এর পুরানো সংস্করণগুলির .live()জন্য একই ছিল।

  3. সদৃশ আইডির সন্ধান করতে এবং সেগুলি সরাতে সরঞ্জামগুলি [উদাহরণস্বরূপ, ব্রাউজারগুলির জন্য ওয়েবডেলিভার প্লাগইন] ব্যবহার করুন।


13

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

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

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

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


13

আপনি যে উপাদানটি অ্যাক্সেস করার চেষ্টা করছেন সেটি যদি কোনও অভ্যন্তরে থাকে iframeএবং আপনি এর প্রসঙ্গের বাইরে এটি অ্যাক্সেস করার চেষ্টা করেন তবে এটি iframeএটিকে ব্যর্থও হতে পারে।

আপনি যদি একটি আইফ্রেমে একটি উপাদান পেতে চান তবে আপনি এখানে কীভাবে তা জানতে পারবেন ।


7

যদি স্ক্রিপ্ট সম্পাদন আদেশটি সমস্যা না হয় তবে সমস্যার আর একটি সম্ভাব্য কারণ হ'ল উপাদানটি সঠিকভাবে নির্বাচন করা হচ্ছে না:

  • getElementByIdপাস হওয়া স্ট্রিংয়ের আইডি ভারব্যাটিয়াম হতে হবে এবং অন্য কিছুই নয়। আপনি যদি পাসের স্ট্রিংকে একটি দিয়ে উপসর্গ করেন #এবং আইডিটি কোনও দিয়ে শুরু না করা হয় তবে #কিছুই নির্বাচন করা হবে না:

    <div id="foo"></div>
    // Error, selected element will be null:
    document.getElementById('#foo')
    // Fix:
    document.getElementById('foo')
  • একইভাবে, এর জন্য getElementsByClassName, পাসের স্ট্রিংটিকে একটি দিয়ে উপসর্গ করবেন না .:

    <div class="bar"></div>
    // Error, selected element will be undefined:
    document.getElementsByClassName('.bar')[0]
    // Fix:
    document.getElementsByClassName('bar')[0]
  • নির্দিষ্ট শ্রেণীর নামের সাথে কোনও উপাদান মেলে, .ক্লাসের সামনে সরাসরি রাখুন ক্যোয়ারিলেক্টর, ক্যোয়ারিলেক্টরআল এবং jQuery এর সাথে । একইভাবে, কোনও নির্দিষ্ট আইডির সাথে কোনও উপাদানটির সাথে মেলে, #সরাসরি আইডির সামনে রাখুন:

    <div class="baz"></div>
    // Error, selected element will be null:
    document.querySelector('baz')
    $('baz')
    // Fix:
    document.querySelector('.baz')
    $('.baz')

    এখানকার নিয়মগুলি বেশিরভাগ ক্ষেত্রে সিএসএস নির্বাচকদের মতো, এবং এখানে বিস্তারিতভাবে দেখা যায় ।

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

    <div class="foo bar"></div>

    কোয়েরি স্ট্রিং ব্যবহার করুন .foo.bar। নির্বাচন

    <div class="foo" data-bar="someData"></div>

    কোয়েরি স্ট্রিং ব্যবহার করুন .foo[data-bar="someData"]<span>নীচে নির্বাচন করতে :

    <div class="parent">
      <span data-username="bob"></span>
    </div>

    ব্যবহার div.parent > span[data-username="bob"]

  • উপরের সমস্তটির জন্য মূলধন এবং বানানটি গুরুত্বপূর্ণ । যদি মূলধনটি আলাদা হয়, বা বানানটি আলাদা হয় তবে উপাদানটি নির্বাচন করা হবে না:

    <div class="result"></div>
    // Error, selected element will be null:
    document.querySelector('.results')
    $('.Result')
    // Fix:
    document.querySelector('.result')
    $('.result')
  • পদ্ধতিগুলির যথাযথ মূলধন এবং বানান রয়েছে তাও আপনাকে নিশ্চিত করতে হবে। এর মধ্যে একটি ব্যবহার করুন:

    $(selector)
    document.querySelector
    document.querySelectorAll
    document.getElementsByClassName
    document.getElementsByTagName
    document.getElementById

    অন্য কোনও বানান বা মূলধন কাজ করবে না। উদাহরণস্বরূপ, document.getElementByClassNameএকটি ত্রুটি নিক্ষেপ করবে।

  • আপনি এই নির্বাচক পদ্ধতিতে একটি স্ট্রিং পাস করেছেন তা নিশ্চিত করুন। আপনি কিছু যে একটি স্ট্রিং নয় পাস যদি querySelector, getElementByIdইত্যাদি এটা প্রায় অবশ্যই কাজ করবে না।


0

আমি যখন আপনার কোড চেষ্টা করেছিলাম তখন এটি কার্যকর হয়েছিল।

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

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

বিকল্প 1: আপনি নথি প্রস্তুত ইভেন্টের মধ্যে আপনার ইভেন্টের বাইন্ডিং কোডটি সরাতে পারেন। ভালো লেগেছে:

document.addEventListener('DOMContentLoaded', (event) => {
  //your code to bind the event
});

বিকল্প 2: আপনি টাইমআউট ইভেন্টটি ব্যবহার করতে পারেন, যাতে বাইন্ডিংটি কয়েক সেকেন্ডের জন্য বিলম্বিত হয়। মত:

setTimeout(function(){
  //your code to bind the event
}, 500);

অপশন ৩: আপনার জাভাস্ক্রিপ্টটি আপনার পৃষ্ঠার নীচে অন্তর্ভুক্ত করুন।

এটি তোমাকে সাহায্য করবে বলে আশা করি।


@ উইল্ডোমাইবেস্ট 18, দয়া করে এই উত্তরটি দেখুন
যতিন্দর কুমার

-1

সমস্যাটি হ'ল জাভাস্ক্রিপ্ট কোডটি কার্যকর হওয়ার সময় ডোম উপাদান 'স্পেসিস্ট' তৈরি করা হয়নি। তাই আমি জাভাস্ক্রিপ্ট কোডটি একটি ফাংশনের ভিতরে রেখেছি এবং সেই ফাংশনটিকে বডি অনলোড ইভেন্টে ডেকেছি।

function do_this_first(){
   //appending code
}

<body onload="do_this_first()">
</body>

-1

আমার সমাধান একটি নোঙ্গর উপাদান আইডি ব্যবহার না করার ছিল: <a id='star_wars'>Place to jump to</a>। স্পষ্টতই ব্লেজার এবং অন্যান্য স্পা ফ্রেমওয়ার্কগুলিতে একই পৃষ্ঠায় অ্যাঙ্কারে ঝাঁপিয়ে পড়া সমস্যা রয়েছে have কাছাকাছি পেতে আমি ব্যবহার করতে হয়েছিল document.getElementById('star_wars')। তবে এই পর্যন্ত আমি এর পরিবর্তে একটি অনুচ্ছেদ উপাদানের ক্ষেত্রে আইডি করা কাজ করে নি: <p id='star_wars'>Some paragraph<p>

বুটস্ট্র্যাপ ব্যবহারের উদাহরণ:

<button class="btn btn-link" onclick="document.getElementById('star_wars').scrollIntoView({behavior:'smooth'})">Star Wars</button>

... lots of other text

<p id="star_wars">Star Wars is an American epic...</p>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.