আমি কীভাবে কোনও এলিমেন্টের বাইরের ক্লিক সনাক্ত করব?


2485

আমার কিছু এইচটিএমএল মেনু রয়েছে, যা আমি যখন ব্যবহারকারীরা এই মেনুগুলির মাথায় ক্লিক করেন তখন আমি সম্পূর্ণ দেখায় show ব্যবহারকারীরা মেনুগুলির অঞ্চলের বাইরে ক্লিক করলে আমি এই উপাদানগুলি আড়াল করতে চাই।

JQuery দিয়ে কি এরকম কিছু সম্ভব?

$("#menuscontainer").clickOutsideThisElement(function() {
    // Hide the menus
});

47
এই কৌশলটির একটি নমুনা এখানে: jsfiddle.net/tedp/aL7Xe/1
টেড

18
টম যেমন উল্লেখ করেছেন, আপনি এই পদ্ধতির ব্যবহারের আগে css-tricks.com/dangers-stopping-event-papagation পড়তে চাইবেন । যে jsfiddle সরঞ্জাম যদিও দুর্দান্ত।
জন কোম্বস 21

3
উপাদানটির একটি রেফারেন্স এবং তারপরে ইভেন্ট.আরটিজেট পান এবং শেষ পর্যন্ত! = বা == দু'জনেই সেই অনুযায়ী কোড কার্যকর করুন ..
রোহিত কুমার


2
ভ্যানিলা জেএস সমাধানটি সাথে event.targetএবং বাইরে event.stopPropagation
lowtechsun

উত্তর:


1811

দ্রষ্টব্য: ব্যবহার stopEventPropagation()এমন একটি জিনিস যা এড়ানো উচিত কারণ এটি ডম-এর সাধারণ ইভেন্ট প্রবাহকে ভঙ্গ করে। আরও তথ্যের জন্য এই নিবন্ধটি দেখুন । পরিবর্তে এই পদ্ধতি ব্যবহার বিবেচনা করুন

উইন্ডোটি বন্ধ করে দেওয়া ডকুমেন্টের বডিতে একটি ক্লিক ইভেন্ট সংযুক্ত করুন। ধারকটিতে একটি পৃথক ক্লিক ইভেন্ট সংযুক্ত করুন যা নথির বডিতে প্রচার বন্ধ করে দেয়।

$(window).click(function() {
//Hide the menus if visible
});

$('#menucontainer').click(function(event){
    event.stopPropagation();
});

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

75
এটি # মেনোকন্টেইনারের অভ্যন্তরের যে কোনও কিছুর আচরণ ভাঙবে না, কারণ এটি এর অভ্যন্তরের যে কোনও কিছুর জন্য প্রচার শৃঙ্খলার নীচে রয়েছে।
ইরান গাল্পেরিন

94
এটি খুব সুন্দর কিন্তু আপনার $('html').click()শরীর ব্যবহার করা উচিত নয়। শরীরের সর্বদা তার সামগ্রীর উচ্চতা থাকে। এটিতে প্রচুর পরিমাণে সামগ্রী নেই বা স্ক্রিনটি খুব বেশি, এটি কেবল দেহের দ্বারা ভরা অংশে কাজ করে।
মেও

103
আমিও অবাক হয়েছি যে এই সমাধানটি এত বেশি ভোট পেয়েছিল। এটি স্টপপ্রোগেশন jsfiddle.net/Flandre/vaNFw/3
আন্দ্রে

140
ফিলিপ ওয়ালটন খুব ভালভাবে ব্যাখ্যা করেছেন যে এই উত্তরটি সর্বোত্তম সমাধান কেন নয়: css-tricks.com/dangers-stopping-event-papation
টম

1386

আপনি একটি ক্লিক ইভেন্টের জন্য শুনতে পারেন documentএবং তারপরে নিশ্চিত হয়ে নিন #menucontainerযে ব্যবহার করে কোনও পূর্বসূরি বা ক্লিক করা উপাদানটির লক্ষ্য নয় .closest()

যদি এটি না হয় তবে ক্লিক করা উপাদানটি এর বাইরে থাকে #menucontainerএবং আপনি এটি নিরাপদে লুকিয়ে রাখতে পারেন।

$(document).click(function(event) { 
  $target = $(event.target);
  if(!$target.closest('#menucontainer').length && 
  $('#menucontainer').is(":visible")) {
    $('#menucontainer').hide();
  }        
});

সম্পাদনা করুন - 2017-06-23

আপনি যদি মেনুটি খারিজ করার পরিকল্পনা করেন এবং ইভেন্টগুলির জন্য শ্রবণ বন্ধ করতে চান তবে আপনি ইভেন্ট শ্রোতার পরেও সাফ করতে পারেন। এই ফাংশনটি কেবলমাত্র নতুন তৈরি শ্রোতাদের পরিষ্কার করবে, অন্য কোনও ক্লিক শ্রোতাদের সংরক্ষণ করে document। ES2015 সিনট্যাক্স সহ:

export function hideOnClickOutside(selector) {
  const outsideClickListener = (event) => {
    $target = $(event.target);
    if (!$target.closest(selector).length && $(selector).is(':visible')) {
        $(selector).hide();
        removeClickListener();
    }
  }

  const removeClickListener = () => {
    document.removeEventListener('click', outsideClickListener)
  }

  document.addEventListener('click', outsideClickListener)
}

সম্পাদনা - 2018-03-11

যারা jQuery ব্যবহার করতে চান না তাদের জন্য। সরল ভ্যানিলাজেএস (ECMAScript6) এর উপরের কোডটি এখানে।

function hideOnClickOutside(element) {
    const outsideClickListener = event => {
        if (!element.contains(event.target) && isVisible(element)) { // or use: event.target.closest(selector) === null
          element.style.display = 'none'
          removeClickListener()
        }
    }

    const removeClickListener = () => {
        document.removeEventListener('click', outsideClickListener)
    }

    document.addEventListener('click', outsideClickListener)
}

