ইনলাইন অনক্লিক অ্যাট্রিবিউট দিয়ে কীভাবে ইভেন্টের প্রচার বন্ধ করবেন?


313

নিম্নোক্ত বিবেচনা কর:

<div onclick="alert('you clicked the header')" class="header">
  <span onclick="alert('you clicked inside the header');">something inside the header</span>
</div>

আমি কীভাবে এটি তৈরি করতে পারি যাতে যখন ব্যবহারকারী স্প্যানটি ক্লিক করে, এটির divক্লিক ইভেন্টটিকে আগুন না দেয় ?

উত্তর:


272

ইভেন্ট.স্টপপ্রোপেশন () ব্যবহার করুন ।

<span onclick="event.stopPropagation(); alert('you clicked inside the header');">something inside the header</span>

আই আই এর জন্য: window.event.cancelBubble = true

<span onclick="window.event.cancelBubble = true; alert('you clicked inside the header');">something inside the header</span>

11
ফায়ারফক্সে ইভেন্ট অবজেক্টের মতো কোনও জিনিস নেই।
রবার্ট সি বার্থ

6
ইভেন্ট অবজেক্টটি কলব্যাকের একটি প্যারামিটার। আসলে, আই-তে ইভেন্ট অবজেক্টের মতো কোনও জিনিস নেই কারণ এই বস্তুটি ফাংশনের প্যারামিটার হওয়ার পরিবর্তে উইন্ডো.ইভেন্টের মাধ্যমে অ্যাক্সেসযোগ্য :-)
ভিনসেন্ট রবার্ট

66
এটি ঠিক ভুল - ইনলাইন অনক্লিক হ্যান্ডলাররা ইভেন্টটিকে আর্গুমেন্ট হিসাবে পাস করবেন না। সঠিক সমাধানটি নীচে গ্যারিথস।
বেনুবার্ড

2
ফায়ারফক্সে, আপনার ইনলাইন স্ক্রিপ্টে একটি চলক ইভেন্টে অ্যাক্সেস থাকতে পারে, তবে উইন্ডো.ভেন্ট উপলভ্য নয়। <div onclick = "সতর্কতা (ইভেন্ট);"> </div>
মরগান চেং

1
eventআইওএস সাফারিতেও ইনলাইন ইভেন্টগুলিতে উপলব্ধ বলে মনে হচ্ছে।
যুবাল এ।

210

কোনও ক্রিয়াকলাপের ভিতরে থেকে ইভেন্টের বিষয়টি পাওয়ার দুটি উপায় রয়েছে:

  1. প্রথম যুক্তি, ডাব্লু 3 সি-কমপ্লায়েন্ট ব্রাউজারে (ক্রোম, ফায়ারফক্স, সাফারি, আই 9 +)
  2. ইন্টারনেট এক্সপ্লোরারে উইন্ডো.ভেন্তিক অবজেক্ট (<= 8)

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

function(e) {
  var event = e || window.event;
  [...];
}

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

onclick="var event = arguments[0] || window.event; [...]"

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


11
একটি ইনলাইন শ্রোতার কাছ থেকে, আপনি ইভেন্ট অবজেক্টটি যেমন: onclick="foo(event)"তারপর ফাংশনে পাস করতে পারেন function foo(event){/* do stuff with event */}। এটি আইই এবং ডাব্লু 3 সি ইভেন্ট উভয় মডেলেই কাজ করে।
রবিজি

5
এটি "কম বা আট এর সমান" কিছুটা অস্পষ্ট।
টেকনিকুইস্ট

8
এটি আসলে প্রশ্নের উত্তর দেয় না।
jcomeau_ictx

1
একটি পৃথক প্রশ্নের ঝরঝরে উত্তর। : - /
অ্যারেল

80

মনে রাখবেন যে ফায়ারফক্সে উইন্ডো eসভেন্ট সমর্থিত নয়, এবং তাই এটি অবশ্যই এর লাইনের সাথে কিছু হতে পারে:

e.cancelBubble = true

