මූලද්‍රව්‍යයකින් පිටත ක්ලික් කිරීමක් මා හඳුනා ගන්නේ කෙසේද?


2498

මා සතුව HTML මෙනු කිහිපයක් ඇත, පරිශීලකයෙකු මෙම මෙනු වල හිස මත ක්ලික් කළ විට එය සම්පූර්ණයෙන්ම පෙන්වයි. පරිශීලකයා මෙනු ප්‍රදේශයෙන් පිටත ක්ලික් කළ විට මෙම අංග සැඟවීමට මම කැමතියි.

JQuery සමඟ මෙවැනි දෙයක් කළ හැකිද?

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

47
මෙන්න මෙම උපාය මාර්ගයේ නියැදියක්: jsfiddle.net/tedp/aL7Xe/1
ටෙඩ්

18
ටොම් සඳහන් කළ පරිදි, මෙම ප්‍රවේශය භාවිතා කිරීමට පෙර ඔබට css-tricks.com/dangers-stopping-event-propagation කියවීමට අවශ්‍ය වනු ඇත . ඒ jsfiddle මෙවලම හරිම සිසිල්.
ජෝන් කුම්බ්ස්

3
මූලද්රව්යය වෙත යොමු කිරීමක් ලබා ගන්න, පසුව event.target, අවසානයේ! = හෝ == ඔවුන් දෙදෙනාම ඒ අනුව කේතය ක්රියාත්මක කරයි ..
රෝහිත් කුමාර්

මම නිර්දේශ කරන්නේ github.com/gsantiago/jquery-clickout :)
Rômulo M. Farias

2
වැනිලා ජේඑස් විසඳුම සමඟ event.targetසහ නැතිව event.stopPropagation .
lowtechsun

Answers:


1820

සටහන: භාවිතා කිරීම stopEventPropagation()යනු DOM හි සාමාන්‍ය සිදුවීම් ප්‍රවාහය බිඳ දැමීම වැළැක්විය යුතු දෙයකි. වැඩි විස්තර සඳහා මෙම ලිපිය බලන්න . ඒ වෙනුවට මෙම ක්‍රමය භාවිතා කිරීම සලකා බලන්න

කවුළුව වැසෙන ලේඛන ශරීරයට ක්ලික් කිරීමේ සිදුවීමක් අමුණන්න. ලේඛනාගාරයට ප්‍රචාරණය කිරීම නවත්වන කන්ටේනරයට වෙනම ක්ලික් සිදුවීමක් අමුණන්න.

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

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

710
මෙය #menucontainer තුළ අඩංගු බොත්තම් සහ සබැඳි ඇතුළු බොහෝ දේවල සම්මත හැසිරීම බිඳ දමයි. මෙම පිළිතුර එතරම් ජනප්‍රිය වීම ගැන මම පුදුම වෙමි.
චිත්‍ර

75
මෙය #menucontainer තුළ කිසිවක් හැසිරෙන්නේ නැත, මන්ද එය එහි ඇතුළත ඇති ඕනෑම දෙයක් සඳහා ප්‍රචාරක දාමයේ පතුලේ ඇති බැවිනි.
එරාන් ගැල්පෙරින්

94
එය ඉතා අලංකාර නමුත් ඔබ $('html').click()ශරීරය භාවිතා නොකළ යුතුය . ශරීරය සෑම විටම එහි අන්තර්ගතයේ උස ඇත. එය විශාල අන්තර්ගතයක් හෝ තිරය ඉතා ඉහළ මට්ටමක පවතී, එය ක්‍රියාත්මක වන්නේ ශරීරය පුරවා ඇති කොටස මත පමණි.
meo

103
මෙම විසඳුමට මෙතරම් ඡන්ද ප්‍රමාණයක් ලැබීම ගැන මම පුදුම වෙමි. StopPropagation jsfiddle.net/Flandre/vaNFw/3
ඇන්ඩ්‍රේ

140
මෙම පිළිතුර හොඳම විසඳුම නොවන්නේ මන්දැයි පිලිප් වෝල්ටන් ඉතා හොඳින් පැහැදිලි කරයි: css-tricks.com/dangers-stopping-event-propagation
ටොම්

1392

