Prototype.js从元素中获取文本

时间:2011-01-24 14:23:33

标签: javascript dom prototypejs

我是Protoype.JS的新手,只是稍微测试了一下,因为我听说它很好,但我很快就被卡住了。 就像使用jQuery一样简单,将文本放在元素中似乎是世界末日。我已经尝试过多种方式的innerHTML,但我唯一能得到的是“未定义”。

alert($$('.mnu_item').innerHTML);
alert($('content').innerHTML);

这些都不起作用。 Content是id为“content”的div,.mnu_item是类“.mnu_item”的锚标记。 我不知道问题是什么,可能是一些愚蠢的事情,但如果有人能指出我正确的方向会很棒!

编辑:我发现不是innerHTML不起作用,但它是类选择器。上面代码中的第二行确实有效。如果这不是正确的方法,如何在最新的Prototype版本中按类选择元素?

4 个答案:

答案 0 :(得分:7)

运行脚本时是否加载了DOM?如果您没有在window.onload中运行此代码或将其放在正文的 end ,那么元素在运行时就不存在。

尝试将您的脚本放在结束</body>标记内。

<body>
    <!-- my content -->

    <script type="text/javascript">
        alert($('content').innerHTML);
    </script>
</body>

此外,您的第一行正确选择,但会返回一个元素数组,因此innerHTML将为undefined

要迭代数组,您可以这样做:

$$('.mnu_item').each(function(val,i) {
    alert(val.innerHTML);
});

或者如果您希望得到innerHTML值的数组,请执行以下操作:

var values = $$('.mnu_item').map(function(val,i) {
    return val.innerHTML;
});

答案 1 :(得分:1)

在运行这些测试之前确保已加载DOM:

$(document).on('dom:loaded', function () {
  /* code to execute after dom has loaded */
})

第一行代码 $$('。mne_item')不起作用,因为$$返回一个包含与css规则匹配的所有元素的数组。所以$$('。mne_item')给出了一个包含 mne_item 类的所有dom元素的数组。你可以使用第一个方法询问第一个,或者迭代所有这样的项目:

$$('.mne_item').each(function(elem) {
  // elem is the li elements extended by all Element methods of prototype
});

如果你在jQuery中使用 $ ,它实际上使用了类似的模式,但隐藏了每个构造。它只是将链式方法应用于所有元素或仅应用于第一个元素。

第二行代码 $('content')。innerHTML 应该有效。 $ document.getElementById 的快捷方式,因此它应该为您提供DOM节点。这不起作用的原因是没有节点,其中id = content,可能是因为dom尚未加载。

有关原型方法的更多信息,请查看api:http://api.prototypejs.org/

同时检查默认的DOM方法:http://quirksmode.org/dom/w3c_core.html

答案 2 :(得分:0)

$('content')。innerHTML应该有用。检查您的HTML,确保ID是唯一的。

答案 3 :(得分:0)

var text = $$('label [for =“display_on_amazon”]')。first()。textContent;

上面的代码对我有用。

关于,$$('。mnu_item')。innerHTML

当您尝试使用类选择器获取时,prototype返回多个元素的数组,通过使用[0]或first()方法系统将指向该数组中的第一个元素,之后您可以使用innerHtml(获取)元素内部的html)或textContent(获取该元素的文本内容,本机javascript方法)