const isVisible = elem => !!elem && !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ) // source (2018-03-11): https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js 

দ্রষ্টব্য: এটি !element.contains(event.target)jQuery অংশের পরিবর্তে কেবল ব্যবহার করতে অ্যালেক্সের মন্তব্যের ভিত্তিতে তৈরি ।

তবে element.closest()এখন সমস্ত বড় ব্রাউজারেও উপলব্ধ (ডাব্লু 3 সি সংস্করণ jQuery থেকে কিছুটা আলাদা)। পলিফিলগুলি এখানে পাওয়া যাবে: এলিমেন্ট.কোলেস্ট ()

সম্পাদনা করুন - 2020-05-21

আপনি যে ক্ষেত্রে ব্যবহারকারীটি উপাদানটির ভিতরে ক্লিক এবং টেনে আনতে সক্ষম হতে চান সেখানে এলিমেন্টটি বন্ধ না করেই মৌলের বাইরে মাউসটি ছেড়ে দিন:

      ...
      let lastMouseDownX = 0;
      let lastMouseDownY = 0;
      let lastMouseDownWasOutside = false;

      const mouseDownListener = (event: MouseEvent) => {
        lastMouseDownX = event.offsetX
        lastMouseDownY = event.offsetY
        lastMouseDownWasOutside = !$(event.target).closest(element).length
      }
      document.addEventListener('mousedown', mouseDownListener);

এবং এর মধ্যে outsideClickListener:

const outsideClickListener = event => {
        const deltaX = event.offsetX - lastMouseDownX
        const deltaY = event.offsetY - lastMouseDownY
        const distSq = (deltaX * deltaX) + (deltaY * deltaY)
        const isDrag = distSq > 3
        const isDragException = isDrag && !lastMouseDownWasOutside

        if (!element.contains(event.target) && isVisible(element) && !isDragException) { // or use: event.target.closest(selector) === null
          element.style.display = 'none'
          removeClickListener()
          document.removeEventListener('mousedown', mouseDownListener); // Or add this line to removeClickListener()
        }
    }

28
আমি অন্যান্য উত্তরগুলির অনেকগুলি চেষ্টা করেছিলাম, তবে কেবল এটিই কাজ করেছিল। ধন্যবাদ। আমি যে কোডটি ব্যবহার করে শেষ করেছি তা হ'ল: $ (দস্তাবেজ) c ক্লিক করুন (ফাংশন (ইভেন্ট) {if ($ (ইভেন্ট.তারেট)) ক্লোজস্ট ('। উইন্ডো') length দৈর্ঘ্য == 0) {$ ('উইন্ডো') ) .ফ্যাডআউট ('দ্রুত');}});
পিস্তোস

39
আমি আসলে এই সমাধানটি দিয়েই শেষ করেছি কারণ এটি একই পৃষ্ঠায় একাধিক মেনুগুলিকে আরও ভাল সমর্থন করে যেখানে প্রথম মেনুতে ক্লিক করার পরে প্রথমটি খোলা থাকাকালীন স্টপপ্রোগেশন সমাধানে প্রথম উন্মুক্তটি ছেড়ে যায়।
umassthrower

13
দুর্দান্ত উত্তর। আপনি যখন বন্ধ করতে চান এমন একাধিক আইটেম রয়েছে তখন এই যাওয়ার উপায়।
জন

5
ইভেন্ট.স্টপপ্রোপেশন () এর সাথে অন্য সমাধানের ত্রুটি থাকার কারণে এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
টমেটো

20
JQuery ছাড়াই - Node.contains ()!element.contains(event.target) ব্যবহার করে
অ্যালেক্স রস

303

কিভাবে একটি উপাদান বাইরে একটি ক্লিক সনাক্ত?

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

ব্যবহারকারীরা মেনুগুলির অঞ্চলের বাইরে ক্লিক করলে আমি এই উপাদানগুলি আড়াল করতে চাই।

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

ইঙ্গিত: এটি "ক্লিক" শব্দ !

আপনি আসলে ক্লিক হ্যান্ডলারগুলিকে আবদ্ধ করতে চান না।

আপনি যদি ডায়ালগটি বন্ধ করতে ক্লিক হ্যান্ডলারদেরকে আবদ্ধ করেন, আপনি ইতিমধ্যে ব্যর্থ হয়েছেন। আপনি ব্যর্থ হওয়ার কারণ হ'ল প্রত্যেকে clickইভেন্টগুলি ট্রিগার করে না। মাউস ব্যবহার না করা ব্যবহারকারীরা টিপে আপনার ডায়লগটি (এবং আপনার পপ-আপ মেনুটি তর্কযুক্ত এক ধরণের ডায়ালগ) থেকে পালাতে সক্ষম হবে এবং Tabপরবর্তীকালে তারা কোনও clickইভেন্ট ট্রিগার না করে ডায়ালগের পিছনে থাকা সামগ্রীটি পড়তে সক্ষম হবে না ।

সুতরাং আসুন প্রশ্নটি নতুন করে বলি।

কোনও ব্যবহারকারী এটির সাথে কাজ শেষ করে কীভাবে একটি ডায়ালগ বন্ধ করবেন?

এই লক্ষ্য। দুর্ভাগ্যক্রমে, এখন আমাদের userisfinishedwiththedialogইভেন্টটি বাঁধতে হবে , এবং সেই বাঁধাই এত সোজা নয়।

সুতরাং আমরা কীভাবে সনাক্ত করতে পারি যে কোনও ব্যবহারকারী একটি ডায়ালগ ব্যবহার করে শেষ করেছেন?

focusout ঘটনা

ফোকাসটি ডায়ালগটি রেখে গেছে কিনা তা নির্ধারণ করা একটি ভাল শুরু।

ইঙ্গিত: blurইভেন্টটি সম্পর্কে সাবধানতা অবলম্বন করুন , blurইভেন্টটি বুদবুদ পর্যায়ে আবদ্ধ থাকলে প্রচার করবেন না!