ක්ලික් කිරීමේ සිදුවීමක් සඳහා ඔබට සවන් දිය හැකි 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()දැන් සියලුම ප්‍රධාන බ්‍රව්සර් වලද ඇත (W3C අනුවාදය jQuery එකෙන් ටිකක් වෙනස් වේ). පොලිෆිල්ස් මෙහි සොයාගත හැකිය: Element.closest ()

සංස්කරණය කරන්න - 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
මම අනෙක් පිළිතුරු බොහොමයක් අත්හදා බැලුවෙමි. ස්තූතියි. මා භාවිතා කළ කේතය මෙයයි: document (ලේඛනය). ක්ලික් කරන්න (ශ්‍රිතය (සිද්ධිය) {if (event (event.target) .closest ('. කවුළුව'). දිග == 0) {$ ('. කවුළුව' ) .fadeOut ('වේගවත්');}});
පිස්ටෝස්

39
මම ඇත්ත වශයෙන්ම මෙම විසඳුම සමඟ අවසන් වූයේ එකම පිටුවක බහු මෙනු වලට වඩා හොඳ සහය දක්වන නිසා දෙවන මෙනුව මත ක්ලික් කිරීමෙන් පළමු විවෘතව ඇති අතර පළමු විවෘත කිරීම නැවතුම් ප්‍රෝග්‍රැගේෂන් විසඳුමේ ඉතිරි වේ.
umassthrower

13
විශිෂ්ට පිළිතුර. ඔබට වසා දැමීමට අවශ්‍ය අයිතම කිහිපයක් ඇති විට යා යුතු මාර්ගය මෙයයි.
ජෝන්

5
Event.stopPropagation () සමඟ ඇති අනෙක් දෝෂය නිසා මෙය පිළිගත් පිළිතුර විය යුතුය.
තක්කාලි

21
JQuery නොමැතිව - Node.contains ()!element.contains(event.target) භාවිතා කිරීම
ඇලෙක්ස් රොස්

307

මූලද්‍රව්‍යයකින් පිටත ක්ලික් කිරීමක් හඳුනා ගන්නේ කෙසේද?

මෙම ප්‍රශ්නය එතරම් ජනප්‍රිය වීමට සහ බොහෝ පිළිතුරු ඇති වීමට හේතුව එය රැවටිලිකාර ලෙස සංකීර්ණ වීමයි. අවුරුදු අටකට ආසන්න කාලයක් සහ පිළිතුරු දුසිම් ගණනකට පසු, ප්‍රවේශ්‍යතාවයට එතරම් සැලකිල්ලක් නොදක්වා තිබීම ගැන මම ඇත්තෙන්ම පුදුම වෙමි.

පරිශීලකයා මෙනු ප්‍රදේශයෙන් පිටත ක්ලික් කළ විට මෙම අංග සැඟවීමට මම කැමතියි.

මෙය උදාර හේතුවක් වන අතර එය සැබෑ ප්‍රශ්නයයි. ප්‍රශ්නයේ මාතෘකාව - බොහෝ පිළිතුරු ආමන්ත්‍රණය කිරීමට උත්සාහ කරන බව පෙනේ - අවාසනාවන්ත රතු හුරුල්ලන් අඩංගු වේ.

ඉඟිය: එය "ක්ලික් කරන්න" යන වචනයයි !

ක්ලික් හෑන්ඩ්ලර් බැඳීමට ඔබට ඇත්ත වශයෙන්ම අවශ්‍ය නැත.

සංවාදය වැසීමට ඔබ ක්ලික් හසුරුවන්නන් බැඳ තබන්නේ නම්, ඔබ දැනටමත් අසමත් වී ඇත. ඔබ අසමත් වීමට හේතුව සෑම කෙනෙකුම 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();
}


WAI-ARIA භූමිකාවන් සහ වෙනත් ප්‍රවේශ්‍යතා සහාය

මෙම පිළිතුර මෙම විශේෂාංගය සඳහා ප්‍රවේශ විය හැකි යතුරුපුවරුව සහ මූසික සහාය පිළිබඳ මූලික කරුණු ආවරණය කරයි, නමුත් එය දැනටමත් සෑහෙන තරම් ප්‍රමාණවත් බැවින් මම WAI-ARIA භූමිකාවන් සහ ගුණාංග පිළිබඳ කිසිදු සාකච්ඡාවකින් වැළකී සිටිමි , කෙසේ වෙතත් ක්‍රියාත්මක කරන්නන් විස්තර සඳහා පිරිවිතර වෙත යොමු වන ලෙස මම තරයේ නිර්දේශ කරමි ඔවුන් භාවිතා කළ යුතු භූමිකාවන් සහ වෙනත් සුදුසු ගුණාංග පිළිබඳව.


30
පැහැදිලි කිරීම් සහ ප්‍රවේශ්‍යතාව මනසේ තබා ගනිමින් මෙය වඩාත් සම්පූර්ණ පිළිතුරයි. අනෙක් පිළිතුරු බොහොමයක් ක්ලික් කිරීම පමණක් හසුරුවන අතර කිසිදු පැහැදිලි කිරීමකින් තොරව කේත ස්නිපටය අතහැර දැමූ බැවින් මෙය පිළිගත් පිළිතුර විය යුතු යැයි මම සිතමි.
සිරිල්

4
පුදුම සහගත, හොඳින් පැහැදිලි කර ඇත. මම ප්‍රතික්‍රියාකාරක සංරචකයක් මත මෙම ප්‍රවේශය භාවිතා කළ අතර පරිපූර්ණ ලෙස ස්තූතියි
ඩේවිඩ් ලැවියරි

2
ගැඹුරු පිළිතුරට @zzzzBov ස්තූතියි, මම එය වැනිලා ජේඑස් හි සාක්ෂාත් කර ගැනීමට උත්සාහ කරමි, තවද මම සියලු jquery දේවල් සමඟ ටිකක් නැති වී සිටිමි. වැනිලා ජේඑස් වල සමාන දෙයක් තිබේද?
හෙන්ඩ්රික් එන්ග්

2
zzzzzBov නැත මම ඔබට jQuery රහිත අනුවාදයක් ලිවීමට සොයන්නේ නැත, මම එය කිරීමට උත්සාහ කරමි. හොඳම දෙය නම් මම ඇත්තටම හිර වී ඇත්නම් මෙහි නව ප්‍රශ්නයක් ඇසීමයි. නැවතත් ගොඩක් ස්තූතියි.
හෙන්ඩ්‍රින්ග්

7
අභිරුචි පතන හෝ වෙනත් යෙදවුම් වලින් ක්ලික් කිරීම හඳුනා ගැනීම සඳහා මෙය හොඳ ක්‍රමයක් වන අතර, එය කිසි විටෙකත් හේතු දෙකක් නිසා මොඩල හෝ පොප්අප් සඳහා වඩාත් සුදුසු ක්‍රමය නොවිය යුතුය. පරිශීලකයා වෙනත් ටැබ් එකකට හෝ කවුළුවකට මාරු වූ විට හෝ සන්දර්භය මෙනුවක් විවෘත කළ විට මොඩලය වැසෙනු ඇත, එය ඇත්තෙන්ම f * කරදරකාරී වේ. මීට අමතරව, 'ක්ලික්' සිදුවීම මූසිකය මතට ගිනි තබන අතර, 'නාභිගත කිරීමේ' සිදුවීම ඔබ මූසිකය පහළට එබූ මොහොතේම අවුලුවයි. සාමාන්‍යයෙන්, බොත්තමක් ක්‍රියාව සිදු කරන්නේ ඔබ මූසික බොත්තම පහළට එබීමෙන් පසුව යන්නට ඉඩ හරින්නේ නම් පමණි. මොඩල් සඳහා මෙය කළ හැකි නිසි, ප්‍රවේශ විය හැකි ක්‍රමය වන්නේ ටැබ් කළ හැකි සමීප බොත්තමක් එක් කිරීමයි.
කෙවින්

145

මෙහි ඇති අනෙක් විසඳුම් මට වැඩ නොකළ නිසා මට භාවිතා කිරීමට සිදු විය:

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

වෙනත් Jquery UI විජට් ඔබේම පොප්-ඕවර් කොටුව තුළට කාවැද්දීමේදී HTML හසුරුවන්නන් පිටත ක්ලික් කිරීමෙන් වළක්වා ගැනීම සඳහා event.target භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ තවත් ප්‍රායෝගික උදාහරණයක් මම පළ කර ඇත්තෙමි: මුල් ඉලක්කය ලබා ගැනීමට හොඳම ක්‍රමය
ජෝයි ටී

