ডিবাগ করার সময় বা জাভাস্ক্রিপ্ট কোড থেকে কোনও ডিওএম নোডে ইভেন্ট শ্রোতাদের কীভাবে সন্ধান করবেন?


840

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

ইভেন্টগুলি ব্যবহার করে সংযুক্ত করা হয়:

  1. প্রোটোটাইপ এর Event.observe ;
  2. ডিওএম এর addEventListener;
  3. উপাদান গুণ হিসাবে element.onclick

3
ঘটনাগুলি প্রথম স্থানে সংযুক্ত করা হয় কীভাবে? আপনি কি একটি লাইব্রেরি ব্যবহার করছেন (যেমন প্রোটোটাইপ, jQuery, ইত্যাদি)?
ক্রিসেন্ট তাজা

এটি লক্ষ্য করা গুরুত্বপূর্ণ যে একাধিক কলব্যাক ফাংশন একই ধরণের ইভেন্টের মাধ্যমে সংযুক্ত করা যেতে পারে element.addEventListener(type, callback, [bubble]), element.onclick = functionআপনি যখনই প্রত্যেকবার নিয়োগের সময় ওভাররাইট করে দেবেন।
ব্র্যাডেন সেরা

উত্তর:


507

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

আপডেট : ভিজ্যুয়াল ইভেন্ট 2 উপলব্ধ।


1
পারফেক্ট! ফায়ারব্যাগের প্লাগইনকে বিট করে EventBug
রবিন মাবেন

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

15
আমি বিশ্বাস করি @ শর্মা উল্লিখিত ক্রোম এক্সটেনশানটি এখানে একটি উপলভ্য
কিমোবোট

1
পৃষ্ঠাটি কোনও তৃতীয় পক্ষের জেএস লাইব্রেরিটি উল্লেখ করে তবে ভিজ্যুয়াল ইভেন্ট কাজ করে না। এটি একটি ত্রুটি উত্থাপন করে: XMLHttpRequest A.com/js/jquery-ui-1.10.3.custom.js?_=1384831682813 লোড করতে পারে না । অরিজিন বি.কম -এ অ্যাক্সেস-নিয়ন্ত্রণ-মঞ্জুরি-উত্স দ্বারা অনুমোদিত নয়।
হাইওয়ে

5
ক্রোম এবং এফএফ অভ্যন্তরীণ বিকাশকারী সরঞ্জামগুলির (এফ 12) একটি অন্তর্নির্মিত ইভেন্টের দর্শক রয়েছে! ক্রোম: "উপাদানগুলি" ট্যাবে, নির্বাচন করুন এবং উপাদানটি দেখুন এবং ডানদিকে দেখুন: স্টাইল,
গণনা

365

এটি ইভেন্টগুলি কীভাবে সংযুক্ত থাকে তার উপর নির্ভর করে। চিত্রণ অনুমানের জন্য আমাদের নীচের ক্লিক হ্যান্ডলার রয়েছে:

var handler = function() { alert('clicked!') };

আমরা এটিকে বিভিন্ন পদ্ধতি ব্যবহার করে আমাদের উপাদানটির সাথে সংযুক্ত করতে যাচ্ছি, এমন কয়েকটি যা পরিদর্শন করার অনুমতি দেয় এবং কিছু এমন হয় না।

পদ্ধতি ক) একক ইভেন্ট হ্যান্ডলার

element.onclick = handler;
// inspect
alert(element.onclick); // alerts "function() { alert('clicked!') }"

পদ্ধতি বি) একাধিক ইভেন্ট হ্যান্ডলার

if(element.addEventListener) { // DOM standard
    element.addEventListener('click', handler, false)
} else if(element.attachEvent) { // IE
    element.attachEvent('onclick', handler)
}
// cannot inspect element to find handlers

পদ্ধতি সি): jQuery