অথবা, আপনি ফায়ারফক্সের জন্য ডাব্লু 3 সি স্ট্যান্ডার্ড ব্যবহার করতে পারেন:

e.stopPropagation();

যদি আপনি অভিনবতা পেতে চান তবে আপনি এটি করতে পারেন:

function myEventHandler(e)
{
    if (!e)
      e = window.event;

    //IE9 & Other Browsers
    if (e.stopPropagation) {
      e.stopPropagation();
    }
    //IE8 and Lower
    else {
      e.cancelBubble = true;
    }
}

12
এবং এটিকে কাজ করতে, একজনকে এটির মতো কল করতে হবে:<div onclick="myEventHandler(event);">
ডার্কডাস্ট

1
এটি "ইভেন্ট || উইন্ডো.ইভেন্ট" হতে পারে।
পয়েন্টি

1
যদি (ই। ক্যান্সেলবল) আমার কাছে ঠিক না দেখায়, আপনি যদি এটি ইতিমধ্যে সত্য হয়ে থাকেন তবে আপনি এটি সত্য করে রেখেছেন
Guillaume86

e.cancelBubbleআই-তে মিথ্যা ফেরত! এটি e.cancelBubble = true;নির্দেশে পৌঁছতে পারে না । পরিবর্তে সফটওয়্যারআরএম এর শর্তটি ব্যবহার করুন !!
ম্যারেটো

45

এই ফাংশনটি ব্যবহার করুন, এটি সঠিক পদ্ধতির অস্তিত্বের জন্য পরীক্ষা করবে।

function disabledEventPropagation(event)
{
   if (event.stopPropagation){
       event.stopPropagation();
   }
   else if(window.event){
      window.event.cancelBubble=true;
   }
}

20

আইই-তে জেএস ত্রুটি বাক্স - আমার একই সমস্যা ছিল - যতদূর আমি দেখতে পাচ্ছি এগুলি সমস্ত ব্রাউজারে সূক্ষ্মভাবে কাজ করে (ইভেন্ট.cancelBبل = সত্যই আইই তে কাজ করে)

onClick="if(event.stopPropagation){event.stopPropagation();}event.cancelBubble=true;"

1
ধন্যবাদ @ এমএসসি আমার ঠিক যা প্রয়োজন!
ড্যানিসি

1
ইনলাইন স্ক্রিপ্ট। এটা তোলে প্রশ্নের উত্তর করে
সেজার

এটি ক্রোম, এজ এবং ফায়ারফক্সে কাজ করে।
ভিনসেন্ট

10

এটি আমার পক্ষে কাজ করেছে

<script>
function cancelBubble(e) {
 var evt = e ? e:window.event;
 if (evt.stopPropagation)    evt.stopPropagation();
 if (evt.cancelBubble!=null) evt.cancelBubble = true;
}
</script>

<div onclick="alert('Click!')">
  <div onclick="cancelBubble(event)">Something inside the other div</div>
</div>

আপনি কি নিশ্চিত যে এই সঠিক কোড স্নিপেট আপনার জন্য কাজ করেছে? কারণ দেখে মনে হচ্ছে বাইরের ডিভের অনক্লিক হ্যান্ডলারটিতে স্ট্রিং কোটিংয়ের সমস্যা আছে ...?!
নিকোল

7

এএসপি.এনইটি ওয়েব পৃষ্ঠাগুলির জন্য (এমভিসি নয়), আপনি Sys.UI.DomEventস্থানীয় ইভেন্টের মোড়ক হিসাবে বস্তুটি ব্যবহার করতে পারেন ।

<div onclick="event.stopPropagation();" ...

বা, ইভেন্টটিকে অভ্যন্তরীণ ফাংশনে প্যারামিটার হিসাবে পাস করুন:

<div onclick="someFunction(event);" ...

এবং কিছু কাজ:

function someFunction(event){
    event.stopPropagation(); // here Sys.UI.DomEvent.stopPropagation() method is used
    // other onclick logic
}


