Предварительно ES5 Object.defineProperty: псевдоним textContent для innerText - PullRequest
0 голосов
/ 20 января 2019

Я тестирую поведение различных браузеров, начиная с 2004 года. Некоторые не поддерживают свойство textContent элементов DOM. Этот ответ показывает элегантное решение, которое работает на IE8, но, к сожалению, не на более ранних версиях IE и не на Opera 8.5.Есть ли альтернатива, которая не требует Object.defineProperty и не использует __defineGetter__, __defineSetter__, поскольку они также не поддерживаются в Opera 8.5.?

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

function setTextContent(el,s) {
    if (typeof el.textContent === 'undefined') {
        el.innerText = s;
    } else {
        el.textContent = s;
    }
}

и аналогично для его получения.

РЕДАКТИРОВАТЬ:

Как предложил @LeroyStav, можно использовать document.createTextNodeустановить текстовое содержание.Он не предоставляет альтернативы для получения текстового содержимого, но если элемент с вновь созданным текстовым узлом не имеет дочерних элементов, innerHTML вернет то же самое.Это работает в IE7 и Opera 8.5, которые являются самыми старыми из протестированных мной:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <script charset="utf-8">
      window.onload = function () {
        var t = document.createTextNode('<'+'script>alert("foo")<'+'/script>');
        var cont = document.getElementById('foo'); // set the text content
        cont.appendChild(t);
        alert(cont.innerHTML); // get the text content (if no children)
      }
    </script>
  </head>
  <body>
    <div id='foo'></div>
  </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...