43
ඕනෑම ළමා අංගයක් ක්ලික් කළ විට මෙනුව වැසීමට නොහැකි වන පරිදි මම ප්‍රකාශය && !$(event.target).parents("#foo").is("#foo")තුළ එකතු කිරීම හැර මෙය මට වැඩ කළේය IF.
honyovk

1
වඩා හොඳ සොයාගත නොහැක: // අපි පිටත $ (event.target) .අපේ දෙමව්පියන් ('# foo') දිග == 0
ඇලෙක්ස් ජී

3
ගැඹුරු කැදැල්ල හැසිරවීම සඳහා සංක්ෂිප්ත වැඩිදියුණු කිරීම භාවිතා කිරීම .is('#foo, #foo *'), නමුත් මෙම ගැටළුව විසඳීම සඳහා ක්ලික් හසුරුවන්නන් බැඳීමට මම නිර්දේශ නොකරමි .
zzzzBov

2
!$(event.target).closest("#foo").lengthවඩා හොඳ වනු ඇති අතර @ හොනියොව්ක් එකතු කිරීමේ අවශ්‍යතාවය මඟහරවා ගත හැකිය.
tvanc

128

මට මෙනුව විවෘත කරන විට ක්ලික් කිරීමේ සිදුවීම ශරීරයට ඇමිණීම හැර, එරාන්ගේ උදාහරණයට සමානව ක්‍රියා කරන යෙදුමක් මා සතුව ඇත ... කරුණාව මේ වගේ ය:

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

  event.stopPropagation();
});

JQuery හි ක්‍රියාකාරිත්වය පිළිබඳ වැඩි විස්තරone()


9
නමුත් ඔබ මෙනුව මත ක්ලික් කළහොත් පිටතින් එය ක්‍රියා නොකරනු ඇත :)
vsync

3
ක්ලික් අසන්නන් ශරීරයට බැඳීමට පෙර event.stopProgagantion () දැමීමට එය උපකාරී වේ.
ජැස්පර් කෙනිස්

4
මෙහි ඇති ගැටළුව නම්, අරාව වෙත සිදුවීම් කිහිප වතාවක් එකතු කිරීමේ jQuery ක්‍රමයට "එකක්" අදාළ වේ. එබැවින් ඔබ එය කිහිප වතාවක් විවෘත කිරීමට මෙනුව මත ක්ලික් කළහොත්, සිදුවීම නැවත ශරීරයට බැඳී ඇති අතර මෙනුව කිහිප වතාවක් සැඟවීමට උත්සාහ කරයි. මෙම ගැටළුව විසඳීම සඳහා අසාර්ථක ආරක්ෂාවක් යෙදිය යුතුය.
markyzm

භාවිතයෙන් බැඳීමෙන් පසු .one- $('html')හසුරුවන්නාගේ ඇතුළත - ලියන්න a $('html').off('click').
කෝඩි

4
Ody කෝඩි මම හිතන්නේ නැහැ එය ප්‍රයෝජනවත් වේවි කියා. මෙම oneහසුරුවන්නා ස්වයංක්රීයව කියනු ඇත off(එය සඟවන්න ලේඛන පෙන්වා වෙනවා වැනි) ඒ අතර වේ.
මාරියානෝ දේශන්ස්

45

පර්යේෂණයෙන් පසු මම වැඩ කරන විසඳුම් තුනක් සොයාගෙන ඇත (යොමු කිරීම සඳහා පිටු සබැඳි මට අමතක විය)

පළමු විසඳුම

<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
තෙවන විසඳුම බොහෝ දුරට පරීක්ෂා කිරීමේ වඩාත් අලංකාර ක්‍රමයයි. එයට jQuery හි කිසිදු පොදු කාර්යයක් සම්බන්ධ නොවේ. ඉතා කදිමයි. එය බොහෝ සෙයින් උපකාරී විය. ස්තූතියි.
dbarth

මම උත්සාහ කරන්නේ තුන්වන විසඳුම බහු අංග සමඟ ය document.getElementsByClassName , යමෙකුට හෝඩුවාවක් ඇත්නම් කරුණාකර බෙදා ගන්න.
lowtechsun

@lowtechsun එක් එක් පරික්ෂා කිරීම සඳහා ඔබට ලූප් කිරීමට සිදුවේ.
ඩොනී ඩී ඇමටෝ

