জাভাস্ক্রিপ্টে কোনও ইনলাইন ইভেন্ট হ্যান্ডলারের পক্ষে যুক্তি হিসাবে ইভেন্টটি কীভাবে পাস করবেন?


110
// this e works
document.getElementById("p").oncontextmenu = function(e) {
    e = e || window.event;
    var target = e.target || e.srcElement;
    console.log(target);
};

// this e is undefined
function doSomething(e) {
    e = e || window.event;
    var target = e.target || e.srcElement;
    console.log(target);
}
<p id="p" onclick="doSomething(e)">
    <a href="#">foo</a>
    <span>bar</span>
</p>

অনুরূপ কিছু প্রশ্ন জিজ্ঞাসা করা হয়েছে।

তবে আমার কোডে, আমি বাচ্চাদের এমন উপাদানগুলি পেতে চেষ্টা করছি যাঁর মতো aবা ক্লিক করা হয়েছেspan

তাহলে eventইভেন্ট হ্যান্ডলারের পক্ষে আর্গুমেন্ট হিসাবে পাস করার সঠিক উপায় কী , বা কোনও আর্গুমেন্ট পাস না করে কীভাবে হ্যান্ডলারের অভ্যন্তরে ইভেন্ট পাবেন?

সম্পাদনা করুন

আমি সচেতন এবং addEventListenerএবং jQuery, দয়া করে inlineইভেন্ট হ্যান্ডারে ইভেন্টটি পাস করার জন্য একটি সমাধান সরবরাহ করুন ।



5
অ্যাডএভেন্টলিস্টনার স্যুইচ করার পরিবর্তে ইনলাইন ইভেন্ট হ্যান্ডলারগুলি ব্যবহার করার কোনও উপযুক্ত কারণ আছে? en.wikipedia.org/wiki/Unobtrusive_JavaScript
Xotic750

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

উত্তর:


174

eventঅবজেক্টটি পাস করতে :

<p id="p" onclick="doSomething(event)">

ক্লিক করা শিশু পেতে element( eventপ্যারামিটার সহ ব্যবহার করা উচিত :

function doSomething(e) {
    e = e || window.event;
    var target = e.target || e.srcElement;
    console.log(target);
}

elementনিজেই পাস করার জন্য (গার্হস্থ্য):

<p id="p" onclick="doThing(this)">

জেএসফিডেলে লাইভ উদাহরণ দেখুন


11
(এবং যে কারও জন্যই ভাবছেন: হ্যাঁ, এটি ক্রোম, ফায়ারফক্স ইত্যাদিতে কাজ করে, যদিও কিছু [ফায়ারফক্স, উদাহরণস্বরূপ] একটি বিশ্বব্যাপী eventঅবজেক্ট নেই the কারণ এটি যে প্রসঙ্গে DOM0 হ্যান্ডলারকে ডাকা হয় তাকে একটি eventবিষয় বলা হয়েছে , [এমনকি কিছু ব্রাউজারে] এটি বিশ্বব্যাপী নয়))
টিজে ক্রাউডার

thisবোঝায় p, কিন্তু আমি পেতে চেষ্টা করছি aবাspan
user1643156

4
পাস করা একমাত্র উপায় যা আমি জানি, তবে এটি সমর্থিত provided এই পরিস্থিতিতে
পার্সিংয়ের

5
@ user1643156 এটি খুব গুরুত্বপূর্ণ। প্যারামিটারটির নাম অবশ্যই "ইভেন্ট" হিসাবে রাখা উচিত
দ্য নাল-পয়েন্টার-

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

17

যেহেতু ইনলাইন ইভেন্টগুলি ফাংশন হিসাবে কার্যকর করা হয় আপনি কেবল আর্গুমেন্ট ব্যবহার করতে পারেন ।

<p id="p" onclick="doSomething.apply(this, arguments)">

এবং

function doSomething(e) {
  if (!e) e = window.event;
  // 'e' is the event.
  // 'this' is the P element
}

গৃহীত উত্তরে যে 'ইভেন্ট' উল্লেখ করা হয়েছে তা হ'ল কার্যক্রমে পাস হওয়া যুক্তির নাম। গ্লোবাল ইভেন্টের সাথে এর কোনও যোগসূত্র নেই।


