类似select下拉框,鼠标点击元素以外隐藏下拉框(阻止冒泡事件)

html-css043

类似select下拉框,鼠标点击元素以外隐藏下拉框(阻止冒泡事件),第1张

1.点击按钮展开下拉列表

2.点击下拉列表中的选项进行选择

3.点击除下拉列表外的body,收起下拉列表

效果如图:

2.jQuery:

css样式省略略略略略略略略............

function show(){

var e= arguments.callee.caller.arguments[0] || event

if(e &&e.stopPropagation){

e.stopPropagation()

}else if(window.event){

window.event.cancelBubble = true

}

(".gray").show()

}

('html,body,.close').click(function(){

(".gray").hide()

})

因为子元素在父元素的容器内。

给父层元素绑定事件,实际上已经包括了父层元素内的所有区域,所以也包括子元素,所以点击子元素会触发父元素的点击事件。

对于事件而言,这是一种事件传递。如果不希望事件传递下去,可以在子元素上使用js的阻止事件传递方法stopPropagation,就不会将事件传递到父层元素。

这个是事件冒泡!和css没啥关系,就是JS的事。

解决方案:

1.event.stopPropagation()

针对你的代码 大概是这样

obj.onmouseup=function(event){

    XXXXXXX

    event.stopPropagation()

}

事件处理过程中,阻止了事件冒泡,但不会阻击默认行为(它就执行了超链接的跳转)

2.return false

obj.onmouseup=function(){

    XXXXXXX

    return false

}

事件处理过程中,阻止了事件冒泡,也阻止了默认行为(比如刚才它就没有执行超链接的跳转)

3.event.preventDefault() 

obj.onmouseup=function(event){

    XXXXXXX

    event.preventDefault()

}

在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。

以上部分摘自:网页链接