තෙවන විසඳුමට සැබවින්ම කැමතියි, කෙසේ වෙතත්, මගේ ඩිවි එක නැවත ආරම්භ කරන්නේ කුමක් දැයි පෙන්වීමට පෙර ක්ලික් කිරීම අවුලුවයි, කිසියම් අදහසක් ඇයි?
indiehjaerta

තෙවනුව console.log සඳහා ඉඩ ලබා දෙන බව විශ්වාසයි, නමුත් එය කිසිවෙකුට දර්ශනය සැකසීමෙන් සැබවින්ම වසා දැමීමට ඉඩ නොදේ - මන්ද මෙනුව පෙන්වීමට පෙර එය මෙය කරනු ඇත. මේ සඳහා ඔබට විසඳුමක් තිබේද?
රෝලන්ඩික්සෝර්

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

මට හොඳින් වැඩ කරයි.


3
මම භාවිතා කරන්නේ මෙයයි. එය පරිපූර්ණ නොවිය හැකි නමුත් විනෝදාංශ ක්‍රමලේඛකයෙකු ලෙස එය පැහැදිලිව තේරුම් ගැනීමට තරම් සරල ය.
kevtrout

බොඳවීම යනු #menucontainerප්‍රශ්නයට පිටතින් ඇති පියවරකි
බොරෙල්

4
@ බෝරල් බොඳ කිරීම යනු කන්ටේනරයෙන් පිටත චලනය නොවේ . බොඳවීම නාභිගත වීමේ ප්‍රතිවිරුද්ධයයි, ඔබ සිතන්නේ මූසිකය ගැන ය. මම "සංස්කරණය කිරීමට ක්ලික් කරන්න" පෙළ නිර්මාණය කරන විට මෙම විසඳුම මට හොඳින් ක්‍රියාත්මක විය. එහිදී මම ක්ලික් කිරීම්වල සරල පෙළ සහ ආදාන ක්ෂේත්‍ර අතර පෙරළා මාරු කළෙමි.
parker.sikand

මම එකතු වුණා tabindex="-1"වෙත #menuscontainerඑය වැඩ කළ යුතු බව ය. ඔබ කන්ටේනරය තුළ ආදාන ටැගයක් තබා එය මත ක්ලික් කළහොත් කන්ටේනරය සැඟවී ඇති බව පෙනේ.
ටිරියන්

මවුස්ලව් සිද්ධිය මෙනු සහ බහාලුම් සඳහා වඩාත් සුදුසු වේ (ref: w3schools.com/jquery/… )
Evgenia Manolova

38

දැන් ඒ සඳහා ප්ලගිනයක් තිබේ: බාහිර සිදුවීම් ( බ්ලොග් සටහන )

ක්ලික් අවුට්සයිඩ් හෑන්ඩ්ලර් (WLOG) මූලද්‍රව්‍යයකට බැඳී ඇති විට පහත සඳහන් දේ සිදු වේ:

  • මූලද්‍රව්‍යය ක්ලික් අවුට්සයිඩ් සමඟ සියලු අංග රඳවා ඇති අරාවකට එකතු කරනු ලැබේ හසුරුවන්නන්
  • a ( namespaced ) ක්ලික් කරන්න හෑන්ඩ්ලර් ලේඛනයට බැඳී ඇත (දැනටමත් නොමැති නම්)
  • ලේඛනයේ ඕනෑම ක්ලික් කිරීමක දී, එම අරාවෙහි ඇති මූලද්‍රව්‍ය සඳහා සමාන නොවන හෝ ක්ලික් කිරීමේ මවුපියන් සඳහා ක්ලික් අවුට්සයිඩ් සිදුවීම අවුලුවන. ඉවෙන්ට්ස් ඉලක්කයේ
  • ඊට අමතරව, ක්ලික් අවුට්සයිඩ් සිදුවීම සඳහා event.target පරිශීලකයා ක්ලික් කළ අංගයට සකසා ඇත (එබැවින් පරිශීලකයා ක්ලික් කළ දේ ඔබ දන්නවා, ඔහු පිටතින් ක්ලික් කළ බව පමණක් නොවේ)

එබැවින් කිසිදු සිදුවීමක් ප්‍රචාරණයෙන් නතර නොවන අතර බාහිර ක්ලික් කරන්නා සමඟ මූලද්‍රව්‍යයට ඉහළින් “ඉහළ” ක්ලික් කරන්නන් භාවිතා කළ හැකිය.


