Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:

Error. Page cannot be displayed. Please contact your service provider for more details. (14)


Своя реализация innerText для всех браузеров

Поиск:
Иногда требуется достать текстовое содержимое ноды. В ИЕ и Опере есть не описанное в спецификации от W3C поле innerText через которое можно достать/установить текст из/в ноды(у). В Мозиллоподобных браузерах и просто экзотических такого поля нет. Согласно идее от W3C можно пробежатся по списку нод и самому собрать содержимое, что мы и сделаем:
HTML
<div id="test">This <span style="color:red">is</span>&nbsp;<span style="background-color: #7495f6; color: #0b451b; font-weight: bold">a <a href="#">Test</a></span></div>

Код
/**
* Функция достает текстовое содержимое любой ноды. Текстом будем считать
* текстовые ноды и элементы, которые опрашиваем рекурсивно.
*/
function innerText(node) {
//  return node.innerText; //хорошая вещь в ИЕ
//  return node.innerHTML; //из стадарта W3C, но не совсем то что нужно
 var ret = "";
 for(var i=0; i<node.childNodes.length; i++) {
    switch(node.childNodes[i].nodeType) {
   case 1: ret+=innerText(node.childNodes[i]); break; //если элемент
   case 3: ret+=node.childNodes[i].nodeValue; //если текстовая нода
 }
 }
 return ret;
}
alert(innerText(document.getElementById("test")));


Решение рабочее, можно использовать под любым браузером. Но можно пойти дальше, используя механизм getter/setter Мозиллоподобных можно определить свойства для нод:
Код

/*
* Ниже мы используем особый механизм геттеров/сеттеров берущих свои корни еще
* с нетскейповских времён.
*/
//избавляемся от глючной но поддерживающей innerText Оперы
//бродилка имеет Node, но не имеет Node.prototype - бред... =/
if(typeof(Node)!="undefined"&&typeof(Node.prototype)!="undefined"&&typeof(Node.prototype.__defineGetter__)=="function") {  Node.prototype.__defineGetter__("innerText", function()
 {
    var ret = "";
    for(var i=0; i<this.childNodes.length; i++) {
       switch(this.childNodes[i].nodeType) {
         case 1: ret+=this.childNodes[i].innerText; break; //если элемент
      case 3: ret+=this.childNodes[i].nodeValue; break; //если текст
    }
    } return ret;
 });
 
 Node.prototype.__defineSetter__("innerText", function(val)
 {
//и не пытайтесь использовать removeChild, Мозиллу глючит по чёрному
//уж лучше так... через innerHTML =/
   this.innerHTML=""; //очищяем содержимое
   this.appendChild(document.createTextNode(val));
 });
}

var a=document.getElementById("test");
alert(a.innerText);
a.innerText="Vingrad";

Заметим что кот будет работать хорошо только в Опере, ИЕ и Мозилле, так как первые два проигнорируют конструцию, а Мозилла получит новое свойство в интерфейс нод. Особые экзотические браузеры возможно работать не будут, но это не страшно, т.к. 95% народа мы удовлетворим :)

Добавленно:
Упс, я проглядел свойство textContent у нод в Мозилле, надобность в моём коде отпала ;-)
Автор: Sardar






Просмотров: 3721

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную