2013-01-22 116 views
0
function handle_node(entity) 
{ 
    var i = 0; 

    var varName = window.event.srcElement.name.substring(0,7); 
    var fieldValue = window.event.srcElement.value; 
    var fieldName; 
    // traverse thru all the products in the family 
    for(i=0; i < entity.childNodes.length; i++) 
    { 
     if(entity.childNodes(i).tagName == "DIV") 
     { 
      handle_child_node(entity.childNodes(i)) 
     } 
    } 
} 

function handle_child_node(entity) 
{ 
    var it = 0; 
    var oObject = entity.all; 

    if (oObject != null) 
    { 
     if (oObject.length != null) 
     { 
      for (it = 0; it < oObject.length; it++) 
      { 
       if (oObject(it).tagName == 'INPUT' && oObject(it).attributes["type"].nodeValue == 'checkbox') 
       { 
        resetTextFieldValue(window.event.srcElement, oObject(it)); 
       } 
      } 
     } 
    } 
} 

上述代码在IE中正常工作。但它不适用于Mozilla。然后我改变下面给出的代码。但它没有得到div标签下的标签。代码可以在Mozilla上进行哪些更改?如何在div标签下使用javascript在Mozilla中获取所有标签

function handle_node(entity) 
     { 
      var i = 0; 
     if (entity.hasChildNodes()) 
     { 
     children= entity.childNodes; 
     for(i=0; i < children.length; i++) { 

      var sibling= children[i]; 

       if(sibling.tagName == "DIV") { 

      var elms = document.getElementsByTagName(sibling); 
       handle_child_node(sibling) 
       } 
      } 
     } 
     } 

     function handle_child_node(entity) 
     { 
     alert("entity"+entity); 
      var it = 0; 
      var oObject = entity.all; 
      if (oObject != null) 
      { 
       if (oObject.length != null) 
       { 
        for (it = 0; it < oObject.length; it++) 
        { 
         if (oObject(it).tagName == 'INPUT' && oObject(it).attributes["type"].nodeValue == 'checkbox') 
         { 
          resetTextFieldValue(window.event.srcElement, oObject(it)); 
         } 
        } 
       } 
      } 
    } 

在句柄handle_child_node(兄弟)正确吗?我认为var oObject = entity.all;不工作。

+0

你能设置一个[的jsfiddle(http://jsfiddle.net),所以我们可以看到如何绑定事件处理程序,因为该处理程序也需要一些工作 –

回答

0

您的handle_node函数看起来像MicroSoft的ECMAScript(JScript)子/超集中的事件处理程序。幸运的是,事件模型是X浏览器代码问题的主要来源。你的代码在我看来就是典型的JScript。查看有关quirksmode事件的文章,以更好地了解/了解这些差异。
现在,虽然,这里是你应该知道的:

JScript不活动对象的实例传递到处理程序,但全球对象 - window - 有一个名为event财产,而所有其他浏览器执行将事件对象传递给处理程序。一般情况下,你会看到处理程序看起来像这样:

document.getElementById('foo').onclick = bar;//bar is handler 
function bar(e) 
{ 
    e = e || window.event;//use passed event instance, or get event property for IE 
    var element = e.target || e.srcElement;//the reference to the DOM element is assigned to another property in JScript 
    //a lot of stuff 
    if (e.preventDefault) 
    {//w3c's events are "controlled" with these methods 
     e.preventDefault(); 
     e.stopPropagation(); 
    } 
    e.returnValue = false;//IE's jScript, but W3C engines have these properties, too 
    e.cancelBubble = true; 
} 

什么这些方法和属性意味着(如果你不知道)是你可以在怪异模式了解。
简而言之:您的代码适用于IE,因为您使用的是在JScript中引用DOM节点的属性,并且您假定事件对象是全局引用,但FF,Chrome/Chromium中并不是这种情况, Safari,Opera ...所以你需要先解决这个问题。

之后,要获取div中的所有子节点,您根本不需要children属性。更重要的是:你不应该依赖这个属性:Mozilla的引擎将把空白列为孩子。 Here's a list of references to children, and the X-browser differences

基本上,你真正需要做的是这样的:

var children = divReference.getElementsByTagName('*'); 

,你就会得到你永远需要的所有引用一个NodesList对象...

0

什么这个想法

function FindTags() 
     { 
      var childDiv = document.getElementById("yourdiv").childNodes; 
      for (i = 0; i < childDiv.length; i++) 
      { 
       if (childDiv[i].tagName == "A") 
       { 
        childDiv[i].style.display = "block"; 
       } 
       if (childDiv[i].tagName == "SPAN") 
       { 
        childDiv[i].style.fontWeight = "normal"; 
       } 
//and so on for all tags you can do any thing 
      } 
     } 

希望这helps.enjoy

+0

'FindTags'不是构造函数。约定规定构造函数以大写字母开头,而常规函数以小写字母开头。使用包含'child'的属性也有风险(请参阅我的答案)。你也在for循环中创建了一个全局变量('i'),并且我会在循环内部使用'switch'或者-attane-else if:如果'tagName'是''A' ',没有必要检查'tagName =='DIV''也是...对于挑剔的对不起... ...但只有很多小的东西可能会派上用场 –

相关问题