Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.05.2014, 22:43
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

реализация getText
в jQuery функция getText реализована так

getText = Sizzle.getText = function( elem ) {
	var node,
		ret = "",
		i = 0,
		nodeType = elem.nodeType;

	if ( !nodeType ) {
		// If no nodeType, this is expected to be an array
		while ( (node = elem[i++]) ) {
			// Do not traverse comment nodes
			ret += getText( node );
		}
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
		// Use textContent for elements
		// innerText usage removed for consistency of new lines (jQuery #11153)
		if ( typeof elem.textContent === "string" ) {
			return elem.textContent;
		} else {
			// Traverse its children
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
				ret += getText( elem );
			}
		}
	} else if ( nodeType === 3 || nodeType === 4 ) {
		return elem.nodeValue;
	}
	// Do not include comment or processing instruction nodes

	return ret;
};


у меня получилось так, работает во всех браузерах, что я упустил, зачем в jquery настолько длинная реализация?

function getText ( elem ) {

        var props = ["textContent", "innerText", "data"],
            text;

        for( var i = 0; i < props.length; i++ ){

            if( (text = elem[props[i]]) !== undefined )
                return text;

        }

    }
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #2 (permalink)  
Старый 05.05.2014, 23:06
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

cyber,
так нет обхода всех элементов внутри искомого и что вернёт если ничего нет
Ответить с цитированием
  #3 (permalink)  
Старый 05.05.2014, 23:09
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Ну вон там комментарий, что innerText коверкает переходы на новую строку. Хотел подробнее почитать про этот баг #11153, но не нашел закладку issues на странице проекта в GitHub

Сообщение от cyber
["textContent", "innerText", "data"]
Могу ошибаться, но вроде data deprecated, надо использовать nodeValue
Ответить с цитированием
  #4 (permalink)  
Старый 05.05.2014, 23:28
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от cyber
зачем в jquery настолько длинная реализация?
мб всё это результат багфиксов.
Ты можешь выяснить, что и куда там менялось, с помощью команды git.

А заодно и глянуть, как оно смотрелось в самом начале - при первичной реализации
Ответить с цитированием
  #5 (permalink)  
Старый 06.05.2014, 00:06
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Node.textContent #Differences from innerText
__________________

Гейзенберг, возможно, читал этот тред.
Ответить с цитированием
  #6 (permalink)  
Старый 06.05.2014, 03:35
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от Octane
Могу ошибаться, но вроде data deprecated, надо использовать nodeValue
нигде не видел, что оно устаревшее

http://learn.javascript.ru/basic-dom...го-узла

Цитата:
Свойство nodeValue=null для узла SCRIPT, так как это узел-элемент. А вот data=undefined. Это единственное различие в поведении этих свойств.
Сообщение от рони
и что вернёт если ничего нет
исправил

Сообщение от рони
так нет обхода всех элементов внутри искомого
это и не нужно http://jsfiddle.net/a7VbA/4/
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #7 (permalink)  
Старый 06.05.2014, 03:42
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

короче в итоге пришел к выводу что если не нужна поддержка древних ишаков (ие 8 -), то достаточно textContent и не нужно нечего городить
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #8 (permalink)  
Старый 06.05.2014, 03:44
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 17.12.2011
Сообщений: 4,415

Сообщение от Дзен-трансгуманист
Node.textContent #Differences from innerText
это только для ие меньше 9
__________________
Цитата:
Если ограничения и условия описываются как "коробка", то хитрость в том что бы найти именно коробку... Не думайте о чем то глобальном - найдите коробку.
Ответить с цитированием
  #9 (permalink)  
Старый 06.05.2014, 04:35
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от cyber
нигде не видел, что оно устаревшее
Кажется на MDN такую пометку видел, но сейчас не нашел, но в Firefox и IE:

data – это геттер в Text.prototype.__proto__, а nodeValue – геттер в Node.prototype, так как
Text.prototype instanceof Node → true
то чтобы охватить больше видов узлов, лучше использовать nodeValue

Последний раз редактировалось Octane, 06.05.2014 в 04:50.
Ответить с цитированием
  #10 (permalink)  
Старый 06.05.2014, 11:00
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Приведу реализацию "getText" из ангуляра:
text: (function() {
    var NODE_TYPE_TEXT_PROPERTY = [];
    if (msie < 9) {
        NODE_TYPE_TEXT_PROPERTY[1] = 'innerText';     /** Element **/
        NODE_TYPE_TEXT_PROPERTY[3] = 'nodeValue';    /** Text **/
    } else {
        NODE_TYPE_TEXT_PROPERTY[1] =                      /** Element **/
        NODE_TYPE_TEXT_PROPERTY[3] = 'textContent';  /** Text **/
    }
    getText.$dv = '';
    return getText;

    function getText(element, value) {
        var textProp = NODE_TYPE_TEXT_PROPERTY[element.nodeType];
        if (isUndefined(value)) {
            return textProp ? element[textProp] : '';
        }
        element[textProp] = value;
    }
})()

Иными словами, если IE<9 не нужен, достаточно
element.textContent

согласно реализации выше
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 06.05.2014 в 11:02.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стандартная реализация forEach okouser Общие вопросы Javascript 4 24.12.2013 16:55
Реализация игрового поля для игры "Точки" last-art Events/DOM/Window 7 22.04.2012 03:18
реализация хитрого банера с помощью js seleve Элементы интерфейса 6 17.08.2010 15:08
Реализация "Удалить"..."Восстановить" как вконтакте.ру Darooma2 AJAX и COMET 10 26.05.2010 13:41
Реализация слайдера Vitaly jQuery 15 27.08.2009 23:27