【问题标题】:How do I get element's className inside loop of elements?如何在元素循环中获取元素的 className?
【发布时间】:2011-02-10 16:23:26
【问题描述】:

我正在尝试创建一个函数,该函数给出一个除数和一个类列表,然后将在其中进行一些文本替换。

了解了 Firefox Dom 如何以不同的方式处理文本节点后,我读到我必须使用 javascript 来循环遍历与 nextSibling 同级的元素。

我在脚本中遇到的最后一个障碍(您可以看到其中的一小部分)是获取类名。我需要类名,这样我就可以过滤掉要替换的内容。

查看了所有答案,并在工作中一位名叫 Ryan 的同事的帮助下,我们在 jquery 中重新完成了这项工作。

        $(divid).find(".status_bar").each( function() {
        var value = $.trim($(this).text());
        // if value is not defined thru browser bugs do not replace
        if (typeof(value) != 'undefined') {
            // it is a text node. do magic.
            for (var x = en_count; x > 0; x--) {
                // get current english phrase
                var from = en_lang[x];
                // get current other language phrase
                var to = other_lang[x];
                if (value == from) {
                    console.log('Current Value ['+value+'] English ['+from+'] Translation ['+to+']');
                    value = to;
                    $(this).attr('value', to);
                }
            }
        }
    });

这目前适用于所有领域,除了替换文本。

我最初在 jQuery 中这样做的原因是,我不确定我是否可以循环遍历元素,并避免了 firefox 和文本节点的问题。

我正在对 div 中的所有元素进行循环,现在我需要获取我正在循环的元素的类名。

然后我可以检查当前元素的类是否为一,我需要做一些事情......

 // var children = parent.childNodes, child;
    var parentNode = divid;

    // start loop thru child nodes
    for(var node=parentNode.firstChild;node!=null;node=node.nextSibling){

    var myclass = (node.className ? node.className.baseVal : node.getAttribute('class'));

    }

但是这个获取类名的代码只获取空值。

有什么建议吗?

对于那些试图弄清楚重点是什么的人,请阅读此JavaScript NextSibling Firefox Bug Fix 我有可以在 Google Chrome 和 IE 中进行语言翻译的代码。但是当我在 Firefox 中使用它,并在 ajax 加载它后尝试翻译 div 内容时,由于空格问题,它失败了。

我真的不喜欢 jQuery 或纯 Javascript,我只想要一个可行的解决方案。

感谢大家的耐心等待。我个人认为我的描述非常清楚,如果不是,我深表歉意。我并没有试图变得晦涩难懂或难以获得帮助。但是请不要侮辱我,暗示我是想把它弄不清楚。

谢谢。

【问题讨论】:

  • 我只需要我当前在循环内的节点的类名。但是我这里的代码什么也没返回..
  • 你觉得node.className.baseVal给你什么?
  • 您已经用 jQuery 标记了这个问题,但您似乎不了解 jQuery DOM 遍历。如果您不使用 jQuery,请重新标记您的问题。见api.jquery.com/category/traversing
  • 我重新编辑了这个。为什么我因为试图寻求帮助而得到 -1?
  • @crosenblum:node.className 是一个字符串。字符串没有baseVal 属性,所以node.className.baseVal 会给你undefined。 -1(不是我的)可能是因为无法描述您的实际问题。

标签: javascript jquery element classname


【解决方案1】:

嗯...你有 jQuery 但不使用它?

$(divid).children(".yourSpecialClassName").each( function() {
  doSomethingWith(this);
});

要获取 CSS 类属性值,可以这样做:

$(divid).children().each( function() {
  alert(this.className);
});

根据你现在发布的功能,你想要这个:

$(divid).find(".status_bar").each( function() {
  $(this).text( function(i, text) {
    var x = $.inArray(en_lang, $.trim(text));
    if (x > -1) {
      console.log('Current Value ['+text+'] English ['+en_lang[x]+'] Translation ['+other_lang[x]+']');
      return other_lang[x];
    }
    return text;
  });
});

请不要再使用“做魔术”作为评论。这真是太蹩脚了。


编辑。这可以提高效率(删除多余的console.log()):

$(divid).find(".status_bar").each( function() {
  // prepare dictionary en_lang => other_lang
  var dict = {};
  $.each(en_lang, function(x, word) { dict[word] = other_lang[x]; });

  $(this).text( function(i, text) {
    var t = $.trim(text);
    return (t in dict) ? dict[t] : text;
  });
});