jQuery এর focusoutঠিক ঠিক করতে হবে। আপনি যদি jQuery ব্যবহার না করতে পারেন, তবে আপনি blurক্যাপচারিং পর্বের সময় ব্যবহার করতে পারেন :

element.addEventListener('blur', ..., true);
//                       use capture: ^^^^

এছাড়াও, অনেক কথোপকথনের জন্য আপনাকে ধারকটিকে ফোকাস পাওয়ার অনুমতি দিতে হবে। tabindex="-1"অন্যথায় ট্যাব ফ্লোতে বাধা না দিয়ে ডায়ালগটিকে গতিময়তার জন্য ফোকাস পাওয়ার অনুমতি যোগ করুন ।

$('a').on('click', function () {
  $(this.hash).toggleClass('active').focus();
});

$('div').on('focusout', function () {
  $(this).removeClass('active');
});
div {
  display: none;
}
.active {
  display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#example">Example</a>
<div id="example" tabindex="-1">
  Lorem ipsum <a href="http://example.com">dolor</a> sit amet.
</div>


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

প্রথমটি হ'ল সংলাপের লিঙ্কটি ক্লিকযোগ্য নয়। এটিতে বা এটিতে ক্লিক করার চেষ্টা করার ফলে মিথস্ক্রিয়াটি সংঘটিত হওয়ার আগে ডায়ালগটি বন্ধ হয়ে যায়। এটি কারণ কারণ অভ্যন্তরীণ উপাদান ফোকাস focusoutএকটি focusinইভেন্ট আবার ট্রিগার আগে একটি ইভেন্ট ট্রিগার ।

ঠিকঠাকটি হ'ল ইভেন্টের লুপে রাষ্ট্র পরিবর্তনকে সারি করুন। এটি ব্যবহার করে setImmediate(...)বা setTimeout(..., 0)সমর্থন করে না এমন ব্রাউজারগুলির মাধ্যমে করা যেতে পারে setImmediate। একবার সারিবদ্ধ হয়ে গেলে এটি পরবর্তীকালে বাতিল করা যেতে পারে focusin:

$('.submenu').on({
  focusout: function (e) {
    $(this).data('submenuTimer', setTimeout(function () {
      $(this).removeClass('submenu--active');
    }.bind(this), 0));
  },
  focusin: function (e) {
    clearTimeout($(this).data('submenuTimer'));
  }
});

দ্বিতীয় সমস্যাটি হ'ল লিঙ্কটি আবার চাপলে ডায়ালগটি বন্ধ হবে না। কারণ ডায়ালগটি মনোযোগ হারায়, ঘনিষ্ঠ আচরণকে ট্রিগার করে, তারপরে লিঙ্ক ক্লিকটি ডায়ালগটি আবার খোলার জন্য ট্রিগার করে।

পূর্ববর্তী ইস্যুর মতো, ফোকাসের রাষ্ট্রটি পরিচালনা করা দরকার। রাষ্ট্র পরিবর্তনটি ইতিমধ্যে সারি করা হয়েছে তা প্রদত্ত, ডায়লগটি ট্রিগারকে কেন্দ্র করে ইভেন্টগুলি সামলানোর বিষয়টি কেবল:

এটি পরিচিত দেখা উচিত
$('a').on({
  focusout: function () {
    $(this.hash).data('timer', setTimeout(function () {
      $(this.hash).removeClass('active');
    }.bind(this), 0));
  },
  focusin: function () {
    clearTimeout($(this.hash).data('timer'));  
  }
});


Esc মূল

যদি আপনি ভেবে থাকেন যে আপনি ফোকাসের রাজ্যগুলি পরিচালনা করে কাজটি করেছেন তবে ব্যবহারকারীর অভিজ্ঞতা সহজ করার জন্য আরও অনেক কিছুই করতে পারেন।

এটি প্রায়শই একটি "বৈশিষ্ট্যযুক্ত" বৈশিষ্ট্যযুক্ত তবে এটি সাধারণ যে আপনার যখন কোনও ধরণের মডেল বা পপআপ থাকে তখন Escকীটি এটি বন্ধ করে দেবে।

keydown: function (e) {
  if (e.which === 27) {
    $(this).removeClass('active');
    e.preventDefault();
  }
}


আপনি যদি জানেন যে ডায়ালগটির মধ্যে আপনার ফোকাসযোগ্য উপাদান রয়েছে, আপনার ডায়ালগটি সরাসরি ফোকাস করার প্রয়োজন হবে না। আপনি যদি একটি মেনু তৈরি করে থাকেন তবে পরিবর্তে আপনি প্রথম মেনু আইটেমটি ফোকাস করতে পারেন।

click: function (e) {
  $(this.hash)
    .toggleClass('submenu--active')
    .find('a:first')
    .focus();
  e.preventDefault();
}


ডাব্লুআইএআইএআরএ ভূমিকা এবং অন্যান্য অ্যাক্সেসযোগ্যতার সমর্থন

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


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

4
আশ্চর্যজনক, ভালভাবে ব্যাখ্যা করা হয়েছে। আমি কেবল এই প্রতিক্রিয়াটি একটি প্রতিক্রিয়া
উপাদানটিতে

2
গভীর উত্তর দেওয়ার জন্য @zzzzBov ধন্যবাদ, আমি এটি ভ্যানিলা জেএসে অর্জন করার চেষ্টা করছি, এবং সমস্ত জেকুরি স্টাফ দিয়ে আমি কিছুটা হারিয়েছি। ভ্যানিলা জেএসে কি তেমন কিছু আছে?
হেন্ডরিক এঙ্গ

2
@zzzzBov না, আমি আপনাকে অবশ্যই একটি jQuery মুক্ত সংস্করণ লেখার জন্য খুঁজছি না, আমি এটি করার চেষ্টা করব এবং আমি অনুমান করি যে আমি সত্যিই আটকে গেলে এখানে একটি নতুন প্রশ্ন জিজ্ঞাসা করা ভাল the আবার অনেক ধন্যবাদ।
হেন্ড্রিক এং

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

144

এখানে অন্যান্য সমাধানগুলি আমার পক্ষে কার্যকর হয়নি তাই আমাকে ব্যবহার করতে হয়েছিল:

if(!$(event.target).is('#foo'))
{
    // hide menu
}

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

43
এটি আমার পক্ষে কাজ করেছিল, আমি বিবৃতিটির && !$(event.target).parents("#foo").is("#foo")ভিতরে যুক্ত না করে IFযাতে কোনও শিশু উপাদান ক্লিক করার সময় মেনুটি বন্ধ না করে।
হনুভক

1
বেশী ভালো খুঁজে পাওয়া যাচ্ছে না: // করছি বাহিরে $ (event.target) .parents ( '# foo বিন্যাস') দৈর্ঘ্য == 0।
AlexG


1
!$(event.target).closest("#foo").lengthআরও ভাল হবে এবং @ হ্যানিওভকের সংযোজনের প্রয়োজনীয়তা রক্ষা করবেন
tvanc

127

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

$('#menucontainer').click(function(event) {
  $('html').one('click',function() {
    // Hide the menus
  });

  event.stopPropagation();
});

JQuery এর ফাংশন সম্পর্কে আরও তথ্যone()


9
তবে আপনি যদি মেনুতে নিজেই ক্লিক করেন, তবে বাইরে, এটি কাজ করবে না :)
vsync

3
ক্লিক শ্রোতাদের শরীরে আবদ্ধ করার আগে এটি ইভেন্ট.স্টপপ্রোগাগানেশন () রাখতে সহায়তা করে।
জ্যাস্পার কেনিস

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

হ্যান্ডলারের .oneঅভ্যন্তরে - বাইন্ডিং ব্যবহার করে $('html')একটি লিখুন $('html').off('click')
কোডি

4
@ কোডি আমি মনে করি না যে এটি সাহায্য করে। oneহ্যান্ডলার স্বয়ংক্রিয়ভাবে কল হবে off(যেমন, jQuery ডক্স দেখানো হয়েছে)।
মারিয়ানো দেশানজে

44

গবেষণার পরে আমি তিনটি কার্যনির্বাহী সমাধান খুঁজে পেয়েছি (রেফারেন্সের জন্য আমি পৃষ্ঠা লিঙ্কগুলি ভুলে গেছি)

প্রথম সমাধান

<script>
    //The good thing about this solution is it doesn't stop event propagation.

    var clickFlag = 0;
    $('body').on('click', function () {
        if(clickFlag == 0) {
            console.log('hide element here');
            /* Hide element here */
        }
        else {
            clickFlag=0;
        }
    });
    $('body').on('click','#testDiv', function (event) {
        clickFlag = 1;
        console.log('showed the element');
        /* Show the element */
    });
</script>

দ্বিতীয় সমাধান

<script>
    $('body').on('click', function(e) {
        if($(e.target).closest('#testDiv').length == 0) {
           /* Hide dropdown here */
        }
    });
</script>

তৃতীয় সমাধান

<script>
    var specifiedElement = document.getElementById('testDiv');
    document.addEventListener('click', function(event) {
        var isClickInside = specifiedElement.contains(event.target);
        if (isClickInside) {
          console.log('You clicked inside')
        }
        else {
          console.log('You clicked outside')
        }
    });
</script>

8
তৃতীয় সমাধানটি চেকিংয়ের সবচেয়ে মার্জিত উপায় way এটি jQuery কোনও ওভারহেড জড়িত না। খুব সুন্দর. এটি অনেক সাহায্য করেছে। ধন্যবাদ।
dbarth

আমি একাধিক উপাদানগুলির সাথে তৃতীয় সমাধানটি পাওয়ার চেষ্টা করছি document.getElementsByClassName, কারও ক্লু থাকলে শেয়ার করুন।
lowtechsun

@ লোতেটসুন আপনাকে প্রতিটি পরীক্ষা করতে লুপ করতে হবে।
ডনি

সত্যই তৃতীয় সমাধানটি পছন্দ হয়েছে, তবে আমার ডিভিটি আবার এটি লুকিয়ে দেখাতে শুরু করার আগে ক্লিকটি ট্রিগার হয়ে যায়, কেন কোনও ধারণা কেন?
indiehjaerta

তৃতীয়টি কনসোল.লগের পক্ষে নিশ্চিত হয়ে যায়, তবে এটি আপনাকে কারও কাছে প্রদর্শন সেট করে আসলে বন্ধ করতে দেয় না - কারণ মেনুটি দেখানোর আগে এটি এটি করবে। আপনি কি এই জন্য একটি সমাধান আছে?
RolandiXor

40
$("#menuscontainer").click(function() {
    $(this).focus();
});
$("#menuscontainer").blur(function(){
    $(this).hide();
});

আমার জন্য ঠিক কাজ করে।


3
এটি আমি ব্যবহার করব। এটি নিখুঁত নাও হতে পারে তবে শখের প্রোগ্রামার হিসাবে এটি স্পষ্টভাবে বোঝার পক্ষে যথেষ্ট সহজ।
কেভস্ট্রআউট

অস্পষ্টতা #menucontainerএই প্রশ্নের বাইরে একটি পদক্ষেপ যা প্রশ্নটি ছিল ক্লিক সম্পর্কে
b ই

4
@ বার্লাল অস্পষ্টতা ধারকটির বাইরে কোনও চাল নয় । অস্পষ্টতা ফোকাসের বিপরীত, আপনি মাউসআউট চিন্তা করছেন। ক্লিকগুলিতে সরল পাঠ্য এবং ইনপুট ক্ষেত্রগুলির মধ্যে যেখানে আমি পিছনে পিছনে বদলেছি সেখানে "সম্পাদনা করতে ক্লিক করুন" পাঠ্য তৈরি করার সময় এই সমাধানটি আমার পক্ষে বিশেষত কার্যকর হয়েছিল।
parker.sikand