$(element).click(handler);
  • 1.3.x

    // inspect
    var clickEvents = $(element).data("events").click;
    jQuery.each(clickEvents, function(key, value) {
        alert(value) // alerts "function() { alert('clicked!') }"
    })
  • 1.4.x (কোনও বস্তুর ভিতরে হ্যান্ডলারটি সঞ্চয় করে)

    // inspect
    var clickEvents = $(element).data("events").click;
    jQuery.each(clickEvents, function(key, handlerObj) {
        alert(handlerObj.handler) // alerts "function() { alert('clicked!') }"
        // also available: handlerObj.type, handlerObj.namespace
    })

(দেখুন jQuery.fn.dataএবং jQuery.data)

পদ্ধতি ডি): প্রোটোটাইপ (অগোছালো)

$(element).observe('click', handler);
  • 1.5

    // inspect
    Event.observers.each(function(item) {
        if(item[0] == element) {
            alert(item[2]) // alerts "function() { alert('clicked!') }"
        }
    })
  • 1.6 থেকে 1.6.0.3, সমেত (এখানে খুব কষ্ট পেয়েছে)

    // inspect. "_eventId" is for < 1.6.0.3 while 
    // "_prototypeEventID" was introduced in 1.6.0.3
    var clickEvents = Event.cache[element._eventId || (element._prototypeEventID || [])[0]].click;
    clickEvents.each(function(wrapper){
        alert(wrapper.handler) // alerts "function() { alert('clicked!') }"
    })
  • 1.6.1 (আরও ভাল)

    // inspect
    var clickEvents = element.getStorage().get('prototype_event_registry').get('click');
    clickEvents.each(function(wrapper){
        alert(wrapper.handler) // alerts "function() { alert('clicked!') }"
    })

3
এটি আপডেট করার জন্য Thx। দুর্ভাগ্যজনক যে আপনাকে প্রতিটি ধরণের হ্যান্ডলারের মাধ্যমে পুনরাবৃত্তি করতে হবে।
কিথ বেনট্রপ

4
বিশুদ্ধ ডিওএম ইভেন্টস এপিআইতে নিবন্ধিত হ্যান্ডলারদের জন্য গণনা সুবিধার স্থিতি সম্পর্কিত "মেথড বি" (অ্যাডভেন্টলিস্টনার) এ এখানে একটি উত্তর দেওয়া হয়েছে: stackoverflow.com/questions/7810534/…
নিকোলে

@ জন: মন্তব্যের জন্য ধন্যবাদ পূর্বে মাধ্যমে যুক্ত শ্রোতাদের আনতে আপনার কাছে "বাস্তব জাভাস্ক্রিপ্ট" এর উদাহরণ রয়েছে addEventListener?
ক্রিসেন্ট ফ্রেশ

6
@ জান, এটি jQuery 1.7.2 এর জন্য কাজ করছে বলে মনে হয় না, সংস্করণটির জন্য কি আলাদা পদ্ধতি আছে?
tomdemuyt

14
@ টমডেমুয়েট jQuery এ, ইভেন্টগুলি এখন আগের মতো অ্যাক্সেসযোগ্য না হয়ে অভ্যন্তরীণ ডেটা অ্যারেতে সংরক্ষণ করা হয় .data('events')। অভ্যন্তরীণ ইভেন্টের ডেটা অ্যাক্সেস করতে, ব্যবহার করুন $._data(elem, 'events')। নোট করুন যে এই ফাংশনটি jQuery উত্সে "কেবলমাত্র অভ্যন্তরীণ ব্যবহারের জন্য" হিসাবে চিহ্নিত হয়েছে, তাই ভবিষ্যতে সবসময় কাজ করবে বলে কোন প্রতিশ্রুতি দেয় না, তবে আমি বিশ্বাস করি যে এটি jQuery 1.7 সাল থেকে এখনও কাজ করেছে এবং এখনও কাজ করে।
ম্যাট ব্রাউন

350

ক্রোম, ফায়ারফক্স, ভিভালদি এবং সাফারি getEventListeners(domElement)তাদের বিকাশকারী সরঞ্জাম কনসোলে সমর্থন করে।

বেশিরভাগ ডিবাগিং উদ্দেশ্যে, এটি ব্যবহার করা যেতে পারে।

এটি ব্যবহার করার জন্য নীচে খুব ভাল রেফারেন্স দেওয়া আছে: https://developers.google.com/web/tools/chrome-devtools/console/utilities#geteventlisteners


