【问题标题】:childNodes.length 0 in Chrome / Correct In IE & FF在 Chrome 中 childNodes.length 0 / 在 IE 和 FF 中更正
【发布时间】:2010-02-12 03:04:17
【问题描述】:

我有一个带有孩子的 div,我需要抓取它以查找特定链接。 HTML 看起来像这样:

<div id="ctl00_LeftNav">
    <h3>
        <a href="../App_Templates/#" rel="0">Menu 1</a></h3>
    <div>
        <p>
            <span>
                <div style="padding-left: 0px; font-weight: bold;">
                    <a href="javascript:OnLeftMenuSelection(1);">Opt 1</a></div>
                <div style="padding-left: 10px;">
                    <a href="javascript:OnLeftMenuSelection(56);">Opt 1a</a></div>
                <div style="padding-left: 0px; font-weight: bold;">
                    <a href="javascript:OnLeftMenuSelection(2);">Opt 2</a></div>
            </span>
        </p>
    </div>
    <h3>
        <a href="../App_Templates/#" rel="1">Menu 2</a></h3>
    <div>
        <p>
            <span>
                <div style="padding-left: 0px; font-weight: bold;">
                    <a href="javascript:OnLeftMenuSelection(33);">Opt 1</a></div>
                <div style="padding-left: 0px; font-weight: bold;">
                    <a href="javascript:OnLeftMenuSelection(34);">Opt 2</a></div>
                <div style="padding-left: 10px;">
                    <a href="javascript:OnLeftMenuSelection(42);">Opt 2a</a></div>
            </span>
        </p>
    </div>
    <h3>
        <a href="../App_Templates/#" rel="2">Menu 3</a></h3>
    <div>
        <p>
            <span>
                <div style="padding-left: 0px; font-weight: bold;">
                    <a href="javascript:OnLeftMenuSelection(58);">Opt 1</a></div>
                <div style="padding-left: 0px; font-weight: bold;">
                    <a href="javascript:OnLeftMenuSelection(59);">Opt 2</a></div>
            </span>
        </p>
    </div>
</div>

我的 Javascript 在 IE / Firefox 中运行良好,但在 Chrome 中失败:

        function OnPageLoadCategorySelect(Category) {            
        var Root = $j('#ctl00_LeftNav').children();
        var Tab = 0;
        for (var i = 1; i < Root.length; i += 2) {
            var Menu = Root[i].firstChild.firstChild.childNodes;                
            var MenuLength = Menu.length;
            for (var j = 0; j < Menu.length; j++) {
                var Link = Menu[j].innerHTML;
                var Start = Link.indexOf('(');
                var End = Link.indexOf(')');
                var Res = Link.slice(Start + 1, End);
                if (Res == Category) {
                    SelectedTabIndex = Tab;                        
                    OnLeftMenuSelection(Category);
                    $j('#ShopTabs').show();
                    $j('#ctl00_LeftNav').accordion('activate', Tab);                      
                    return;
                }
            }                
            Tab++;                
        }
    }

在 Chrome 中,第二个 for 循环永远不会执行,因为 Menu.length 为零。获得这些内部 div 的最佳方法是什么?

解决方案

function OnPageLoadCategorySelect(Category) {
$j("#ctl00_LeftNav > div").each(function(Tab, el) {
            $j('a', this).each(function() {
                var id = $j(this).attr('href').replace('javascript:OnLeftMenuSelection(', '').replace(');', '');
                if (id == Category) {
                    SelectedTabIndex = Tab;
                    OnLeftMenuSelection(Category);
                    $j('#ShopTabs').show();
                    $j('#ctl00_LeftNav').accordion('activate', Tab);
                    return false; // exit the loop
                }
            })
        });
 }

【问题讨论】:

  • 有点 - 我正在学习 jQuery。因此,如果有更好的使用方法,请告诉我:)

标签: javascript jquery html dom


【解决方案1】:

如果我正确理解您的代码,请将您的整个函数替换为:

function OnPageLoadCategorySelect(Category) {
  $j("#ctl00_LeftNav > div").each(function(Tab, el){
      $j('a', this).each(function(){
          var id = $j(this).attr('href').replace('javascript:OnLeftMenuSelection(','').replace(')','');
          if( id == Category ) {
              SelectedTabIndex = Tab;                        
              OnLeftMenuSelection(Category);
              $j('#ShopTabs').show();
              $j('#ctl00_LeftNav').accordion('activate', Tab);                      
              return false; // exit the loop
          }
      })
  });
}

each 函数的第一个参数是从零开始的索引。通过提供 Tab,它会为您计算。

【讨论】:

  • 哇,谢谢道格。刚开始写我自己的,但是当我失败时我会试试这个......
  • 没用。当我用 firebug 单步执行它时,它只会跳过 '$j("#ctl00_LeftNav > div").each(function(Tab, el)'。
  • @Chris,我提供的选择器适用于您提供的 HTML。很有可能,ID 已更改,或者 HTML 不一样(意思是,div 不是#ctl00... 的直接子代)。如果你查看页面的来源(不是 Firebug来源),和你上面贴的一样吗?
  • @Chris - 除了 Doug 的建议之外,您是否在使用“$j”别名之前致电 jQuery.noConflict()
  • 知道了。是的,它是一样的 - id 以';'结尾。刚刚将 .replace(')',''); 替换为 .replace(');','');。它有效!
【解决方案2】:

你应该考虑使用 jQuery。

$('#ctl00_LeftNav').children("div").each(function(index) {

   alert(index + ': ' + $(this).text()); // displays inner text of div

});

或者这会得到选择器的所有子 div,正如 patrick 所指出的那样

$('#ctl00_LeftNav > div').each(function(index) {

   alert(index + ': ' + $(this).text()); // displays inner text of div

});

来源:here for 循环

【讨论】:

  • 有什么方法可以只抓取 div 而不是 h3 标签?我将如何进行内部循环?
  • 我更新了我的答案,所以它抓住了选择器的所有子 div。
  • 哇,这很简单。谢谢 - 现在就试一试。
  • 此代码只会查找属于#ctl00_LeftNav直系子代的 div。它不会遍历更深的后代。
  • @patrick,是的,我知道。我给了他一个基本的想法,他应该能够通过使用这个基本想法来获得他需要的所有孩子。
猜你喜欢
  • 2012-10-13
  • 2012-03-18
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
相关资源
最近更新 更多