এটি কাজ করতে আমাকে যুক্ত tabindex="-1"করতে হয়েছিল #menuscontainer। দেখে মনে হচ্ছে আপনি যদি ধারকটির ভিতরে কোনও ইনপুট ট্যাগ রাখেন এবং এটিতে ক্লিক করেন তবে ধারকটি আড়াল হয়ে যায়।
tyrion

mouseleave ঘটনা মেনু ও পাত্রে জন্য অধিক উপযুক্ত (সুত্র: w3schools.com/jquery/... )
Evgenia Manolova

38

এখন এর জন্য একটি প্লাগইন রয়েছে: বাইরের ইভেন্টগুলি ( ব্লগ পোস্ট) )

ক্লিকআউটসাইড হ্যান্ডলার (ডাব্লুএলজি) কোনও উপাদানটির সাথে আবদ্ধ হলে নিম্নলিখিতটি ঘটে :

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

সুতরাং কোনও ইভেন্ট প্রচার থেকে থামানো হয়নি এবং অতিরিক্ত ক্লিক হ্যান্ডলারগুলি বাইরের হ্যান্ডলারের সাহায্যে উপাদানটির "উপরে" ব্যবহার করা যেতে পারে।


চমৎকার প্লাগইন। "বাইরের ইভেন্টগুলিতে" লিঙ্কটি মৃত, যখন ব্লগ পোস্টের লিঙ্কটি পরিবর্তে জীবিত এবং "ক্লিক আউটসাইড" ধরনের ইভেন্টের জন্য খুব দরকারী প্লাগইন সরবরাহ করে। এটি এমআইটি লাইসেন্সবিহীন।
টেকনিকুইস্ট

দুর্দান্ত প্লাগইন। নিখুঁতভাবে কাজ করেছেন। ব্যবহার এর মতো:$( '#element' ).on( 'clickoutside', function( e ) { .. } );
গ্যাভিন

33

এটি আমার জন্য নিখুঁতভাবে কাজ করেছে !!

$('html').click(function (e) {
    if (e.target.id == 'YOUR-DIV-ID') {
        //do something
    } else {
        //do something
    }
});

এই সমাধানটি আমি যা করছি তার জন্য ভালভাবে কাজ করেছে, যেখানে বুবলি আপ করার জন্য আমার এখনও ক্লিক ইভেন্টের প্রয়োজন ছিল, ধন্যবাদ।
মাইক 2

26

আমি মনে করি না যে ব্যবহারকারীকে বাইরে ক্লিক করলে আপনার মেনুটি বন্ধ করে দেওয়া উচিত; আপনার প্রয়োজনীয় যা হ'ল মেনুটি বন্ধ হওয়ার সময় যখন ব্যবহারকারী পৃষ্ঠার যে কোনও জায়গায় ক্লিক করেন। আপনি যদি মেনুতে ক্লিক করেন, বা মেনুটি বন্ধ করেন তবে এটি ডানদিক বন্ধ হওয়া উচিত?

উপরে কোনও সন্তোষজনক উত্তর না পেয়ে আমাকে এই ব্লগটি অন্য দিন লেখার অনুরোধ জানায় । আরও পেডেন্টিকের জন্য, এখানে নোট করার জন্য কয়েকটি গোটাচা রয়েছে:

  1. আপনি যদি ক্লিকের সময় শরীরের উপাদানগুলির সাথে একটি ইভেন্ট ইভেন্ট হ্যান্ডলার সংযুক্ত করেন তবে মেনুটি বন্ধ করার আগে ২ য় ক্লিকের জন্য অপেক্ষা করতে এবং ইভেন্টটি আন-বাইন্ডিং করতে ভুলবেন না। অন্যথায় মেনুটি খোলার ক্লিক ইভেন্টটি মেনুটি বন্ধ করতে হবে এমন শ্রোতাদের কাছে বুদবুদ হবে।
  2. আপনি যদি ক্লিক ইভেন্টে ইভেন্ট.স্টপপ্রোগেশন () ব্যবহার করেন তবে আপনার পৃষ্ঠায় অন্য কোনও উপাদানগুলির কাছে ক্লিক-থেকে-নিকটবর্তী বৈশিষ্ট্য থাকতে পারে না।
  3. অনির্দিষ্টকালের জন্য শরীরের উপাদানগুলির সাথে একটি ক্লিক ইভেন্ট হ্যান্ডলার সংযুক্তি কোনও পারফরম্যান্ট সমাধান নয়
  4. ইভেন্টটির লক্ষ্য এবং তার পিতামাতাকে হ্যান্ডলারের স্রষ্টার সাথে তুলনা করে ধরে নেওয়া হয় যে আপনি যা চান তা হ'ল আপনি যখন মেনুটি ক্লিক করে তা বন্ধ করেন, যখন আপনি পৃষ্ঠায় যে কোনও জায়গায় ক্লিক করলে আপনি যা চান তা বন্ধ করে দেওয়া হয়।
  5. শরীরের উপাদানগুলির ইভেন্টগুলির জন্য শ্রবণ আপনার কোডটিকে আরও ভঙ্গুর করে তুলবে। যতটা নির্দোষ স্টাইলিং এটি ভেঙে দেবে:body { margin-left:auto; margin-right: auto; width:960px;}

2
"আপনি যদি মেনুতে ক্লিক করেন, বা মেনুটি বন্ধ করে রাখলে এটি ঠিক বন্ধ করা উচিত?" সর্বদা না কোনও উপাদানটিকে টেনে টেনে ক্লিক বাতিল করা এখনও একটি দস্তাবেজ স্তরের ক্লিককে ট্রিগার করবে, তবে মেনুটি বন্ধ করে দেওয়া অবিরত হবে না। এছাড়াও অন্যান্য ধরণের সংলাপ রয়েছে যেগুলি "ক্লিক-আউট" আচরণ ব্যবহার করতে পারে যা অভ্যন্তরীণভাবে ক্লিক করার অনুমতি দেয়।
zzzzBov

