Текстовое содержимое Firefox не соответствует внутреннему тексту Chrome - PullRequest
4 голосов
/ 08 июня 2011

Поскольку Firefox не имеет innerText, я использую textContent для получения текста тела документа. Однако textContent возвращает что-либо внутри тегов noscript и script, которые находятся в теле (и, возможно, другие теги, я не совсем уверен), что означает, что textContent будет выглядеть иначе, чем обычно возвращается innerText.

Есть ли в Firefox эквивалент, который возвращает тот же вывод, что и функция Chrome innerText?

Ответы [ 5 ]

4 голосов
/ 08 июня 2011

Редактировать

Включен фильтр, чтобы не получать содержимое определенных элементов

Это два разных свойства - одно определено в W3C DOM 3 Core , другое - собственность Microsoft , которая была широко скопирована, но не имеет открытой спецификации.

Вероятно, лучший способ нормализовать два - не использовать их, вместо этого используйте процедуру ходьбы по DOM, которая собирает текстовые узлы и создает строку. Используйте одну и ту же процедуру для обоих (всех) браузеров.

// Get the text within an element
// Doesn't do any normalising, returns a string
// of text as found.
function getText(element) {
  var text = [];
  var self = arguments.callee;
  var el, els = element.childNodes;
  var excluded = {
    'noscript': 'noscript',
    'script'  : 'script'
  };

  for (var i=0, iLen=els.length; i<iLen; i++) {
    el = els[i];

    // May need to add other node types here
    if ( el.nodeType == 1 && 
       !(el.tagName.toLowerCase() in excluded)) {
      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('');
}
1 голос
/ 08 июня 2011

Смотрите это:

http://www.davidtong.me/innerhtml-innertext-textcontent-html-and-text/

Как правило, вы можете использовать метод text () jQuery, или, если вам также нужны разрывы строк, у него есть собственный код плагина для этого URL.

Всякий раз, когда два браузера отличаются, я бы посоветовал вам изучить jQuery в качестве решения.

0 голосов
/ 20 августа 2015

Я использовал решение, которое работало как для Chromium, так и для Firefox в Linux, было решение проблемы childNodes объекта.Каждый из узлов имеет действительное свойство textContent, которое возвращает только текст:

var element = document.getElementById(element_id);

// here element_id is an element which contains text, then
// a child <p> whose text will be used for something else.
// e.g. <li>string1<p>string2</p></li>

var first = element.childNodes[0].textContent; // string1
var second = element.childNodes[1].textContent; // string2

Конечно, это необходимо подтвердить в мобильных браузерах, т.е. IE * shudder * и версии {альфа .. омега}, но это только начало.

0 голосов
/ 02 января 2012

, если вы хотите сделать браузер независимым, используйте этот код

var field = document.getElementById(id);  // where u want to use innertext

if(field != null)
{
     if(navigator.appName == "Netscape") // appName for both FireFox and Chrome its is "Netscape" i checked it with different version.
           field.textContent = value;
     else // for For IE v 8 i checked  .textContent is not supported by IE for me it was not working.
           field.innerText = value;
}
0 голосов
/ 08 июня 2011
function deepText(node) {
    var A= [];
    if(node) {
        node= node.firstChild;
        while(node!= null) {
            if(node.nodeType== 3) {
                if(/\S/.test(node.data)) A[A.length] = node.data;
            }
            else A = A.concat(deepText(node));
            node = node.nextSibling;
        }
    }
    return A;
}
alert(deepText(document.body));
...