නියම ප්ලගිනය. "බාහිර සිදුවීම්" සඳහා සබැඳිය අක්‍රීය වී ඇති අතර බ්ලොග් පෝස්ට් සබැඳිය ඒ වෙනුවට ජීවමාන වන අතර "ක්ලික් අවුට්සයිඩ්" කාරුණික සිදුවීම් සඳහා ඉතා ප්‍රයෝජනවත් ප්ලගිනයක් සපයයි. එය ද MIT බලපත්‍රලාභී ය.
TechNyquist

නියම ප්ලගිනය. පරිපූර්ණව වැඩ කළා. භාවිතය එසේ ය:$( '#element' ).on( 'clickoutside', function( e ) { .. } );
ගේවින්

33

මෙය මට හොඳින් වැඩ කළා !!

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

මෙම විසඳුම මා කරමින් සිටි දෙයට හොඳින් ක්‍රියාත්මක විය, එහිදී මට ක්ලික් කිරීමේ සිදුවීම බුබුලු දැමීමට අවශ්‍ය විය, ස්තූතියි.
මයික්

26

පරිශීලකයා පිටත ක්ලික් කළ විට මෙනුව වසා දැමීම ඔබට සැබවින්ම අවශ්‍ය යැයි මම නොසිතමි; ඔබට අවශ්‍ය වන්නේ පරිශීලකයා පිටුවේ ඕනෑම තැනක ක්ලික් කළ විට මෙනුව වැසීමයි. ඔබ මෙනුව මත ක්ලික් කළහොත් හෝ මෙනුවෙන් පිටත එය වසා දැමිය යුතුද?

ඉහත සතුටුදායක පිළිතුරු කිසිවක් සොයා නොගැනීම නිසා අනෙක් දින මෙම බ්ලොග් සටහන ලිවීමට මා පෙලඹුණි . වැඩි අවධානයක් යොමු කිරීම සඳහා, සැලකිල්ලට ගත යුතු ගොචා ගණනාවක් තිබේ:

  1. ක්ලික් කිරීමේ වේලාවේදී ඔබ ශරීර මූලද්‍රව්‍යයට ක්ලික් සිදුවීම් හසුරුවන්නෙකු ඇමිණුවහොත් මෙනුව වැසීමට පෙර 2 වන ක්ලික් කිරීම සඳහා රැඳී සිටීමට වග බලා ගන්න. එසේ නොමැතිනම් මෙනුව විවෘත කළ ක්ලික් කිරීමේ සිදුවීම අසන්නාට මෙනුව වැසීමට සිදුවේ.
  2. ක්ලික් කිරීමේ සිදුවීමකදී ඔබ event.stopPropogation () භාවිතා කරන්නේ නම්, ඔබේ පිටුවේ වෙනත් කිසිදු අංගයකට ක්ලික්-ඕනෑම තැනක සිට වසා දැමීමේ අංගයක් තිබිය නොහැක.
  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

විසඳුම 1

යම් පැත්තකට බලපෑම් ඇති කළ හැකි event.stopPropagation () භාවිතා කරනවා වෙනුවට සරල ධජ විචල්‍යයක් නිර්වචනය කර එක් 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";
    }
});

විසඳුම 2

සරල 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 වඩා හොඳින් ක්‍රියා කරයි, මන්ද එය සිදුවීම ලේඛනයට ප්‍රචාරය කරන වේලාව වන විට ක්ලික් කිරීමේ ඉලක්කය DOM වෙතින් ඉවත් කළ විට එය හසුරුවයි.
ඇලිස්

21

කවුළු ක්ලික් කිරීමේ සිදුවීම් ඉලක්කය පරීක්ෂා කරන්න (එය වෙනත් තැනක ග්‍රහණය කර නොගන්නා තාක් කල් එය කවුළුව වෙත ව්‍යාප්ත විය යුතුය), සහ එය මෙනු අංග කිසිවක් නොවන බවට වග බලා ගන්න. එය එසේ නොවේ නම්, ඔබ ඔබේ මෙනුවෙන් පිටත සිටී.