25

অন্য পোস্টার যেমন বলেছিল সেখানে প্রচুর গোটাচা রয়েছে, বিশেষত যদি আপনি যে উপাদানটি প্রদর্শন করছেন (এই ক্ষেত্রে একটি মেনুতে) ইন্টারেক্টিভ উপাদান রয়েছে। আমি নিম্নলিখিত পদ্ধতিটি মোটামুটি শক্তিশালী বলে খুঁজে পেয়েছি:

$('#menuscontainer').click(function(event) {
    //your code that shows the menus fully

    //now set up an event listener so that clicking anywhere outside will close the menu
    $('html').click(function(event) {
        //check up the tree of the click target to check whether user has clicked outside of menu
        if ($(event.target).parents('#menuscontainer').length==0) {
            // your code to hide menu

            //this event listener has done its job so we can unbind it.
            $(this).unbind(event);
        }

    })
});

25

পরিস্থিতির সহজ সমাধান হ'ল:

$(document).mouseup(function (e)
{
    var container = $("YOUR SELECTOR"); // Give you class or ID

    if (!container.is(e.target) &&            // If the target of the click is not the desired div or section
        container.has(e.target).length === 0) // ... nor a descendant-child of the container
    {
        container.hide();
    }
});

উপরের স্ক্রিপ্টটি divযদি এর বাইরে থাকে তবে এটি লুকিয়ে রাখবেdiv ক্লিক ইভেন্টের ট্রিগার করা ।

আরও তথ্যের জন্য আপনি নীচের ব্লগটি দেখতে পারেন: http://www.codecanal.com/detect-click-outside-div-using-javascript/


22

Solution1

ইভেন্ট.স্টপপ্রোপেশন () ব্যবহার করার পরিবর্তে যার কিছু দিক প্রভাব ফেলতে পারে, কেবল একটি সাধারণ পতাকা চলক সংজ্ঞা দিন এবং একটি ifশর্ত যুক্ত করুন। আমি এটি পরীক্ষা করেছি এবং স্টপপ্রোগেশনের কোনও দিক ছাড়াই সঠিকভাবে কাজ করেছি:

var flag = "1";
$('#menucontainer').click(function(event){
    flag = "0"; // flag 0 means click happened in the area where we should not do any action
});

$('html').click(function() {
    if(flag != "0"){
        // Hide the menus if visible
    }
    else {
        flag = "1";
    }
});

Solution2

একটি সাধারণ ifশর্ত সহ:

$(document).on('click', function(event){
    var container = $("#menucontainer");
    if (!container.is(event.target) &&            // If the target of the click isn't the container...
        container.has(event.target).length === 0) // ... nor a descendant of the container
    {
        // Do whatever you want to do when click is outside the element
    }
});

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

সমাধান 1 আরও ভাল কাজ করে, কারণ যখন ঘটনাটি দস্তাবেজে প্রচারিত হয় তখন ক্লিক লক্ষ্যটি ডিওএম থেকে সরানো হয়।
অ্যালিস

21

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

বা ক্লিকের অবস্থানটি পরীক্ষা করে দেখুন এবং এটি মেনু অঞ্চলে রয়েছে কিনা তা দেখুন।


18

আমি এরকম কিছু নিয়ে সাফল্য পেয়েছি:

var $menuscontainer = ...;

$('#trigger').click(function() {
  $menuscontainer.show();

  $('body').click(function(event) {
    var $target = $(event.target);

    if ($target.parents('#menuscontainer').length == 0) {
      $menuscontainer.hide();
    }
  });
});

যুক্তিটি হ'ল: যখন #menuscontainerপ্রদর্শিত হয়, তখন কোনও ক্লিক হ্যান্ডলারের শরীরে বেঁধে রাখুন যা #menuscontainerকেবল লুকিয়ে থাকে তবেই (লক্ষ্য ক্লিকের) এটির শিশু না হয়।


17

বৈকল্পিক হিসাবে:

var $menu = $('#menucontainer');
$(document).on('click', function (e) {

    // If element is opened and click target is outside it, hide it
    if ($menu.is(':visible') && !$menu.is(e.target) && !$menu.has(e.target).length) {
        $menu.hide();
    }
});

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


16

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

$("body").click(function() {
  target = document.getElementById("main");
  flag = event.path.some(function(el, i, arr) {
    return (el == target)
  })
  if (flag) {
    console.log("Inside")
  } else {
    console.log("Outside")
  }
});
#main {
  display: inline-block;
  background:yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="main">
  <ul>
    <li>Test-Main</li>
    <li>Test-Main</li>
    <li>Test-Main</li>
    <li>Test-Main</li>
    <li>Test-Main</li>
  </ul>
</div>
<div id="main2">
  Outside Main
</div>

সুতরাং আপনার ক্ষেত্রে এটি হওয়া উচিত

$("body").click(function() {
  target = $("#menuscontainer")[0];
  flag = event.path.some(function(el, i, arr) {
    return (el == target)
  });
  if (!flag) {
    // Hide the menus
  }
});

1
এজ এ কাজ করে না।
কিংবদন্তি

event.pathজিনিস না।
অ্যান্ড্রু

14

আমি কিছু jQuery ক্যালেন্ডার প্লাগইনে এই পদ্ধতিটি পেয়েছি।

function ClickOutsideCheck(e)
{
  var el = e.target;
  var popup = $('.popup:visible')[0];
  if (popup==undefined)
    return true;

  while (true){
    if (el == popup ) {
      return true;
    } else if (el == document) {
      $(".popup").hide();
      return false;
    } else {
      el = $(el).parent()[0];
    }
  }
};

$(document).bind('mousedown.popup', ClickOutsideCheck);

13

ভবিষ্যতের দর্শকদের জন্য এখানে ভ্যানিলা জাভাস্ক্রিপ্ট সমাধান রয়েছে।