1
+1 টি। ব্রাউজার-নির্দিষ্ট কোডটি আমার পক্ষে সমস্যা নয়, কারণ আমি এমন পৃষ্ঠা পাওয়ার চেষ্টা করছি যা আমি সঠিকভাবে কাজ করতে নিয়ন্ত্রণ করি না।
গ্রেট

9
দুর্দান্ত, তবে কেবল ক্রোম কনসোলের কমান্ড লাইনে কাজ করে :(
গিলিস্পি

5
@ রাঘব আহ ধন্যবাদ, ব্যবহারটি তেমনটি নয়: যেমনটি আমি প্রথম ভেবেছিলাম :)getEventListeners(object) obj getEventListeners()
jave.web

11
আপনি যদি কোনও ইভেন্টলিস্টারের উত্স কোডটি কীভাবে পাবেন তা ব্যাখ্যা করে আপনি আমাকে 3 ঘন্টা বাঁচাতে পারতেন। সেই "রেফারেন্স" কোনও ব্যাখ্যা দেয়নি। যদি অন্য কেউ একটি ক্ষতি ছিল এখানে কিভাবে: var list = getEventListeners(document.getElementById("YOURIDHERE")); console.log(list["focus"][0]["listener"].toString())। আপনি যে ইভেন্টটি পরিদর্শন করতে চান তাতে "ফোকাস" এবং একই ইভেন্টে একাধিক শ্রোতা উপস্থিত থাকলে নম্বরটি পরিবর্তন করুন।
doABarrelRoll721

46
টিপ: getEventListeners($0)আপনি Chrome ডি সরঞ্জামগুলিতে ফোকাস করেছেন এমন উপাদানটির জন্য ইভেন্ট শ্রোতারা পাবেন। আমি এই সব সময় ব্যবহার। ক্যোয়ারি নির্বাচনকারী বা __By_ ফাংশনগুলি ব্যবহার না করে ভালোবাসুন
ক্যাকোডার

91

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


9
আমি নিশ্চিত নই যে এটি ইভেন্টের সমস্ত হ্যান্ডলার দেখায় ; কেবল একক এইচটিএমএল ইভেন্ট হ্যান্ডলার।
হুয়েজ

3
সম্পূর্ণতার জন্য আমার ফায়ারব্যাগের জন্য ইভেন্টব্যাগ প্লাগইনটি উল্লেখ করা উচিত < সফটওয়্যারশ্যাড.ব্লগ / ক্যাটাগরী / এভেন্টব্যাগ >
নিকোলে

এটি কেবল আমার দিনটি তৈরি করেছে, কিছু লিগ্যাসি প্রোটোটাইপ কোডে একই উপাদানটিতে একই ইভেন্টে একাধিক ফাংশন আবদ্ধ ছিল এবং আমি সেগুলি ট্র্যাক করার চেষ্টা করে মরে যাচ্ছিলাম। আপনাকে অনেক ধন্যবাদ hanশান
সিলিকনরোক স্টার

70

জাভাস্ক্রিপ্টে সমস্ত ইভেন্ট শ্রোতাদের তালিকাভুক্ত করা সম্ভব : এটি এতটা কঠিন নয়; আপনাকে কেবল prototypeHTML উপাদানগুলির পদ্ধতি হ্যাক করতে হবে ( শ্রোতাদের যোগ করার আগে )।

function reportIn(e){
    var a = this.lastListenerInfo[this.lastListenerInfo.length-1];
    console.log(a)
}


HTMLAnchorElement.prototype.realAddEventListener = HTMLAnchorElement.prototype.addEventListener;

HTMLAnchorElement.prototype.addEventListener = function(a,b,c){
    this.realAddEventListener(a,reportIn,c); 
    this.realAddEventListener(a,b,c); 
    if(!this.lastListenerInfo){  this.lastListenerInfo = new Array()};
    this.lastListenerInfo.push({a : a, b : b , c : c});
};

