#javascript
#javascript
Вопрос:
Я даже не уверен, как назвать то, что я хочу. Итак, позвольте мне объяснить это, приведя пример.
В то время как Firefox использует textContent , другие браузеры поддерживают свойство innerText. Кстати, пожалуйста, поправьте меня, если я использую неправильную терминологию. В любом случае, пока все в порядке. Но я хочу что-то вроде следующего:
document.getElementById(id).iText = "blablabla"
//or
var x = document.getElementById(id).iText;
//where iText is something like:
if(e.innerText) return innerText;
else return textContent;
Я не хочу использовать функцию для этого материала. Также, пожалуйста, скажите мне название этой «вещи», если она существует, поскольку я с ней не знаком.
Комментарии:
1. Ах да, жестокая любовница… у него много имен, в зависимости от того, откуда вы родом. Я из jQuery , и это называется .text() . В обычном JS вы всегда можете использовать
var x=document.body.innerText?document.getElementById(id).innerText:document.getElementById(id).textContent;
2. Да, я знаю это, но поскольку я буду ссылаться много раз и с разными идентификаторами, я не хочу проверять это все время. Я хочу создать свойство, которое является кроссбраузерным. И, по-видимому, до сих пор лучшим ответом является ответ Энди.
Ответ №1:
Если вам нужно обратиться к innerText
или textContent
несколько раз, вы можете сделать что-то вроде этого:
// Check which is supported:
var textProp = "textContent" in document.body ? "textContent" : "innerText";
// And when you need it:
var text = document.getElementById("myId")[textProp];
Комментарии:
1. @Shaokan: Нет проблем. Не забывайте, что между
innerText
иtextContent
есть некоторые небольшие различия 🙂2. Да, я знаю 🙂 но мне нужен текст внутри paragraph, и innerHTML не отклоняет их. Поскольку Firefox не использует innerText, самое близкое к тому, что я хочу, — это textContent 🙂 Еще раз спасибо
Ответ №2:
В общем, то, что вам нужно, называется «получателями» (а для установки текста — «установщиками»). Документацию см., например, в MDC
На DOM-узлах IE ненадежно поддерживает добавление таких свойств (по крайней мере, до IE8, см. Этот документ MSDN). Однако Webkit (Chrome) и Gecko (Firefox), похоже, с радостью позволят вам модифицировать прототипы DOM. Что оставляет вас с:
try {
if (!('innerText' in HTMLElement.prototype)) {
HTMLElement.prototype.__defineGetter__("innerText", function() { return this.textContent; });
}
} catch (ex) {/*uh oh*/}
Вы могли бы использовать аналогичный синтаксис для определения установщика:
HTMLElement.prototype.__defineSetter__("innerText", function(newVal) { return this.textContent = newVal; });
Хотя это может сработать, я бы все же настоятельно рекомендовал использовать библиотеку по вашему выбору (jQuery, Prototype, MooTools, YUI, что угодно) для такого рода вещей. Конечно, вы можете заставить подобные вещи работать самостоятельно, но в большинстве случаев ваши усилия лучше потратить на написание вашего реального приложения.
Комментарии:
1. Большое спасибо. Несмотря на то, что ответ Энди был самым близким к вашему ответу, я переношу правильный ответ от него к вам, поскольку вы отлично ответили на мой вопрос 🙂 Это было именно то, что я искал.
2. @Shaokan, Gijs: обратите внимание, что
__defineSetter__
и__defineGetter__
оба являются нестандартными и могут не определяться в браузерах, которые поддерживаютtextContent
только; например, в веб-браузере BlackBerry. В будущем он также может быть удален из некоторых браузеров в пользу стандартногоObject.defineProperty()
метода.
Ответ №3:
Внедрите jQuery, а затем просто используйте $('#' id).text()
.
Это единственный правильный способ. В то время как JavaScript позволяет вам определять свойства, у которых есть средство получения, расширение объектов хоста (а узлы DOM являются объектами хоста) может привести к неопределенному поведению.
Комментарии:
1. Спасибо за ответ, чувак, но я тоже не хочу использовать jQuery 🙂
2. Тогда вам придется остаться с уродливым кодом, который возвращает любое свойство, имеющее значение.
Ответ №4:
Не уверен, какую «вещь» вы имеете в виду, но вы можете использовать логическое ИЛИ для извлечения текста:
var text = x.textContent || x.innerText;
Это возвращает, x.innerText
если x.textContent
не определено (и x.textContent
если оно определено). Это очень распространенный ярлык.
Назначение немного сложнее, и я даже не уверен, можно ли назначить этим свойствам. Однако, если вы сможете, то это будет иметь тот же эффект, что и присвоение innerHTML
(кроме, возможно, рендеринга HTML), а именно замена всего содержимого заданной строкой.
Но innerHTML
поддерживается в каждом браузере и, следовательно, проще в использовании.
Комментарии:
1. Да, я не уверен ни в том, что это за «вещь». Я не уверен, даже если он существует, лол. Вот почему я не знаю, как спросить 🙂
2. Вероятно, более уместно использовать его
innerText
в качестве запасного варианта, поскольку между ним иtextContent
и всеми основными версиями браузера edge сейчас есть небольшие различия, которые поддерживаютtextContent
.3. @AndyE: Да, на самом деле я больше не был уверен в порядке … обновлено.
Ответ №5:
либо вам нравится
var x = elem.innerText || elem.textContent || "";
или просто используйте jquery и позвольте ему обрабатывать это за вас
var x = $('myElement').text();