নথির মধ্যে যে কোনও উপাদান ক্লিক করার পরে, যদি ক্লিক করা উপাদানটির আইডি টগল করা থাকে, বা লুকানো উপাদান লুকানো না থাকে এবং লুকানো উপাদানটিতে ক্লিক করা উপাদান থাকে না, উপাদানটি টগল করুন।

(function () {
    "use strict";
    var hidden = document.getElementById('hidden');
    document.addEventListener('click', function (e) {
        if (e.target.id == 'toggle' || (hidden.style.display != 'none' && !hidden.contains(e.target))) hidden.style.display = hidden.style.display == 'none' ? 'block' : 'none';
    }, false);
})();

আপনি যদি একই পৃষ্ঠায় একাধিক টগল পেতে যান তবে আপনি এরকম কিছু ব্যবহার করতে পারেন:

  1. hiddenসঙ্কুচিত আইটেমে শ্রেণীর নাম যুক্ত করুন।
  2. ডকুমেন্ট ক্লিকের পরে, এমন সমস্ত লুকানো উপাদানগুলি বন্ধ করুন যাতে ক্লিক করা উপাদান থাকে না এবং লুকানো থাকে না
  3. যদি ক্লিক করা উপাদানটি একটি টগল হয় তবে নির্দিষ্ট উপাদানটিকে টগল করুন।

(function () {
    "use strict";
    var hiddenItems = document.getElementsByClassName('hidden'), hidden;
    document.addEventListener('click', function (e) {
        for (var i = 0; hidden = hiddenItems[i]; i++) {
            if (!hidden.contains(e.target) && hidden.style.display != 'none')
                hidden.style.display = 'none';
        }
        if (e.target.getAttribute('data-toggle')) {
            var toggle = document.querySelector(e.target.getAttribute('data-toggle'));
            toggle.style.display = toggle.style.display == 'none' ? 'block' : 'none';
        }
    }, false);
})();
<a href="javascript:void(0)" data-toggle="#hidden1">Toggle Hidden Div</a>
<div class="hidden" id="hidden1" style="display: none;" data-hidden="true">This content is normally hidden</div>
<a href="javascript:void(0)" data-toggle="#hidden2">Toggle Hidden Div</a>
<div class="hidden" id="hidden2" style="display: none;" data-hidden="true">This content is normally hidden</div>
<a href="javascript:void(0)" data-toggle="#hidden3">Toggle Hidden Div</a>
<div class="hidden" id="hidden3" style="display: none;" data-hidden="true">This content is normally hidden</div>


12

আমি অবাক হয়েছি কেউ আসলে focusoutঘটনাটি স্বীকার করে নি :

var button = document.getElementById('button');
button.addEventListener('click', function(e){
  e.target.style.backgroundColor = 'green';
});
button.addEventListener('focusout', function(e){
  e.target.style.backgroundColor = '';
});
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <button id="button">Click</button>
</body>
</html>


আপনি আমার উত্তর অনুপস্থিত মনে করি। stackoverflow.com/a/47755925/6478359
muhammet ক্যান TONBUL

এটি সরাসরি গ্রহণযোগ্য উত্তর হওয়া উচিত। ধন্যবাদ !!!
ভাগ্যবান লাম

8

আপনি যদি আইই এবং এফএফ ৩. এর জন্য স্ক্রিপ্টিং করে থাকেন এবং ক্লিকটি নির্দিষ্ট বাক্স অঞ্চলে ঘটেছিল কিনা তা আপনি জানতে চান, আপনি এর মতো কিছু ব্যবহার করতে পারেন:

this.outsideElementClick = function(objEvent, objElement){   
var objCurrentElement = objEvent.target || objEvent.srcElement;
var blnInsideX = false;
var blnInsideY = false;

if (objCurrentElement.getBoundingClientRect().left >= objElement.getBoundingClientRect().left && objCurrentElement.getBoundingClientRect().right <= objElement.getBoundingClientRect().right)
    blnInsideX = true;

if (objCurrentElement.getBoundingClientRect().top >= objElement.getBoundingClientRect().top && objCurrentElement.getBoundingClientRect().bottom <= objElement.getBoundingClientRect().bottom)
    blnInsideY = true;

if (blnInsideX && blnInsideY)
    return false;
else
    return true;}

8

প্রবাহ বাধা, অস্পষ্টতা / ফোকাস ইভেন্ট বা অন্য কোনও কৌশলযুক্ত প্রযুক্তি ব্যবহার না করে কেবল ইভেন্টের প্রবাহকে উপাদানটির আত্মীয়তার সাথে মেলে:

$(document).on("click.menu-outside", function(event){
    // Test if target and it's parent aren't #menuscontainer
    // That means the click event occur on other branch of document tree
    if(!$(event.target).parents().andSelf().is("#menuscontainer")){
        // Click outisde #menuscontainer
        // Hide the menus (but test if menus aren't already hidden)
    }
});

ইভেন্ট শ্রোতার বাইরে ক্লিক সরাতে, সহজভাবে:

$(document).off("click.menu-outside");

আমার কাছে এটিই সেরা সমাধান ছিল। এনিমেশনের পরে এটি একটি কলব্যাকে ব্যবহৃত হয়েছিল তাই আমার কোনওভাবেই বিচ্ছিন্ন ইভেন্টের প্রয়োজন ছিল। +1
কিওয়ার্টজম্যান

এখানে অপ্রয়োজনীয় চেক আছে। যদি উপাদানটি সত্যই হয় তবে #menuscontainerআপনি এখনও তার পিতামাতার মধ্য দিয়ে যাচ্ছেন। আপনার প্রথমে এটি পরীক্ষা করা উচিত, এবং যদি এটি উপাদান না হয় তবে ডিওএম ট্রিটি উপরে যান।
vsync