এখন প্রতিটি অ্যাঙ্কর উপাদান ( a) lastListenerInfoএর সমস্ত শ্রোতার সমন্বিত একটি সম্পত্তি থাকবে । এমনকি এটি শ্রোতাদের বেনামে ফাংশনগুলি সরিয়ে দেওয়ার জন্যও কাজ করে।


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

এই পদ্ধতিটি ক্রোম / 19 এবং এফএফ / 12 এর সাথে কাজ করে। যদি আপনি অন্যান্য স্ক্রিপ্টগুলির আগে এটি হুক করেন তবে মৃত্যুদণ্ড কার্যকর করার গ্যারান্টি দেওয়া যেতে পারে
জাজি বার ইয়োচে

8
আপনি কেবল Node.prototypeপরিবর্তে পরিবর্তন করতে পারেন না? যে যেখানে আছে HTMLAnchorElementউত্তরাধিকারী .addEventListenerকোন পথে থেকে। '
ইসাইলিজা

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

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

52

গুগল ক্রোমে getEventListeners ব্যবহার করুন :

getEventListeners(document.getElementByID('btnlogin'));
getEventListeners($('#btnlogin'));

1
আনকড রেফারেন্স এরর: getEventListeners সংজ্ঞায়িত করা হয় না
ব্রায়ান গ্রেস

3
getEventListeners কেবল ক্রোমের ডেভলটুল কনসোলে কাজ করে। এবং এটি এটি আরও বিস্তৃত উত্তরের একটি সদৃশ: stackoverflow.com/a/16544813/1026
নিকোলে

41

( যেহেতু এটি এখানে প্রাসঙ্গিক তাই এই প্রশ্ন থেকে উত্তরটি আবারও লেখা হচ্ছে ))

ডিবাগ করার সময়, আপনি যদি কেবল ইভেন্টগুলি দেখতে চান তবে আমি প্রস্তাব দিই ...

  1. ভিজ্যুয়াল ইভেন্ট
  2. উপাদানসমূহ Chrome এর বিকাশকারী সরঞ্জামসমূহ বিভাগে: নীচে ডান দিকে "ইভেন্ট শ্রোতাদের" জন্য একটি উপাদান এবং চেহারা (FIREFOX অনুরূপ) নির্বাচন

আপনি যদি আপনার কোডগুলিতে ইভেন্টগুলি ব্যবহার করতে চান এবং আপনি সংস্করণ 1.8 এর আগে jQuery ব্যবহার করছেন তবে আপনি ব্যবহার করতে পারেন:

$(selector).data("events")

ঘটনা পেতে। সংস্করণ ১.৮ অনুসারে .data ("ইভেন্ট") ব্যবহার করা বন্ধ রয়েছে ( এই বাগের টিকিটটি দেখুন )। তুমি ব্যবহার করতে পার:

$._data(element, "events")

অন্য উদাহরণ: কনসোলের একটি নির্দিষ্ট লিঙ্কে সমস্ত ক্লিক ইভেন্টগুলি লিখুন:

var $myLink = $('a.myClass');
console.log($._data($myLink[0], "events").click);