නැතහොත් ක්ලික් කිරීමේ පිහිටීම පරීක්ෂා කර එය මෙනු ප්‍රදේශය තුළ තිබේදැයි බලන්න.


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 යනුවෙන් හැඳින්වෙන දේපලක් ඇත, එය මූලද්‍රව්‍යයේ “මුතුන් මිත්තන්ගේ ගස් අනුපිළිවෙලට ස්ථිතික ඇණවුම් ලැයිස්තුවක්” වේ. කිසියම් සිදුවීමක් නිශ්චිත DOM මූලද්‍රව්‍යයකින් හෝ එහි දරුවෙකුගෙන් ආරම්භ වී ඇත්දැයි පරීක්ෂා කිරීමට, එම නිශ්චිත DOM මූලද්‍රව්‍යය සඳහා මාර්ගය පරීක්ෂා කරන්න. ශ්‍රිතයේ 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
  }
});

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>


13

කිසිවෙකු පුදුමයට පත් නොවූ 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
මුහම්මට් ටොන්බුල්

මෙය පිළිගත් පිළිතුර විය යුතුය. ස්තූතියි !!!
ලකී ලැම්

8

ඔබ IE සහ FF 3 සඳහා ස්ක්‍රිප්ට් කරන්නේ නම්. * සහ ක්ලික් කිරීම යම් කොටු ප්‍රදේශයක් තුළ සිදුවී ඇත්දැයි දැන ගැනීමට ඔබට අවශ්‍ය නම්, ඔබට මෙවැනි දෙයක් භාවිතා කළ හැකිය:

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

ප්‍රවාහ බාධා කිරීම්, නොපැහැදිලි / නාභිගත කිරීමේ සිදුවීම් හෝ වෙනත් උපක්‍රමශීලී තාක්‍ෂණයන් භාවිතා කරනවා වෙනුවට, සිදුවීම් ප්‍රවාහය මූලද්‍රව්‍යයේ in ාතිත්වය සමඟ ගැලපෙන්න:

$(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
qwertzman

මෙහි අතිරික්ත චෙක්පතක් තිබේ. මූලද්රව්යය ඇත්ත වශයෙන්ම #menuscontainerඔබ තවමත් එහි දෙමව්පියන් හරහා ගමන් කරයි. ඔබ මුලින්ම එය පරීක්ෂා කළ යුතු අතර, එය එම මූලද්‍රව්‍යය නොවේ නම්, පසුව DOM ගස ඉහළට යන්න.
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

මෙහි කුතුහලයෙන් සිටින අයෙකු javascript විසඳුම නම් (es6):

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

සහ es5, එසේ නම්:

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() {}. ඔබ සතුව ඇති දේ සරල ජාවාස්ක්‍රිප්ට් ලෙස වර්ගීකරණය කර ඇත.
මෝර්ටන්මෝල්ඩර්

Ort මෝර්ටන්මෝල්ඩර්: යා. එය ඇත්ත වශයෙන්ම ES6 වුවද අවධානය සඳහා පමණි. නමුත් විසඳුම දෙස බලන්න. මම හිතන්නේ එය හොඳයි.
ඩුආන්ක්ස්

එය වැනිලා JS වන අතර DOM වෙතින් ඉවත් කරන ලද සිදුවීම් ඉලක්කය සඳහා ක්‍රියා කරයි (උදා: අභ්‍යන්තර උත්පතන වලින් අගය තෝරාගත් විට, වහාම උත්පතන වසා දමයි). +1 මගෙන්!
ඇලිස්

6

ලේඛනයේ ක්ලික් සිදුවීම් සවන්දෙන්නෙකු සම්බන්ධ කරන්න. සිදුවීම් අසන්නා තුළ, ඔබට සිදුවීම් වස්තුව දෙස බැලිය හැකිය , විශේෂයෙන්, event.target ක්ලික් කළේ කුමන මූලද්‍රව්‍යයද යන්න බැලීමට:

$(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

වඩාත්ම ජනප්රිය පිළිතුර සඳහා ඉහළට, නමුත් එකතු කරන්න

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

එබැවින්, අනුචලන තීරුවක් මත ක්ලික් කිරීමෙන් ඔබේ ඉලක්ක අංගය [සැඟවීමට හෝ කිසිවක්] සිදු නොවේ.


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
    }
})

පහත HTML කේතය සොයා ගන්න

<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

පහසු භාවිතය සහ වඩාත් ප්‍රකාශන කේතය සඳහා, මම මේ සඳහා jQuery ප්ලගිනයක් නිර්මාණය කළෙමි:

$('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...
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.