1

所以我正在分析一堆 javascript 中的 HTML,以便我可以将这篇文章缩减为 30 个字符,并附加诸如“...阅读更多”之类的内容。问题是文本块被BR标签隔开。这是我的代码;

<head runat="server">
<title></title>
<script type="text/javascript"src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
    window.onload = function onLoad() {
        alert("Start");
        var intros = this.document.getElementById('EventContent');
        if (intros) {
            for (i = 0; i < intros.length; i++) {

                var els = intros[i].childNodes;
                if (els) {
                    for (j = 0; j < els.length; j++) {
                        alert(els[j].tagName)
                    }
                }
            }
        }
        alert("Start");
    }

</script>
</head>
<body>
<form id="form1" runat="server">
<div id="EventContent">
<br />


<br />
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
<br />
</div>
</form>
</body>

但是我的警报标记名从未显示,尽管我确实收到警报START并且END. 我究竟做错了什么?我怎样才能抓住那些愚蠢的断线...

4

2 回答 2

1

document.getElementById;只返回一个元素 不要试图循环它。

window.onload = function() {
    alert("Start");

    var intro = document.getElementById('EventContent');
    var els = intro.childNodes;

    for (var i = 0; i < els.length; i++) {
        alert(els[i].tagName);
    }

    alert("Stop");
};

至于你只检索文本的最终目标,试试这个:

function getText(element) {
    var i, c, r = '';

    for(i = 0; c = element.childNodes[i]; i++) {
        if(c.nodeType === 3) {
            r += c.nodeValue;
        }
    }

    return r.replace(/^\s+|\s+$/g, '');
}
于 2012-08-27T14:46:29.170 回答
1

您的变量 'intros' 不是数组,因此 intros.length 未定义。你只需要遍历 intros.childNodes

<head runat="server">
<title></title>
<script type="text/javascript"src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
    window.onload = function onLoad() {
        alert("Start");
        var intros = this.document.getElementById('EventContent');
        if (intros) {
            for (i = 0; i < intros.childNodes.length; i++) {
                alert(intros.childNodes[i].tagName)
            }
        }
        alert("Start");
    }

</script>
</head>
<body>
<form id="form1" runat="server">
<div id="EventContent">
<br />
<br />
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
<br />
</div>
</form>
</body>

也就是说,如果您仍然使用 jquery,您可能想以这种方式尝试。

也就是说,我可能不会遍历子节点,而只是获取 div 的内容(div.innerHTML),正则表达式<br />'s并用换行符替换,然后使用子字符串将前 30 个字符从其余的部分。

哦,如上所述,使用调试器。

于 2012-08-27T15:08:30.950 回答