( কার্যকারী উদাহরণের জন্য http://jsfiddle.net/HmsQC/ দেখুন )

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


1
$._data(elem, "events")কমপক্ষে ব্যবহার করে নিবন্ধিত ইভেন্টগুলির জন্য jQuery 1.10 এর সাথে কাজ করার জন্য উপস্থিত হয় না $(elem).on('event', ...)। কেউ কীভাবে সেগুলি ডিবাগ করতে জানে?
মারিয়াস গেডমিনাস

4
আমি ইতিবাচক নই, তবে আমি মনে করি যে প্রথম প্যারামটির $._dataকোনও উপাদান হতে পারে এবং জিকুয়েরি অবজেক্ট নয়। সুতরাং আমার উপরে আমার উদাহরণটি ঠিক করা দরকারconsole.log($._data($myLink[0], "events").click);
লুক

29

1: Prototype.observeElement.addEventListener ব্যবহার করে ( উত্স কোড দেখুন )

2: আপনি Element.addEventListenerযুক্ত শ্রোতাদের মনে রাখার জন্য ওভাররাইড করতে পারেন ( EventListenerListDOM3 স্পেশাল প্রস্তাব থেকে হ্যান্ড প্রোপার্টি সরানো হয়েছিল)। কোনও ইভেন্ট সংযুক্ত হওয়ার আগে এই কোডটি চালান:

(function() {
  Element.prototype._addEventListener = Element.prototype.addEventListener;
  Element.prototype.addEventListener = function(a,b,c) {
    this._addEventListener(a,b,c);
    if(!this.eventListenerList) this.eventListenerList = {};
    if(!this.eventListenerList[a]) this.eventListenerList[a] = [];
    this.eventListenerList[a].push(b);
  };
})();

এর মাধ্যমে সমস্ত ইভেন্ট পড়ুন:

var clicks = someElement.eventListenerList.click;
if(clicks) clicks.forEach(function(f) {
  alert("I listen to this function: "+f.toString());
});

এবং Element.removeEventListenerকাস্টম থেকে ইভেন্টটি সরাতে ওভাররাইড করতে ভুলবেন নাElement.eventListenerList

3: Element.onclickসম্পত্তি এখানে বিশেষ যত্ন প্রয়োজন:

if(someElement.onclick)
  alert("I also listen tho this: "+someElement.onclick.toString());

4: Element.onclickসামগ্রীর বৈশিষ্ট্যটি ভুলে যাবেন না : এগুলি দুটি ভিন্ন জিনিস:

someElement.onclick = someHandler; // IDL attribute
someElement.setAttribute("onclick","otherHandler(event)"); // content attribute

সুতরাং আপনার এটিও পরিচালনা করা দরকার:

var click = someElement.getAttribute("onclick");
if(click) alert("I even listen to this: "+click);

ভিজ্যুয়াল ইভেন্ট বুকমার্কলেট (সর্বাধিক জনপ্রিয় উত্তরে উল্লিখিত) কেবলমাত্র কাস্টম লাইব্রেরি হ্যান্ডলার ক্যাশে চুরি করে:

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

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

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


23

এটিকে আপনার শীর্ষে রেখে ইভেন্ট শ্রোতাদের পরিচালনার জন্য আপনি নেটিভ ডিওএম পদ্ধতিগুলি মোড়ানো করতে পারেন <head>:

<script>
    (function(w){
        var originalAdd = w.addEventListener;
        w.addEventListener = function(){
            // add your own stuff here to debug
            return originalAdd.apply(this, arguments);
        };

        var originalRemove = w.removeEventListener;
        w.removeEventListener = function(){
            // add your own stuff here to debug
            return originalRemove.apply(this, arguments);
        };
    })(window);
</script>

এইচ / টি @ লেস 2


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

@ ম্যাসিজেক্রাওকিজিক হাঁ, এবং যারা বুদবুদ হয়েছেন
জন z z

18

ফায়ারফক্স বিকাশকারী সরঞ্জামগুলি এখন এটি করে। ইভেন্টগুলি jQuery এবং DOM ইভেন্ট সহ প্রতিটি উপাদানগুলির ডানদিকে "ev" বোতামে ক্লিক করে দেখানো হয় ।

পরিদর্শক ট্যাবে ফায়ারফক্স বিকাশকারী সরঞ্জামগুলির ইভেন্ট শ্রোতার বোতামের স্ক্রিনশট


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

ফায়ারফক্সের ইভেন্ট শ্রোতারা jQuery প্রতিনিধি ইভেন্টগুলি জানতে পারে যখন Chrome এর জন্য প্লাগইন প্রয়োজন।
নিক

12

আপনার যদি ফায়ারব্যাগ থাকে তবে আপনি console.dir(object or array)কোনও জাভাস্ক্রিপ্ট স্কেলার, অ্যারে বা অবজেক্টের কনসোল লগে একটি দুর্দান্ত গাছ মুদ্রণ করতে ব্যবহার করতে পারেন ।

চেষ্টা করুন:

console.dir(clickEvents);

অথবা

console.dir(window);

9
Firebug 1.12 মধ্যে নতুন বৈশিষ্ট্য getfirebug.com/wiki/index.php/GetEventListeners
জাভিয়ের Constanzo

10

জান টুরনের উত্তরের ভিত্তিতে পুরোপুরি কার্যক্ষম সমাধান - getEventListeners()কনসোল থেকে আচরণ করে :

(ডুপ্লিকেট সহ একটি ছোট বাগ রয়েছে It এটি যাইহোক খুব বেশি ভাঙা যায় না))

(function() {
  Element.prototype._addEventListener = Element.prototype.addEventListener;
  Element.prototype.addEventListener = function(a,b,c) {
    if(c==undefined)
      c=false;
    this._addEventListener(a,b,c);
    if(!this.eventListenerList)
      this.eventListenerList = {};
    if(!this.eventListenerList[a])
      this.eventListenerList[a] = [];
    //this.removeEventListener(a,b,c); // TODO - handle duplicates..
    this.eventListenerList[a].push({listener:b,useCapture:c});
  };

  Element.prototype.getEventListeners = function(a){
    if(!this.eventListenerList)
      this.eventListenerList = {};
    if(a==undefined)
      return this.eventListenerList;
    return this.eventListenerList[a];
  };
  Element.prototype.clearEventListeners = function(a){
    if(!this.eventListenerList)
      this.eventListenerList = {};
    if(a==undefined){
      for(var x in (this.getEventListeners())) this.clearEventListeners(x);
        return;
    }
    var el = this.getEventListeners(a);
    if(el==undefined)
      return;
    for(var i = el.length - 1; i >= 0; --i) {
      var ev = el[i];
      this.removeEventListener(a, ev.listener, ev.useCapture);
    }
  };

  Element.prototype._removeEventListener = Element.prototype.removeEventListener;
  Element.prototype.removeEventListener = function(a,b,c) {
    if(c==undefined)
      c=false;
    this._removeEventListener(a,b,c);
      if(!this.eventListenerList)
        this.eventListenerList = {};
      if(!this.eventListenerList[a])
        this.eventListenerList[a] = [];

      // Find the event in the list
      for(var i=0;i<this.eventListenerList[a].length;i++){
          if(this.eventListenerList[a][i].listener==b, this.eventListenerList[a][i].useCapture==c){ // Hmm..
              this.eventListenerList[a].splice(i, 1);
              break;
          }
      }
    if(this.eventListenerList[a].length==0)
      delete this.eventListenerList[a];
  };
})();

ব্যবহার:

someElement.getEventListeners([name]) - ইভেন্ট শ্রোতার ফিরতি তালিকা, যদি নামটি সেই ইভেন্টের জন্য শ্রোতার ফেরতের অ্যারে সেট করা হয়

someElement.clearEventListeners([name]) - নামটি সেট করা থাকলে সমস্ত ইভেন্ট শ্রোতাদের সরিয়ে দিন, ইভেন্টটির শ্রোতাদের সরান


3
এটি একটি দুর্দান্ত উত্তর, তবে আমি এটি bodyএবং documentউপাদানগুলির সাথে কাজ করতে পারি না ।
ডেভিড ব্র্যাডশো

সত্যিই দুর্দান্ত সমাধান!
জাজखर উখাইভ

@ পিটার মর্টেনসেন, কেন আপনি জানের নাম পরিবর্তন করলেন? :)
n00b

1
@ ডেভিড ব্র্যাডশো: কারণ শরীর, নথি এবং উইন্ডোর নিজস্ব প্রোটোটাইপ রয়েছে এবং এলিমেন্ট প্রোটোটাইপ নয় ...
স্টিফান স্টেইগার

1
@ n00b: একটি বাগ আছে। তাই বলে হুমমম। আপনি শ্রোতা এবং ইউজক্যাপশনের জন্য যদি বিবৃতিতে কমা-অপারেটর ব্যবহার করেন ... কমা অপারেটর তার প্রতিটি অপারেশনকে (বাম থেকে ডানে) মূল্যায়ন করে এবং সর্বশেষ অপারেন্ডের মান প্রদান করে। সুতরাং আপনি ইভেন্টের ধরণ নির্বিশেষে ব্যবহারের ক্যাপচারের সাথে মেলে এমন প্রথম ইভেন্টলিস্টনার সরিয়ে ফেলুন ... এটি কমাতে পরিবর্তে && হওয়া উচিত।
স্টিফান স্টেইগার 0

