Javascript textcontain获取所有html标记文本以及脚本标记文本

时间:2011-07-19 04:32:38

标签: javascript html

我的目标是计算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的标签?

1 个答案:

答案 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);
  }