CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  JavaScript

setAttribute()添加了事件属性,却无法触发事件的问题。

楼主redcarpet(左边的油条比较好吃)2005-06-04 12:06:07 在 Web 开发 / JavaScript 提问

想解决如下问题:用getElementById()获得节点A位置,接着用y=getElementsByTagName("div")获得节点A下所有div标签元素,然后在循环中用y.item(i).setAttribute("onclick","treeClick()")使div元素获得onclick属性。在调试中发现div元素确实有了onclick属性,但却不会触发。不知道是什么原因。  
  精简代码如下:  
  //tree对象构造函数;  
  function   tree(id){  
  //属性  
  this.id=id;  
  //方法  
  this.init=treeInit;  
  this.click=treeClick;  
  }  
  //tree对象click方法函数  
  function   treeInit(){  
  //var   id=this.id;  
  var   x=document.getElementById(this.id);  
  if(!x)   return;  
  var   y=x.getElementsByTagName("div");  
  for(var   i=0;i<y.length;i++){y.item(i).setAttribute("onmouseover","treeClick()",0);}  
  }  
  function   treeClick(){  
  alert("a");  
  }  
   
  **********************************************************************  
  下面是全部代码:  
  <?xml   version="1.0"   encoding="utf-8"?>  
  <!DOCTYPE   html   PUBLIC   "-//W3C//DTD   XHTML   1.0   Strict//EN"   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
  <html   xmlns="http://www.w3.org/1999/xhtml">  
  <head>  
  <title>document</title>  
  <meta   http-equiv="Content-Type"   content="text/html;   charset=utf-8">  
  <style>  
  .node{   background-color:#0000FF;   margin-left:10px;   color:#FF0000;}  
  </style>  
  <script>  
  function   tree(id,style){  
  //属性  
  this.id=id;  
  this.style=style;  
  //方法  
  this.init=treeInit;  
  this.click=treeClick;  
  this.write=treeWrite;  
  }  
  function   treeInit(){  
  //var   id=this.id;  
  var   x=document.getElementById(this.id);  
  if(!x)   return;  
  var   y=x.getElementsByTagName("div");  
  //alert(y.length);  
  for(var   i=0;i<y.length;i++)  
  {  
  //y.item(i).setAttribute("onmouseover","treeClick()",0);  
  //var   str=y.item(i).tagName+":"+y.item(i).getAttribute("class");  
  //alert(str);  
  var   str;  
  for   (var   j   in   y.item(i)){  
        str   +=   "<div>"+j   +   ":   "   +y.item(i).getAttribute(j)   +   "</div>";  
  }  
  str+="********************************************************";  
  }  
  //document.write(str);  
  this.click();  
  }  
  function   treeClick(){  
  alert("a");  
  }  
  function   treeWrite(){  
   
  }  
  var   a=new   tree();  
  function   init(){  
  a.id="div1";  
  a.style="node";  
  a.init();  
  }  
  </script>  
  </head>  
   
  <body   onload="init();">  
  <div   id="div1">  
      <span>layer1</span>  
      <div>  
          <span>layer2</span>  
  <div   onmouseover="a.init();">  
      <span>layer3</span>  
  </div>  
  <div   onmouseover="treeClick()">  
      <span>layer3</span>  
  </div>  
      </div>  
      <div>  
          <span>layer2</span>  
  <div>  
      <span>layer3</span>  
  </div>  
  <div>  
      <span>layer3</span>  
  </div>  
      </div>  
  </div>  
   
  </body>  
  </html>  
  问题点数:20、回复次数:4Top

1 楼seeu1688(kangel)回复于 2005-06-05 12:33:38 得分 5

y.item(i).setAttribute("onclick",treeClick)  
  onclick的属性不是字符串,而是一个函数句柄(指针),不要加引号。  
   
  你的div存在嵌套,为了避免ie多次触发,treeClick函数可能需要取消ie的“冒泡”处理.  
  如下:  
   
  function   treeClick(){  
  alert("a");  
  event.cancelBubble=true;  
  }  
  Top

2 楼springwood(background-color:white)回复于 2005-06-05 14:16:34 得分 5

attachEvent("onclick",treeClick);Top

3 楼redcarpet(左边的油条比较好吃)回复于 2005-06-05 15:35:37 得分 0

谢谢楼上的!  
  但此时this依然没指向tag,在网上查了下,此时的this为window。  
  现在我用this.event.srcElement.style.display="none";暂时解决了问题  
  但attachEvent与srcElement都是MSIE的。不知道dom里有没通用的方法?Top

4 楼Minisheep(风云人物)回复于 2005-06-05 20:34:59 得分 10

//   Add   an   eventListener   to   browsers   that   can   do   it   somehow.  
  //   Originally   by   the   amazing   Scott   Andrew.  
  function   addEvent(obj,   evType,   fn){//对象,事件(没有on),函数  
  if   (obj.addEventListener){  
  obj.addEventListener(evType,   fn,   true);  
  return   true;  
  }   else   if   (obj.attachEvent){  
  var   r   =   obj.attachEvent("on"+evType,   fn);  
  return   r;  
  }   else   {  
  return   false;  
  }  
  }  
  addEvent(window,   "load",   setCur);  
  function   setCur(){}Top

相关问题

  • 如何添加一属性
  • 100分悬赏:动态添加自定义控件后,控件的方法和属性都可以正常使用,但是控件的自定义事件却无法触发?急死了!!!
  • 控件的ENABLE属性如何添加
  • 如何添加时间属性?
  • 如何为控件添加属性?
  • C#中如何添加XmlDataDocument的属性?
  • 怎样给ATL组件添加数组属性和属性的属性呢?
  • 请问如何取得触发ChangeEvent事件的属性名?
  • 请问属性页换页时触发什么消息?
  • 修改属性能不能触发子定义的方法?

关键词

  • 事件
  • layer

得分解答快速导航

  • 帖主:redcarpet
  • seeu1688
  • springwood
  • Minisheep

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo