নালীর সম্পত্তি 'অ্যাডএভেন্টলিস্টনার' পড়তে পারে না


113

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

নীচে মেনুটি খোলার বোতামটির কোড রয়েছে।

function swapper() {
toggleClass(document.getElementById('overlay'), 'open');
}

var el = document.getElementById('overlayBtn');
el.addEventListener('click', swapper, false);

var text = document.getElementById('overlayBtn');
text.onclick = function(){
this.innerHTML = (this.innerHTML === "Menu") ? "Close" : "Menu";
return false;
};

আমি কীভাবে এটি মোকাবেলা করব? আমার সম্ভবত এই কোডটি অন্য কোনও ফাংশনে মোড়ানো বা একটি / অন্য বিবৃতি ব্যবহার করা দরকার যাতে এটি কেবল নির্দিষ্ট পৃষ্ঠাগুলিতে আইডি অনুসন্ধান করে, তবে ঠিক নিশ্চিত নয় not


4
আপনি কি এইচটিএমএল কোডটি দেখাতে পারেন? দেখে মনে হচ্ছে যে 'ওভারলেবিটিএন' আইডি দিয়ে উপাদানটি খুঁজে পাচ্ছে না
ব্ল্যাশডো

4
যে পৃষ্ঠাগুলিতে ফাংশনটি আইডিটি সন্ধান করতে পারে না সেখানে আমি ত্রুটিটি পেয়েছি "নালীর সম্পত্তি 'অ্যাডএভেন্টলিস্টনার' পড়তে পারি না" এবং আমার অন্য কোনও ফাংশন কাজ করে না work আমি মনে করি উত্তরটি বেশ কিছু প্রশ্নের মধ্যে ছিল। আপনি উপাদানটি খুঁজে
পেলেন

4
এটির classপরিবর্তে যদি আপনি এইচটিএমএল ব্যবহার না করে থাকেন idএবং আপনি getElementByIdআপনার স্ক্রিপ্টগুলিতে একটি কল করে থাকেন তবে এটি সহজেই ঘটতে পারে ।
ডেকে

ঠিক যেখানে একই সমস্যার মুখোমুখি addEventListener could be null। ট্যাগ <script src="..."></script>পরে চলন্ত <body/>এই সমস্যার সমাধান বলে মনে হচ্ছে।
পুনর্বার জন্ম

উত্তর:


212

আমি মনে করি সহজ elশ্রোতা হ'ল কোনও ইভেন্ট শ্রোতা যুক্ত করার আগে কেবল এটি বাতিল নয় যাচাই করা হবে :

var el = document.getElementById('overlayBtn');
if(el){
  el.addEventListener('click', swapper, false);
}

অসাধারণ. কৌতুকটি করেছিল আমি অনক্লিক ফাংশনটিকেও যদি সেই বিবৃতিতে সরিয়েছি। আমি নীচে চূড়ান্ত কোড পোস্ট।
মরক্লো

4
এটি nullপ্রতিক্রিয়া উপাদান মাউন্ট না আগে হবে !

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

117

দেখে মনে হচ্ছে document.getElementById('overlayBtn');এটি ফিরে আসছে nullকারণ এটি ডিওএমের পুরোপুরি লোড হওয়ার আগেই কার্যকর করে।

আপনি যদি কোডের এই লাইনটি রাখেন

window.onload=function(){
  -- put your code here
}

তাহলে এটি ইস্যু ছাড়াই চলবে।

উদাহরণ:

window.onload=function(){
    var mb = document.getElementById("b");
    mb.addEventListener("click", handler);
    mb.addEventListener("click", handler2);
}


function handler() {
    $("p").html("<br>" + $("p").text() + "<br>You clicked me-1!<br>");
}

function handler2() {
    $("p").html("<br>" + $("p").text() + "<br>You clicked me-2!<br>");
}

24

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


4
হ্যাঁ, আমি মনে করি দৃশ্যের উপর নির্ভর করে এই সমস্যার একাধিক সমাধান রয়েছে।
rpeg

16

আমি একই ত্রুটি পেয়েছিলাম, কিন্তু নাল চেক করা কোনওরকম সাহায্য করবে বলে মনে হচ্ছে না।

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

document.addEventListener('DOMContentLoaded', function () {
    el.addEventListener('click', swapper, false);
});

আমি মনে করি এটি কারণ আমি একটি ফ্রেমওয়ার্ক (কৌণিক) ব্যবহার করছি যা আমার এইচটিএমএল ক্লাস এবং আইডি'র পরিবর্তনশীল পরিবর্তন করছে।


4
ইলেকট্রনের সাথে খেলার সময় আমিও একই সমস্যায় পড়েছি। একই পদ্ধতি ব্যবহার করে এটি সংরক্ষণ করে।
চার্লস

