window.onclick除非元素是'someElement'

时间:2011-12-28 22:46:59

标签: javascript jquery function

我想知道是否有办法排除函数上的某些元素。例如:

window.onclick = doThis() except if the element clicked is a 'ul' element.

这样的事情。我知道它可能必须这样写:

function doThis() {
  if (this item clicked is NOT 'ul') { 
     function xyz();
}}

window.onclick = doThis();

我只是不确定javascript中是否存在“异常”。有人可以请帮助。感谢。

好的,所以这是我的完整代码,因为它仍然无效:

<script type="text/javascript">
function ddMenu() {
var timeout    = 500;
var closetimer = 0;
var ddmenuitem = 0;

function ddMenu_open(e)
{
   //ddMenu_canceltimer();
   ddMenu_close();
   var submenu = $(this).find('ul');
    if(submenu){
        ddmenuitem = submenu.css('visibility', 'visible');
        //return false;
        //preventDefault();

    }
   //return true;
}

function ddMenu_close()
{  if(ddmenuitem) ddmenuitem.css('visibility', 'hidden'); }

function ddMenu_timer()
{ closetimer = window.setTimeout(ddMenu_close, timeout); }

function ddMenu_canceltimer()
{  if(closetimer)
   {  window.clearTimeout(closetimer);
      closetimer = null;}}

$(document).ready(function()
{  $('#ddMenu > li').bind('click', ddMenu_open);
   $('#ddMenu li ul').bind('click', ddMenu_timer);
   //$('#ddMenu > li').bind('mouseout',  ddMenu_timer);
   //$('#ddMenu > li').bind('mouseover', ddMenu_canceltimer);

});

document.onclick = function(ev){
    if(ev.target.nodeName !== 'ul')  {
        ddMenu_close();
    }
};


}
</script>

我添加了下面建议的target.nodeName!==代码,但它仍然无效。当我点击一个ul它仍然关闭我的菜单。谢谢。

2 个答案:

答案 0 :(得分:6)

window.onclick = function(ev){
    if( ev.target.nodeName !== 'UL' ){
        xyz();
    }
};

我们在这里做的是将事件对象作为参数。这样我们就可以获得click事件的目标。我们正在这里做 - 我们检查目标是否是ul元素。如果没有,请运行该功能。

此外,仅供将来参考,您必须将该功能分配给onclick。因此,首先将函数分配给变量,然后将变量分配给onclick(不带括号)。我在某个地方读过这篇文章......我会试着把它拉出来。

答案 1 :(得分:2)

事件冒泡了DOM树,所以只需设置一个“阻止程序”即可阻止所有<ul>的冒泡:http://jsfiddle.net/6sqWh/

$(window).on("click", doThis);

$("ul").click(false); // prevent bubbling to window from <ul>s

视觉上会是这样的:

execute the function
 ^                    (passed through)
window  <- click

--   blocks
ul

与之相反:

execute the function
                      (not executed)
window
                      (won't arrive here)
--  blocks
ul  <- click

请注意,如果没有阻止程序,它会像:

execute the function
 ^
window
 ^
ul  <- click