2

কর্মের কারণে আমি মন্তব্য করতে পারি না তাই আমি এটি পুরো উত্তর হিসাবে লিখি: গ্যারেথের উত্তর অনুসারে (var e = arguments [0] || window.event; [...]) আমি অনক্লিকের জন্য এই অনেলাইনার ইনলাইনটি ব্যবহার করেছি দ্রুত হ্যাক:

<div onclick="(arguments[0] || window.event).stopPropagation();">..</div>

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


1

এটিও কাজ করে - লিঙ্কটিতে এইচটিএমএল এই জাতীয় রিটার্ন সহ অন্লিক ব্যবহার করে:

<a href="mypage.html" onclick="return confirmClick();">Delete</a>

এবং তারপরে কমফার্মিক্লিক () ফাংশনটি এমন হওয়া উচিত:

function confirmClick() {
    if(confirm("Do you really want to delete this task?")) {
        return true;
    } else {
        return false;
    }
};

2
এই প্রশ্নটির অর্থ কি তা নয়।
jzonthemtn

@ জবার্ড এই প্রশ্নটির অর্থ হ'ল ডোম গাছকে বুদবুদ করা থেকে কোনও ইভেন্ট বাতিল করার (এটি পুরানো) উপায় (এটি ডোম এপি স্তরের 1 চশমাতে রয়েছে)।
gion_13

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

1
confirmপ্রাসঙ্গিক নয়। আমি রিটার্ন মান উল্লেখ করছি । উদ্ধৃতি: লিংক এইচটিএমএল ব্যবহার onclick ইন মত এই ফিরতি সঙ্গে
gion_13

লিঙ্কটি অনুসরণ করে ভুয়া বাতিল বাতিল করে, এটি আমার ক্রোমে প্রচার ছড়িয়ে দেয় না
কমনপাইক

1

কোন উপাদানটি ক্লিক করা হয়েছিল তা খালি কেন পরীক্ষা করবেন না? আপনি যদি কিছুতে ক্লিক করেন তবে window.event.targetযে উপাদানটি ক্লিক করা হয়েছিল তাকে বরাদ্দ করা হয়েছে এবং ক্লিক করা উপাদানটি একটি আর্গুমেন্ট হিসাবেও পাস হতে পারে।

যদি লক্ষ্য এবং উপাদান সমান না হয় তবে এটি এমন একটি ইভেন্ট যা প্রচার করেছিল।

function myfunc(el){
  if (window.event.target === el){
      // perform action
  }
}
<div onclick="myfunc(this)" />

ধন্যবাদ সাথী, এটি এখানে সবচেয়ে পরিষ্কার সমাধান বলে মনে হচ্ছে। পার্শ্ব-নোটে আপনাকে অবশ্যই বিবেচনা করতে হবে, যে এটি কেবল তখনই মেলে যখন ক্লিক করা উপাদানটি আসল শীর্ষস্থানীয় উপাদান।
সাইমন ম্যাটেস 21

0
<div onclick="alert('you clicked the header')" class="header">
  <span onclick="alert('you clicked inside the header'); event.stopPropagation()">
    something inside the header
  </span>
</div>

0

জাভাস্ক্রিপ্ট ফাংশনটির মাধ্যমে ইভেন্টটির সাথে সেরা সমাধানটি হ্যান্ডেল করা হবে তবে এইচটিএমএল উপাদানটি সরাসরি ব্যবহার করে একটি সহজ এবং দ্রুত সমাধান ব্যবহার করার জন্য এবং একবার "ইভেন্ট" এবং "উইন্ডো.ভেনव्ह" অবমূল্যায়ন করা হয় এবং সর্বজনীন সমর্থনযোগ্য নয় ( https://developer.mozilla.org/en-US/docs/Web/API/Window/event ), আমি নিম্নলিখিত "হার্ড কোড" পরামর্শ দিই:

<div onclick="alert('blablabla'); (arguments[0] ? arguments[0].stopPropagation() : false);">...</div>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.