ঠিক! আপনি শর্তটি পরিবর্তন করতে পারেন if(!($(event.target).is("#menuscontainer") || $(event.target).parents().is("#menuscontainer"))){। এটি একটি ক্ষুদ্রতর অপ্টিমাইজেশন, তবে আপনার প্রোগ্রামের জীবদ্দশায় কেবল কয়েকবার ঘটে: click.menu-outsideইভেন্টটি নিবন্ধিত থাকলে প্রতিটি ক্লিকের জন্য । এটি দীর্ঘ (+32 অক্ষর) এবং পদ্ধতি শৃঙ্খলা ব্যবহার করবেন না
মেমস

8

ব্যবহার করুন:

var go = false;
$(document).click(function(){
    if(go){
        $('#divID').hide();
        go = false;
    }
})

$("#divID").mouseover(function(){
    go = false;
});

$("#divID").mouseout(function (){
    go = true;
});

$("btnID").click( function(){
    if($("#divID:visible").length==1)
        $("#divID").hide(); // Toggle
    $("#divID").show();
});

7

যদি কেউ এখানে আগ্রহী হয় তবে জাভাস্ক্রিপ্ট সমাধান (এস)):

window.addEventListener('mouseup', e => {
        if (e.target != yourDiv && e.target.parentNode != yourDiv) {
            yourDiv.classList.remove('show-menu');
            //or yourDiv.style.display = 'none';
        }
    })

এবং এস 5, কেবলমাত্র ক্ষেত্রে:

window.addEventListener('mouseup', function (e) {
if (e.target != yourDiv && e.target.parentNode != yourDiv) {
    yourDiv.classList.remove('show-menu'); 
    //or yourDiv.style.display = 'none';
}

});


7

খাঁটি জাভাস্ক্রিপ্ট দ্বারা এখানে একটি সহজ সমাধান। এটি ES6 এর সাথে আপ টু ডেট রয়েছে :

var isMenuClick = false;
var menu = document.getElementById('menuscontainer');
document.addEventListener('click',()=>{
    if(!isMenuClick){
       //Hide the menu here
    }
    //Reset isMenuClick 
    isMenuClick = false;
})
menu.addEventListener('click',()=>{
    isMenuClick = true;
})

"ES6 এর সাথে আপ টু ডেট" একটি দুর্দান্ত সাহসী দাবি, যখন ES6 এর সাথে একমাত্র আপ-টু-ডেট কাজটি () => {}পরিবর্তে করছে function() {}। আপনার যা আছে তা ES6 এর মোচড় দিয়ে প্লেইন জাভাস্ক্রিপ্ট হিসাবে শ্রেণিবদ্ধ করা হয়েছে।
মর্টেনমোল্ডার

@ মর্টেনমোল্ডার: ইয়া। এটি কেবল মনোযোগের জন্য যদিও এটি আসলে ES6। তবে কেবল সমাধানটি দেখুন। আমি মনে করি এটি ভাল।
ডুয়ানেক্স

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

6

দস্তাবেজের একটি ক্লিক ইভেন্ট শ্রোতাকে আঁকুন। ইভেন্ট শ্রোতার অভ্যন্তরে, আপনি ইভেন্ট অবজেক্টের দিকে নজর রাখতে পারেন , বিশেষত ইভেন্ট এলটিটি কী উপাদানটি ক্লিক করা হয়েছিল তা দেখার জন্য:

$(document).click(function(e){
    if ($(e.target).closest("#menuscontainer").length == 0) {
        // .closest can help you determine if the element 
        // or one of its ancestors is #menuscontainer
        console.log("hide");
    }
});

6

আমি স্ক্রিপ্টের নীচে ব্যবহার করেছি এবং jQuery দিয়ে করেছি।

jQuery(document).click(function(e) {
    var target = e.target; //target div recorded
    if (!jQuery(target).is('#tobehide') ) {
        jQuery(this).fadeOut(); //if the click element is not the above id will hide
    }
})

নীচে এইচটিএমএল কোডটি সন্ধান করুন

<div class="main-container">
<div> Hello I am the title</div>
<div class="tobehide">I will hide when you click outside of me</div>
</div>

আপনি টিউটোরিয়ালটি এখানে পড়তে পারেন


5
$(document).click(function() {
    $(".overlay-window").hide();
});
$(".overlay-window").click(function() {
    return false;
});

আপনি যদি নথিতে ক্লিক করেন তবে প্রদত্ত একটি উপাদানটি গোপন করুন, যদি না আপনি একই উপাদানটিতে ক্লিক করেন।


5

সর্বাধিক জনপ্রিয় উত্তরের জন্য উপরে উঠুন, তবে যুক্ত করুন

&& (e.target != $('html').get(0)) // ignore the scrollbar

সুতরাং, একটি স্ক্রোল বারের একটি ক্লিক আপনার লক্ষ্য উপাদানকে [লুকান বা যাই হোক না কেন] করতে পারে না।


5

সহজ ব্যবহার এবং আরও অভিব্যক্তিপূর্ণ কোডের জন্য, আমি এর জন্য একটি জিকুয়েরি প্লাগইন তৈরি করেছি:

$('div.my-element').clickOut(function(target) { 
    //do something here... 
});

দ্রষ্টব্য: লক্ষ্যটি হল সেই উপাদান যা ব্যবহারকারীরা ক্লিক করেছেন। কিন্তু কলব্যাক এখনও, মূল উপাদান প্রেক্ষাপটে কার্যকর যাতে আপনি ব্যবহার করতে পারেন এই হিসাবে আপনি একটি jQuery কলব্যাক মধ্যে আশা চাই।

প্লাগ লাগানো:

$.fn.clickOut = function (parent, fn) {
    var context = this;
    fn = (typeof parent === 'function') ? parent : fn;
    parent = (parent instanceof jQuery) ? parent : $(document);

    context.each(function () {
        var that = this;
        parent.on('click', function (e) {
            var clicked = $(e.target);
            if (!clicked.is(that) && !clicked.parents().is(that)) {
                if (typeof fn === 'function') {
                    fn.call(that, clicked);
                }
            }
        });

    });
    return context;
};

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

এর মতো ব্যবহার করুন:

$('div.my-element').clickOut($('div.my-parent'), function(target) { 
    //do something here...
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.