9

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

আপনি আপনার জাভাস্ক্রিপ্ট কোডটি এইচটিএমএলের নীচেও রাখতে পারেন।


8

স্ক্রিপ্ট শরীরের আগে লোড হচ্ছে, সামগ্রীর পরে স্ক্রিপ্ট রাখুন


8

বডি ট্যাগের শেষে স্ক্রিপ্টটি রাখুন।

<html>
    <body>
        .........
        <script src="main.js"></script>
    </body>
</html>

3

Thanks to @Rob M. for his help. This is what the final block of code looked like:

function swapper() {
  toggleClass(document.getElementById('overlay'), 'open');
}

var el = document.getElementById('overlayBtn');
if (el){
  el.addEventListener('click', swapper, false);

  var text = document.getElementById('overlayBtn');
  text.onclick = function(){
    this.innerHTML = (this.innerHTML === "Menu") ? "Close" : "Menu";
    return false;
  };
}

2

I simply added 'async' to my script tag, which seems to have fixed the issue. I'm not sure why, if someone can explain, but it worked for me. My guess is that the page isn't waiting for the script to load, so the page loads at the same time as the JavaScript.

Async/Await enables us to write asynchronous code in a synchronous fashion. it’s just syntactic sugar using generators and yield statements to “pause” execution, giving us the ability to assign it to a variable!

Here's reference link- https://medium.com/siliconwat/how-javascript-async-await-works-3cab4b7d21da


2

I encountered the same problem and checked for null but it did not help. Because the script was loading before page load. So just by placing the script before the end body tag solved the problem.


0

As others have said problem is that script is executed before the page (and in particular the target element) is loaded.

But I don't like the solution of reordering the content.

Preferred solution is to put an event handler on page onload event and set the Listener there. That will ensure the page and the target element is loaded before the assignment is executed. eg

    <script>
    function onLoadFunct(){
            // set Listener here, also using suggested test for null
    }
    ....
    </script>

    <body onload="onLoadFunct()" ....>
    .....

0

I've a collection of quotes along with names. I'm using update button to update the last quote associated with a specific name but on clicking update button it's not updating. I'm including code below for server.js file and external js file (main.js).

main.js (external js)

var update = document.getElementById('update');
if (update){
update.addEventListener('click', function () {

  fetch('quotes', {
  method: 'put',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    'name': 'Muskan',
    'quote': 'I find your lack of faith disturbing.'
  })
})var update = document.getElementById('update');
if (update){
update.addEventListener('click', function () {

  fetch('quotes', {
  method: 'put',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    'name': 'Muskan',
    'quote': 'I find your lack of faith disturbing.'
  })
})
.then(res =>{
    if(res.ok) return res.json()
})
.then(data =>{
    console.log(data);
    window.location.reload(true);
})
})
}

server.js file

app.put('/quotes', (req, res) => {
  db.collection('quotations').findOneAndUpdate({name: 'Vikas'},{
    $set:{
        name: req.body.name,
        quote: req.body.quote
    }
  },{
    sort: {_id: -1},
    upsert: true
  },(err, result) =>{
    if (err) return res.send(err);
    res.send(result);
  })

})

0

Thanks from all, Load the Scripts in specific pages that you use, not for all pages, sometimes using swiper.js or other library it may cause this error message, the only way to solve this issue it to load the JS library on specific pages that ID is exist and prevent loading of the same library in all pages.

Hope this help you.


0

I had the same problem, but my id was present. So I tried adding "window.onload = init;" Then I wrapped my original JS code with an init function (call it what you want). This worked, so at least in my case, I was adding an event listener before my document loaded. This could be what you are experiencing as well.


-1

This is because the element hadn't been loaded at the time when the bundle js was being executed.

I'd move the <script src="sample.js" type="text/javascript"></script> to the very bottom of the index.html file. This way you can ensure script is executed after all the html elements have been parsed and rendered .


Incorrect. This is old school thinking. Loading at the end delays the loading, as you stated, but it does not ensure the DOM is fully drawn. I've had older pages that used this hack fail to run because the DOM draw was slower than the load. This answer ensures the DOM is drawn before execution.
Machavity

-3

Add all event listeners when a window loads.Works like a charm no matter where you put script tags.

window.addEventListener("load", startup);

function startup() {

  document.getElementById("el").addEventListener("click", myFunc);
  document.getElementById("el2").addEventListener("input", myFunc);

}

myFunc(){}

The drawing of the page can sometimes take longer than the loading of the script does, so the position isn't that important in all cases. Adding a listener is the preferred way, but load is also deprecated for the same reason. DOMContentLoaded is the preferred way, since it fires only after the DOM is fully drawn.
Machavity

Thanks I will try. I got my answer from Mozilla network. I thought it was a trustful source.
Natalie Jimenez
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.