ভালো পরামর্শ. কখন লোকেরা Web উপাদান গ্রহণ শুরু হবে call()এবং apply()বাঁধাই মূলধারার JS অবকাঠামো পাওয়া ক্ষমতা ডেটা এমুলেট অপরিহার্য প্রমাণ করা হবে। একটি অতিরিক্ত কৌশলটি হ'ল Object.assign(this.querySelector('my-btn'), this)ওয়েব উপাদান এবং ভয়েলা, ডেটা বন্ডিংয়ের অভ্যন্তরের অনুরূপ কিছু করা । আপনি ইনলাইন ইভেন্টগুলি থেকে প্যারেন্ট ওয়েব উপাদান শ্রেণীর যে কোনও পদ্ধতিতে অ্যাক্সেস করতে পারেন onclick="toggleBtnActive.call(this, true)"
অ্যাড্রিয়ান মাইসা

9

আপনাকে পাস করার দরকার thisনেই, ইতিমধ্যে eventডিফল্টরূপে অবজেক্টটি স্বয়ংক্রিয়ভাবে পাস হয়ে গেছে, যার মধ্যে event.targetএটি রয়েছে যা থেকে আসে object আপনি আপনার বাক্য গঠন হালকা করতে পারেন:

এই:

<p onclick="doSomething()">

এটি দিয়ে কাজ করবে:

function doSomething(){
  console.log(event);
  console.log(event.target);
}

আপনার eventঅবজেক্টটি ইনস্ট্যান্ট করার দরকার নেই , এটি ইতিমধ্যে রয়েছে। চেষ্টা কর. এবং event.targetএটির কলকারী পুরো অবজেক্টটি থাকবে, যা আপনি আগে "এটি" হিসাবে উল্লেখ করেছিলেন।

এখন আপনি যদি আপনার কোডের কোথাও থেকে ডায়নামিং () ডায়নামিকভাবে ট্রিগার করেন তবে আপনি লক্ষ্য করবেন যে eventএটি অপরিজ্ঞাত । কারণ এটি ক্লিক করার কোনও ইভেন্ট থেকে ট্রিগার করা হয়নি। সুতরাং আপনি যদি এখনও ঘটনাটিকে কৃত্রিমভাবে ট্রিগার করতে চান তবে সহজভাবে ব্যবহার করুন dispatchEvent:

document.getElementById('element').dispatchEvent(new CustomEvent("click", {'bubbles': true}));

তারপর doSomething()দেখতে হবে eventএবং event.targetস্বাভাবিক অনুযায়ী!

thisসর্বত্র পাস করার দরকার নেই এবং আপনি নিজের ফাংশনের স্বাক্ষরগুলিকে তারের তথ্য থেকে মুক্ত রাখতে পারেন এবং জিনিসগুলি সরল করতে পারেন।


অন্তত আই 11 এ, এটি সত্য নয়, কোনও ডিফল্ট যুক্তি নেই।
cskwg

4
@cskwg এটি আইই ১১ এর জন্যও কাজ করে। এটি সমস্ত বড় ব্রাউজারগুলিতে কাজ করে কারণ পিছনের সামঞ্জস্যের জন্য এটি প্রয়োজনীয়। আমি উত্তরে উল্লেখ করেছিলাম, জাভাস্ক্রিপ্ট ফাংশনটি যদি কোনও ইভেন্ট থেকে বরখাস্ত হয় তবে এটি কেবলমাত্র একটি ইভেন্ট যেখানে ঘটনা উপস্থিত থাকে সেখানে ইতিমধ্যে "ইভেন্ট" নামক একটি অবজেক্ট উপস্থিত থাকবে যা আপনি সহজেই আপনার ফাংশনের অভ্যন্তরে অ্যাক্সেস করতে পারবেন আপনার ফাংশন প্রোটোটাইপ অতিরিক্ত ওয়্যারিং পাস। আমি একটি অনক্লিক ইভেন্টের জন্য আইই 11 এর সাথে আমার মেশিনে একটি পরীক্ষা করেছি এবং 'ইভেন্ট' ভেরিয়েবলটিতে একটি "পয়েন্টারভেন্ট অবজেক্ট" রয়েছে।
ওয়াদিহ এম।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.