我的目标是计算html页面中的所有单词以及计算html页面中的固定单词,问题是使用该函数脚本标记文本也会计入,所以我如何从计数关键字中删除脚本标记。 我这个代码 MSO_ContentTable 是id 0f div标签。如果有的话,还给我关于jquery的任何其他解决方案。
function CountWord(keyword) {
var word = keyword.toUpperCase(),
total = 0,
queue = [document.getElementById('MSO_ContentTable')],
curr, count = 0;
while (curr = queue.pop()) {
var check = curr.textContent;
if (check != undefined) {
for (var i = 0; i < curr.childNodes.length; ++i) {
if (curr.childNodes[i].nodeName == "SCRIPT") {
// do nothing
}
else {
switch (curr.childNodes[i].nodeType) {
case 3: // 3
var myword = curr.childNodes[i].textContent.split(" ");
for (var k = 0; k < myword.length; k++) {
var upper = myword[k].toUpperCase();
if (upper.match(word)) {
count++;
wc++;
}
else if((upper[0] >= 'A' && upper[0] <= 'Z') ||
(upper[0] >= 'a' && upper[0] <= 'z') ||
(upper[0] >= '0' && upper[0] <= '9')) {
wc++
}
}
case 1: // 1
queue.push(curr.childNodes[i]);
}
}
}
}
}
THX 其他问题是我如何删除显示属性为none的标签?
答案 0 :(得分:2)
在您的代码中:
> queue = [document.getElementById('MSO_ContentTable')],
> curr, count = 0;
>
> while (curr = queue.pop()) {
getElementById 只会返回一个节点,因此无需将其放入数组中,以后不需要弹出:
curr = document.getElementById('MSO_ContentTable');
if (curr) {
// do stuff
> var check = curr.textContent;
所有浏览器都不支持DOM 3 Core textContent 属性,您需要提供替代方法,例如innerText,例如:
// Get the text within an element
// Doesn't do any normalising, returns a string
// of text as found.
function getTextRecursive(element) {
var text = [];
var self = arguments.callee;
var el, els = element.childNodes;
for (var i=0, iLen=els.length; i<iLen; i++) {
el = els[i];
// May need to add other node types here
// Exclude script element content
if (el.nodeType == 1 && el.tagName && el.tagName.toLowerCase() != 'script') {
text.push(self(el));
// If working with XML, add nodeType 4 to get text from CDATA nodes
} else if (el.nodeType == 3) {
// Deal with extra whitespace and returns in text here.
text.push(el.data);
}
}
return text.join('');
}
> if (check != undefined) {
鉴于check将始终是一个字符串(即使使用textContent或innerText而不是上面的函数),针对undefined进行测试似乎不合适。此外,我不明白为什么在循环子节点之前完成此测试。
无论如何,上面的 getText 函数将返回没有脚本元素的文本内容,因此您可以使用它来获取文本,然后根据需要使用它。您可能需要规范化空格,因为不同的浏览器将返回不同的数量。
PS。我应该注意, arguments.callee 在ES5严格模式下受到限制,因此如果您计划使用严格模式,请使用对该函数的显式调用替换该表达式。
要排除不可见的元素,您需要测试每个元素以查看它是否可见。 仅测试元素,不要测试文本节点,就好像它们的父元素不可见,文本也不会。
请注意,以下内容尚未经过广泛测试,但至少可以在IE 6和最近的Firefox,Opera和Chrome中使用。在更广泛地使用之前,请彻底测试。
// The following is mostly from "myLibrary"
// <http://www.cinsoft.net/mylib.html>
function getElementDocument(el) {
if (el.ownerDocument) {
return el.ownerDocument;
}
if (el.parentNode) {
while (el.parentNode) {
el = el.parentNode;
}
if (el.nodeType == 9 || (!el.nodeType && !el.tagName)) {
return el;
}
if (el.document && typeof el.tagName == 'string') {
return el.document;
}
return null;
}
}
// Return true if element is visible, otherwise false
//
// Parts borrowed from "myLibrary"
// <http://www.cinsoft.net/mylib.html>
function isVisible(el) {
if (typeof el == 'string') el = document.getElementById(el);
var doc = getElementDocument(el);
var reVis = /\bhidden\b|\bnone\b/;
var styleObj, isVis;
// DOM compatible
if (doc && doc.defaultView && doc.defaultView.getComputedStyle) {
styleObj = doc.defaultView.getComputedStyle(el, null);
// MS compatible
} else if (el.currentStyle) {
styleObj = el.currentStyle;
}
// If either visibility == hidden || display == none
// then element is not visible
return !reVis.test(styleObj.visibility + ' ' + styleObj.display);
}