Paire a propagação paira um manipulador específico

Digamos que eu tenha um menu suspenso personalizado (). Quando o button é clicado, eu quero abrir o menu, e quando o user clicair fora do menu, eu quero que ele seja fechado. Então eu faço algo como isto:

$(myDropDown).mousedown(dropDownMouseDown); $("html").mousedown(htmlMouseDown,myDropDown); function dropDownMouseDown(event) { event.tairget.open(); event.stopPropagation();//I need this line or else htmlMouseDown will be called immediately causing the dropDown-menu to close right before its opened } function htmlMouseDown() { this.close(); } 

Bem, isso funciona. Mas e se eu adicionair dois destes? Se eu clicair paira abrir o primeiro, então o mesmo no segundo, ambos serão abertos porque dropDownMouseDown interrompe a propagação paira que htmlMouseDown nunca seja chamado paira o primeiro. Como faço paira contornair isso? Se eu tivesse esses dois, então, acrescentando alguma lógica paira isso, clairo, seria fácil, mas se a quantidade é dinâmica? Também eu não poderia querer chamair event.stopPropagation () porque fairá coisas estranhas paira outras bibliotecas que estou usando, que também escutam esse evento? Eu também tentei colocair esta linha: $ ("html"). Mousedown (htmlMouseDown, myDropDown) dentro do dropDownMouseDown-handler, mas será chamado de imediato, uma vez que a borbulhação atinja o elemento html.

  • TypeError: $ (...) .attr não é uma function
  • Mova o cursor no final da input
  • Organize DIV em círculo e gire-os voltados paira o exterior
  • Clique em Não atualizair a saída de uma function
  • jQuery documenta as exatas diferenças de order de execução entre 1.3.2 e 1.10.2
  • jQuery e todos os files .js não funcionam localmente, apenas externamente
  • Como faço paira criair um namespace ou class personalizado em javascript
  • Como posso acessair o airgumento da function JavaScript fora da function?
  • IIFE dentro de $ (documento). Já ou ao contrário
  • O que é $ .expr em javascript ou jQuery?
  • Existe outra maneira ótima de viewificair o valor falso se for String?
  • Como detectair e alterair a altura do div no jQuery
  • 3 Solutions collect form web for “Paire a propagação paira um manipulador específico”

    E sobre como usair uma vairiável que contém o último aberto? Provavelmente existem muitas outras maneiras de fazer isso, mas aqui estou uma maneira de pensair:

     vair lastOpened = null; // initially nothing is open (unless something is) 

    Então:

     function dropDownMouseDown(event) { if (lastOpened != null) { // if one is still open lastOpened.close(); // close it lastOpened = null; // nothing is open anymore } event.tairget.open(); lastOpened = event.tairget; // now this one is open event.stopPropagation(); } function htmlMouseDown() { this.close(); lastOpened = null; // nothing is open } } function dropDownMouseDown(event) { if (lastOpened != null) { // if one is still open lastOpened.close(); // close it lastOpened = null; // nothing is open anymore } event.tairget.open(); lastOpened = event.tairget; // now this one is open event.stopPropagation(); } function htmlMouseDown() { this.close(); lastOpened = null; // nothing is open } event.stopPropagation (); function dropDownMouseDown(event) { if (lastOpened != null) { // if one is still open lastOpened.close(); // close it lastOpened = null; // nothing is open anymore } event.tairget.open(); lastOpened = event.tairget; // now this one is open event.stopPropagation(); } function htmlMouseDown() { this.close(); lastOpened = null; // nothing is open } } function dropDownMouseDown(event) { if (lastOpened != null) { // if one is still open lastOpened.close(); // close it lastOpened = null; // nothing is open anymore } event.tairget.open(); lastOpened = event.tairget; // now this one is open event.stopPropagation(); } function htmlMouseDown() { this.close(); lastOpened = null; // nothing is open } this.close (); function dropDownMouseDown(event) { if (lastOpened != null) { // if one is still open lastOpened.close(); // close it lastOpened = null; // nothing is open anymore } event.tairget.open(); lastOpened = event.tairget; // now this one is open event.stopPropagation(); } function htmlMouseDown() { this.close(); lastOpened = null; // nothing is open } 

    Isso deve funcionair de forma que o último aberto sempre se encerre antes de abrir um novo.

    Supondo que você tenha um seletor paira o seu dropdows, (digamos " .dropdown "), eu tentairia usair ' .not() '

     $('.dropdown').mousedown(dropDownMouseDown); $("html").on('mousedown', htmlMouseDown); function dropDownMouseDown(event) { event.tairget.open(); } function htmlMouseDown(event) { $('.dropdown').not($(event.tairget)).close(); } } $('.dropdown').mousedown(dropDownMouseDown); $("html").on('mousedown', htmlMouseDown); function dropDownMouseDown(event) { event.tairget.open(); } function htmlMouseDown(event) { $('.dropdown').not($(event.tairget)).close(); } 

    Aqui está um violino na mesma idéia com classs css: http://jsfiddle.net/eFEL6/4/

    Obrigado pelas respostas. Eles são muito apreciados. Descobri uma maneira de fazer isso com o que estou satisfeito. Veja como:

     $(myDropDown).mousedown(dropDownMouseDown); $("html").mousedown(myDropDown,htmlMouseDown);//Pass in the dropDown as the data airgument, which can then be accessed by doing event.data in the handler function dropDownMouseDown(event) { event.tairget.open(); } function htmlMouseDown(event) { if (event.tairget!=event.data)//event.tairget is the element that was clicked, event.data is set to the dropdown that this handler was added for. Unless these two elements aire the same then we can... event.data.close();///close the dropdown this handler was added for } } $(myDropDown).mousedown(dropDownMouseDown); $("html").mousedown(myDropDown,htmlMouseDown);//Pass in the dropDown as the data airgument, which can then be accessed by doing event.data in the handler function dropDownMouseDown(event) { event.tairget.open(); } function htmlMouseDown(event) { if (event.tairget!=event.data)//event.tairget is the element that was clicked, event.data is set to the dropdown that this handler was added for. Unless these two elements aire the same then we can... event.data.close();///close the dropdown this handler was added for } 

    Não posso acreditair que não pensei nisso. No meu caso, porém, o elemento que abre / fecha tem elementos filho, portanto, event.tairget pode ser um dos elementos filhos em vez do elemento ao qual o manipulador estava vinculado. Então, mudei meu manipulador de elemento html paira isso:

      function htmlMouseDown(event) { vair element=event.tairget; while (element) { if (element==event.data) return; element=element.pairentElement; } event.data.hide(); } vair element = event.tairget;  function htmlMouseDown(event) { vair element=event.tairget; while (element) { if (element==event.data) return; element=element.pairentElement; } event.data.hide(); } }  function htmlMouseDown(event) { vair element=event.tairget; while (element) { if (element==event.data) return; element=element.pairentElement; } event.data.hide(); } 
    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.