【讨论】:

  • 如何获取循环内节点的类名?我必须遍历 div 内的所有元素。但是我不能通过数字循环,因为这在 Firefox 中不起作用,所以这个脚本是循环遍历 div 内的每个元素,然后让我做点什么。你能帮忙吗?
  • @crosenblum:你太含糊了。不要告诉我你想要做什么(“抬起我的腿,然后抬起我的另一条腿等等”)而是你想要实现(“到达房间的另一端”)。最好将示例 HTML 添加到您的问题中,并确定您想要处理的元素。提示:当你有 jQuery 时,你肯定不需要任何围绕 firstChildnextSibling DOM 属性的 for 循环。
  • 我想要做的是循环遍历 div 内的内容元素,但由于 Firefox 的 dom 处理,我无法使用数字循环。这就是为什么我试图通过 javascript 来做到这一点。
  • @crosenblum:你仍然没有告诉我你想做什么。我什至不确定您为什么要在浏览器不兼容问题上做出如此努力 - jQuery 为您完成了所有这些工作。如果你仍然必须做这样的事情,这是一个强有力的指标,表明你做错了。这意味着:告诉我们你想做什么,而不是你想怎么做。有那么难吗?
  • 喜欢你使用.inArray 的方式和文本替换功能。我的回答变得懒惰了。 ;) 我认为从他的问题中他想替换同时具有 status_bar 和 some_other_class 的文本,但除此之外和优雅的解决方案。
【解决方案2】:

如果你使用 jquery,你可以这样做:

$("#myDiv").find("*").each(
   function(){
      var myclass = $(this).attr("class");
   }
);

【讨论】:

  • 在这种情况下这行不通...所以请回答我的问题。
  • 为什么它不起作用?你没有使用jquery?当您说所有元素时,您的意思是递归的所有元素,还是仅 div 的直接子元素中的所有元素?
【解决方案3】:

您的示例代码没有意义。

$(this).attr('value', to);

'value'是标签的一个属性,不是文本内容。

你真的打算这样做吗?

$(this).text(to);

此外,您已经重新编辑了您的问题,但您仍在尝试使用非 jQuery 方法遍历子节点。您说“我在脚本中遇到的最后一个障碍(您可以看到其中的一小部分)是获取类名。我需要类名,以便我可以过滤掉要替换的内容。”

如果您使用 jQuery,则完全没有必要遍历任何内容来获取类名。首先,您只需使用正确的selector

 $(divid).find(".status_bar.replaceme").each( function() {  
    // .replaceme is whatever class you're using for the stuff you want to change
    // .status_bar.replaceme matches all elements with BOTH status_bar and replaceme classes

    var value = $.trim($(this).text());
    // if value is not defined thru browser bugs do not replace
    if (typeof(value) != 'undefined') {
        // it is a text node. do magic.


        // NOTE: The following is inefficient but I won't fix it. 
        //       You're better off using an associative array

        for (var x = en_count; x > 0; x--) {
            // get current english phrase
            var from = en_lang[x];
            // get current other language phrase
            var to = other_lang[x];
            if (value == from) {
                console.log('Current Value ['+value+'] English ['+from+'] Translation ['+to+']');
                // value = to;    <-- useless, get rid of it.
                $(this).text(to);
                // or $(this).html(to);
            }
        }
    }
});

【讨论】:

  • 我需要替换 html 中的一些文本,但不会丢失 html 的其余部分。
  • 这不合逻辑。您不会丢失 html 的其余部分,只会丢失替换类元素中的任何 html。如果您用翻译文本替换英文文本,您如何建议在不替换内联 html 的情况下替换它?你必须知道上下文,即。 &lt;p&gt;My &lt;em&gt;favourite&lt;/em&gt; name is Bob.&lt;/p&gt; 需要替换为 &lt;p&gt;Meu nome &lt;em&gt;preferido&lt;/em&gt; é Bob.&lt;/p&gt; 您建议如何根据上下文替换它?
  • 如果你只是替换你的类选择元素的部分,那么你的整个方法是错误的。您正在匹配要替换为数组中已翻译文本的元素的整个 .text() 内容(减去前导/尾随空格)。
  • @ghoppe:*叹气*我放弃了。我不能做的比我在回答中所做的更多。
  • @Tomalak 你已经超越了职责范围,好先生! :)
猜你喜欢
  • 1970-01-01
  • 2021-01-22
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多