আনকড রেফারেন্স এরির: ফাংশনটি অনক্লিক দিয়ে সংজ্ঞায়িত করা হয়নি


85

আমি কাস্টম ইমোটস যুক্ত করার জন্য কোনও ওয়েবসাইটের জন্য একটি ব্যবহারকারী স্ক্রিপ্ট তৈরি করার চেষ্টা করছি । তবে, আমি অনেক ত্রুটি পেয়েছি been

ফাংশনটি এখানে:

function saveEmotes() {
    removeLineBreaks();
    EmoteNameLines = EmoteName.value.split("\n");
    EmoteURLLines = EmoteURL.value.split("\n");
    EmoteUsageLines = EmoteUsage.value.split("\n");

    if (EmoteNameLines.length == EmoteURLLines.length && EmoteURLLines.length == EmoteUsageLines.length) {
        for (i = 0; i < EmoteURLLines.length; i++) {
            if (checkIMG(EmoteURLLines[i])) {
                localStorage.setItem("nameEmotes", JSON.stringify(EmoteNameLines));
                localStorage.setItem("urlEmotes", JSON.stringify(EmoteURLLines));
                localStorage.setItem("usageEmotes", JSON.stringify(EmoteUsageLines));
                if (i == 0) {
                    console.log(resetSlot());
                }
                emoteTab[2].innerHTML += '<span style="cursor:pointer;" onclick="appendEmote(\'' + EmoteUsageLines[i] + '\')"><img src="' + EmoteURLLines[i] + '" /></span>';
            } else {
                alert("The maximum emote(" + EmoteNameLines[i] + ") size is (36x36)");
            }
        }
    } else {
        alert("You have an unbalanced amount of emote parameters.");
    }
}

spanট্যাগ এর onclickকল এই ফাংশন:

function appendEmote(em) {
    shoutdata.value += em;
}

আমি যখনই একটি onclickবৈশিষ্ট্যযুক্ত একটি বোতামটি ক্লিক করি তখনই আমি এই ত্রুটিটি পাই:

আনকড রেফারেন্স এরিয়ার: ফাংশনটি সংজ্ঞায়িত হয়নি।

কোন সাহায্য প্রশংসা করা হবে।

ধন্যবাদ!

হালনাগাদ

আমি ব্যবহার করার চেষ্টা করেছি:

emoteTab[2].innerHTML += '<span style="cursor:pointer;" id="'+ EmoteNameLines[i] +'"><img src="' + EmoteURLLines[i] + '" /></span>';
document.getElementById(EmoteNameLines[i]).addEventListener("click", appendEmote(EmoteUsageLines[i]), false);

তবে আমি একটি undefinedত্রুটি পেয়েছি ।

এখানে স্ক্রিপ্ট

শ্রোতা যদি কাজ করে এবং তারা আমার পক্ষে না যায় তা পরীক্ষার জন্য আমি এটি করার চেষ্টা করেছি:

emoteTab[2].innerHTML = '<td class="trow1" width="12%" align="center"><a id="togglemenu" style="cursor: pointer;">Custom Icons</a></br><a style="cursor: pointer;" id="smilies" onclick=\'window.open("misc.php?action=smilies&amp;popup=true&amp;editor=clickableEditor","Smilies","scrollbars=yes, menubar=no,width=460,height=360,toolbar=no");\' original-title="">Smilies</a><br><a style="cursor: pointer;" onclick=\'window.open("shoutbox.php","Shoutbox","scrollbars=yes, menubar=no,width=825,height=449,toolbar=no");\' original-title="">Popup</a></td></br>';
document.getElementById("togglemenu").addEventListener("click", changedisplay,false);

4
শুধুমাত্র প্রাসঙ্গিক কোড পোস্ট করুন। বিধি পড়তে.
Alt

4
আপনার সম্পূর্ণ স্ক্রিপ্টের লিঙ্কটি সর্বদা উপযুক্ত এবং প্রশংসাযোগ্য, প্রাসঙ্গিক কোড স্নিপেটগুলি ছাড়াও যা আপনার পোস্টে থাকা উচিত।
ব্রুক অ্যাডামস

উত্তর:


133

ব্যবহারকারীর .onclick()স্ক্রিপ্ট থেকে কখনও ব্যবহার বা অনুরূপ বৈশিষ্ট্য ব্যবহার করবেন না ! (এটি একটি নিয়মিত ওয়েব পৃষ্ঠায় খুব খারাপ অভ্যাস ))

কারণটি হ'ল ব্যবহারকারী onclickস্ক্রিপ্টগুলি একটি স্যান্ডবক্সে ("বিচ্ছিন্ন বিশ্ব") কাজ করে এবং লক্ষ্য-পৃষ্ঠার স্কোপে কাজ করে এবং আপনার স্ক্রিপ্টটি তৈরি করে এমন কোনও কার্য দেখতে পাবে না।

সর্বদা addEventListener()ডক (বা সমমানের লাইব্রেরি ফাংশন, যেমন jQuery .on () ) ব্যবহার করুন।

কোডের পরিবর্তে তাই:

something.outerHTML += '<input onclick="resetEmotes()" id="btnsave" ...>'


আপনি ব্যবহার করবেন:

something.outerHTML += '<input id="btnsave" ...>'

document.getElementById ("btnsave").addEventListener ("click", resetEmotes, false);

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

আপনার কোডটি বেশি পরিমাণে রিফ্যাকচার না করে আপনি ডেটা অ্যাট্রিবিউট সহ ডেটা পাস করতে পারেন। সুতরাং এই জাতীয় কোড ব্যবহার করুন:

for (i = 0; i < EmoteURLLines.length; i++) {
    if (checkIMG (EmoteURLLines[i])) {
        localStorage.setItem ("nameEmotes", JSON.stringify (EmoteNameLines));
        localStorage.setItem ("urlEmotes", JSON.stringify (EmoteURLLines));
        localStorage.setItem ("usageEmotes", JSON.stringify (EmoteUsageLines));
        if (i == 0) {
            console.log (resetSlot ());
        }
        emoteTab[2].innerHTML  += '<span style="cursor:pointer;" id="' 
                                + EmoteNameLines[i] 
                                + '" data-usage="' + EmoteUsageLines[i] + '">'
                                + '<img src="' + EmoteURLLines[i] + '" /></span>'
                                ;
    } else {
        alert ("The maximum emote (" + EmoteNameLines[i] + ") size is (36x36)");
    }
}
//-- Only add events when innerHTML overwrites are done.
var targetSpans = emoteTab[2].querySelectorAll ("span[data-usage]");
for (var J in targetSpans) {
    targetSpans[J].addEventListener ("click", appendEmote, false);
}

যেখানে অ্যাপেনডেমোটটি হ'ল:

function appendEmote (zEvent) {
    //-- this and the parameter are special in event handlers.  see the linked doc.
    var emoteUsage  = this.getAttribute ("data-usage");
    shoutdata.value += emoteUsage;
}


সতর্কতা:

  • আপনার কোড বেশ কয়েকটি উপাদানগুলির জন্য একই আইডি পুনরায় ব্যবহার করে। এটি করবেন না, এটি অবৈধ। প্রদত্ত আইডি প্রতি পৃষ্ঠায় একবারই হওয়া উচিত।
  • প্রতিবার আপনি ব্যবহার .outerHTMLবা .innerHTML, আপনি প্রভাবিত নোডগুলিতে কোনও ইভেন্ট হ্যান্ডলার ট্র্যাশ করে। আপনি যদি এই পদ্ধতিটি ব্যবহার করেন তবে সেই সত্য থেকে সাবধান থাকুন।

4
আমি এই ত্রুটিটি পেয়েছি: আনকচড টাইপ এরিয়ার: অবজেক্ট 3 এর কোনও পদ্ধতি 'অ্যাডএভেন্টলিস্টনার' নেই
ECMAScript

আপনি এটা ভুল করছেন, তাহলে। সম্পূর্ণ স্ক্রিপ্টের লিঙ্ক যা সেই ত্রুটি দিয়েছে এবং লক্ষ্য পৃষ্ঠায় এটি চলছে link
ব্রুক অ্যাডামস

4
আমি এটি ব্যবহার করে ঠিক করেছি: btnreset.onclick = ফাংশন () {রিসেটমোটেস (); }; ধন্যবাদ!
ECMAScript

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

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

3

আমি ত্রুটিটি পেয়েছি (আমি ভ্যু ব্যবহার করছি) এবং আমি আমার onclick="someFunction()"দিকে স্যুইচ করেছি @click="someFunction"এবং এখন তারা কাজ করছে।


প্রশ্ন ভিউ সম্পর্কিত নয়
ডেভ ম্যানুয়েল

1

আমি (click) = "someFuncionName()"নির্দিষ্ট উপাদানটির জন্য .html ফাইলের সাথে কৌণিকভাবে সমাধান করেছি ।


0

আপনি জাভাস্ক্রিপ্ট মডিউল ব্যবহার করছেন কিনা তা নিশ্চিত করুন ?! যদি js6 মডিউলগুলি ব্যবহার করে আপনার এইচটিএমএল ইভেন্টের বৈশিষ্ট্যগুলি কাজ করবে না। সেক্ষেত্রে আপনাকে অবশ্যই আপনার ফাংশনটি বৈশ্বিক সুযোগ থেকে মডিউল স্কোপে আনতে হবে। আপনার জাভাস্ক্রিপ্ট ফাইলটিতে কেবল এটি যুক্ত করুন: window.functionName= functionName;

উদাহরণ:

<h1 onClick="functionName">some thing</h1>

0

আমার মনে হয় আপনি ফাংশনটি $ (নথি) তে রেখেছেন ....... প্রস্তুত ....... ফাংশন সর্বদা $ (নথি) সরবরাহ করা হয় ...... প্রস্তুত .......


-2

এই ফাংশনটি এইচটিএমএল, যেমন অনক্লিক = 'ফাংশন ()' তে ব্যবহার করার সময় যদি সংজ্ঞায়িত না হয় তবে এর অর্থ ফাংশনটি একটি কলব্যাকে রয়েছে, আমার ক্ষেত্রে 'ডমকন্টেন্টলয়েড'।


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