请教一个冒泡事件的问题
时间:2010-05-10
来源:互联网
要实现的是:鼠标放在<p>标签上,背景换色
问题:
- 当鼠标移动到标签<p>时候,<p>标签中的子标签<a>没有背景色
- 当鼠标从<p>标签移动到所属<p>标签中的子标签<a>的时候,<p>标签背景颜色被还原了
代码:
function onLine(e){
e = e || event;
this.tag = e.target || e.srcElement;
this.color = this.tag.style.background ? this.tag.style.background : '#ffffff';
this.tag.style.background = '#fff8df';
}
function outLine(e)
{
this.tag.style.background = this.color;
};
function setLine(elemnt)
{
for(var i=0; i<elemnt.length; i++)
{
if (i % 2 != 0) elemnt[i].style.background = '#f4f8fb';
addEvent(elemnt[i], 'mouseover', onLine);
addEvent(elemnt[i], 'mouseout', outLine);
}
}
作者: feigege 发布时间: 2010-05-10
作者: 我佛山人 发布时间: 2010-05-10
引用:
原帖由 我佛山人 于 2010-5-10 12:04 发表用cssClass控制,始终更改p的class,然后在css的这个class中定义p与a的背景色
2.当鼠标从<p>标签移动到所属<p>标签中的子标签<a>的时候,<p>标签背景颜色被还原了
作者: feigege 发布时间: 2010-05-10

作者: campaignZH 发布时间: 2010-05-10
引用:
原帖由 campaignZH 于 2010-5-10 14:23 发表e.stopPropagation?e.stopPropagation()

代码:
function onLine(e){
e = e || event;
e.stopPropagation?e.stopPropagation():(e.cancelBubble = true);
this.tag = e.target || e.srcElement;
if(this.tag.tagName == 'TD') this.tag = this.tag.parentNode;
this.tagClass = this.tag.className ? this.tag.className : '';
this.tag.className = 'lineHover';
}
作者: feigege 发布时间: 2010-05-10
// 检测一个元素是包含另一个元素
var contains = 'compareDocumentPosition' in document ?
function(container, el) {
return (container.compareDocumentPosition(el) & 16) == 16;
}: 'contains' in document.documentElement ?
function(container, el) {
return container !== el && container.contains(el);
}: function(container, el) {
while (el = el.parentNode) {
if (el === container) return true;
}
return false;
};
// 检测元素是否支持 mouseenter/mouseleave 事件
if('onmouseenter' in document.documentElement){ // ie
p.onmouseenter = function(){ /* handle this.className */ };
p.onmouseleave = function(){ /* handle this.className */ };
}
// 以下判断 注册事件的元素 是否包含 事件关联元素,达到与上面的事件相同的效果
else{
p.onmouseover = function(e){
if( !(e = e.relatedTarget) || (this !== e && !contains(this, e)) ){ /* handle this.className */ }
};
p.onmouseout = function(e){
if( !(e = e.relatedTarget) || (this !== e && !contains(this, e)) ){ /* handle this.className */ }
};
}
[ 本帖最后由 zbm2001z 于 2010-5-10 20:34 编辑 ]
作者: zbm2001z 发布时间: 2010-05-10
引用:
原帖由 zbm2001z 于 2010-5-10 15:05 发表这个问题涉及的知识点比较多,这里不做详细解释了,进一步了解自行搜索相关资料或阅读基础书籍:
// 检测一个元素是包含另一个元素
var contains = 'compareDocumentPosition' in document ?
function(cont ...
作者: feigege 发布时间: 2010-05-11
作者: sunsp321 发布时间: 2010-05-12
引用:
原帖由 sunsp321 于 2010-5-12 10:52 发表楼主能把完整的代码给帖出来一份吗?供小弟们学习下。先谢谢了。
http://www.google.com.hk/search? ... mp;oq=&gs_rfai=
作者: feigege 发布时间: 2010-05-12
作者: cityvoice 发布时间: 2010-05-12
作者: 5shanshop 发布时间: 2010-05-12
作者: 我佛山人 发布时间: 2010-05-12
引用:
原帖由 我佛山人 于 2010-5-12 14:47 发表我说了始终更改p的class,那就是说在a上发生mouse event的时候,需要取parentNode,当然你还需要判断event.srcElement || event.target是p还是a
我这样就解决问题了
代码:
function onLine(e){
this.tag = e.target || e.srcElement;
if(this.tag.tagName == 'A') this.tag = this.tag.parentNode;
if(this.tag.tagName == 'TD') this.tag = this.tag.parentNode;
this.tagClass = this.tag.className ? this.tag.className : '';
this.tag.className = 'lineHover';
}
作者: feigege 发布时间: 2010-05-12
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28