8

অপেরা 12 (সর্বশেষে ক্রোম ওয়েবকিট ইঞ্জিন ভিত্তিক নয়) ড্রাগনফ্লাই কিছু সময়ের জন্য এটি করেছে এবং স্পষ্টতই এটি ডিওএম কাঠামোতে প্রদর্শিত হবে। আমার মতে এটি উচ্চতর ডিবাগার এবং আমি কেন এখনও অপেরা 12 ভিত্তিক সংস্করণ ব্যবহার করি তা বাকি কারণেই (কোনও ভি 13, ভি 14 সংস্করণ এবং ভি 15 ওয়েবকিট ভিত্তিক ড্রাগনফ্লাইয়ের অভাব নেই)

এখানে চিত্র বর্ণনা লিখুন


4

প্রোটোটাইপ 1.7.1 উপায়

function get_element_registry(element) {
    var cache = Event.cache;
    if(element === window) return 0;
    if(typeof element._prototypeUID === 'undefined') {
        element._prototypeUID = Element.Storage.UID++;
    }
    var uid =  element._prototypeUID;           
    if(!cache[uid]) cache[uid] = {element: element};
    return cache[uid];
}

4

আমি সম্প্রতি ইভেন্টগুলির সাথে কাজ করছি এবং একটি পৃষ্ঠায় সমস্ত ইভেন্ট দেখতে / নিয়ন্ত্রণ করতে চেয়েছিলাম। সম্ভাব্য সমাধানগুলি দেখার পরে, আমি সিদ্ধান্ত নিয়েছি যে আমি নিজের পথে চলেছি এবং ইভেন্টগুলি পর্যবেক্ষণ করার জন্য একটি কাস্টম সিস্টেম তৈরি করব। সুতরাং, আমি তিনটি জিনিস করেছি।

প্রথমত, পৃষ্ঠাতে সমস্ত ইভেন্ট শ্রোতার জন্য আমার একটি ধারক প্রয়োজন: এটি EventListenersহ'ল অবজেক্ট। এটি তিনটি দরকারী পদ্ধতি আছে: add(), remove(), এবং get()

এর পরে, আমি একজন নির্মিত EventListenerবস্তু ইভেন্টের জন্য প্রয়োজনীয় তথ্য রাখা, অর্থাত্: target, type, callback, options, useCapture, wantsUntrusted, এবং একটি পদ্ধতি যোগremove() শ্রোতা মুছে ফেলার জন্য।

শেষ অবধি, আমি তাদের তৈরি ( এবং ) যে জিনিসগুলি তৈরি করেছি তার সাথে তাদের কাজ করার জন্য দেশীয় addEventListener()এবং removeEventListener()পদ্ধতিগুলি প্রসারিত করেছি ।EventListenerEventListeners

ব্যবহার:

var bodyClickEvent = document.body.addEventListener("click", function () {
    console.log("body click");
});

// bodyClickEvent.remove();

addEventListener()একটি EventListenerঅবজেক্ট তৈরি করে , এতে যুক্ত করে EventListenersএবং ফেরত দেয়EventListener বস্তুকে , তাই এটি পরে মুছে ফেলা যায়।

EventListeners.get()পৃষ্ঠায় শ্রোতাদের দেখতে ব্যবহার করা যেতে পারে। এটি একটি EventTargetবা একটি স্ট্রিং গ্রহণ করে (ইভেন্টের ধরণ)।

// EventListeners.get(document.body);
// EventListeners.get("click");

ডেমো

আসুন আমরা এই বর্তমান পৃষ্ঠায় প্রতিটি ইভেন্ট শ্রোতা জানতে চান বলে যাক। আমরা এটি করতে পারি (ধরে নিই যে আপনি এই ক্ষেত্রে স্ক্রিপ্ট ম্যানেজার এক্সটেনশন ব্যবহার করছেন, ট্যাম্পারমনকি)। নিম্নলিখিত লিপিটি এটি করে:

// ==UserScript==
// @name         New Userscript
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @include      https://stackoverflow.com/*
// @grant        none
// ==/UserScript==

(function() {
    fetch("https://raw.githubusercontent.com/akinuri/js-lib/master/EventListener.js")
        .then(function (response) {
            return response.text();
        })
        .then(function (text) {
            eval(text);
            window.EventListeners = EventListeners;
        });
})(window);

এবং যখন আমরা সমস্ত শ্রোতাদের তালিকাবদ্ধ করি তখন এটি বলছে 299 ইভেন্ট শ্রোতা রয়েছে। কিছু সদৃশ আছে বলে মনে হয় ", তবে সেগুলি সত্যই নকল কিনা তা আমি জানি না। প্রতিটি ইভেন্টের ধরণটি নকল হয় না, সুতরাং এই সমস্ত "নকল" ব্যক্তিগত শ্রোতা হতে পারে।

এই পৃষ্ঠায় সমস্ত ইভেন্ট শ্রোতাদের তালিকাভুক্ত কনসোলের স্ক্রিনশট

কোডটি আমার সন্ধানাগারে পাওয়া যাবে আমি এটি এখানে পোস্ট করতে চাইনি কারণ এটি দীর্ঘ।


আপডেট: এটি jQuery এর সাথে কাজ করবে বলে মনে হচ্ছে না। যখন আমি ইভেন্টলিস্টনার পরীক্ষা করি তখন আমি দেখতে পাই যে কলব্যাকটি রয়েছে

function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}

আমি বিশ্বাস করি এটি jQuery এর অন্তর্গত, এবং এটি আসল কলব্যাক নয়। jQuery ইভেন্ট ইভেন্টের বৈশিষ্ট্যগুলিতে প্রকৃত কলব্যাক সংরক্ষণ করে:

$(document.body).click(function () {
    console.log("jquery click");
});

এখানে চিত্র বর্ণনা লিখুন

ইভেন্ট শ্রোতাদের সরানোর জন্য, আসল কলব্যাকটি removeEventListener()পদ্ধতিতে পাস করা দরকার । সুতরাং jQuery দিয়ে এই কাজটি করার জন্য এটির আরও পরিবর্তন প্রয়োজন। আমি ভবিষ্যতে এটি ঠিক করতে পারে।


দুর্দান্ত কাজ! ধন্যবাদ
mt025

3

আমি jQuery 2.1 তে এটি করার চেষ্টা করছি এবং " $().click() -> $(element).data("events").click;" পদ্ধতিতে এটি কাজ করে না।

আমি বুঝতে পেরেছি যে কেবলমাত্র $ ._ ডেটা () ফাংশনগুলি আমার ক্ষেত্রে কাজ করে:

	$(document).ready(function(){

		var node = $('body');
		
        // Bind 3 events to body click
		node.click(function(e) { alert('hello');  })
			.click(function(e) { alert('bye');  })
			.click(fun_1);

        // Inspect the events of body
		var events = $._data(node[0], "events").click;
		var ev1 = events[0].handler // -> function(e) { alert('hello')
		var ev2 = events[1].handler // -> function(e) { alert('bye')
		var ev3 = events[2].handler // -> function fun_1()
        
		$('body')
			.append('<p> Event1 = ' + eval(ev1).toString() + '</p>')
			.append('<p> Event2 = ' + eval(ev2).toString() + '</p>')
			.append('<p> Event3 = ' + eval(ev3).toString() + '</p>');        
	
	});

	function fun_1() {
		var txt = 'text del missatge';	 
		alert(txt);
	}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<body>
</body>



1

এই ফাংশনগুলি পরিবর্তন করার ফলে আপনাকে শ্রোতাদের যোগ করা লগ করতে পারবেন

EventTarget.prototype.addEventListener
EventTarget.prototype.attachEvent
EventTarget.prototype.removeEventListener
EventTarget.prototype.detachEvent

বাকী শ্রোতাদের সাথে পড়ুন

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