Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   реализация getText (https://javascript.ru/forum/offtopic/47031-realizaciya-gettext.html)

cyber 05.05.2014 22:43

реализация 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;

        }

    }

рони 05.05.2014 23:06

cyber,
так нет обхода всех элементов внутри искомого и что вернёт если ничего нет

Octane 05.05.2014 23:09

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

Цитата:

Сообщение от cyber
["textContent", "innerText", "data"]

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

melky 05.05.2014 23:28

Цитата:

Сообщение от cyber
зачем в jquery настолько длинная реализация?

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

А заодно и глянуть, как оно смотрелось в самом начале - при первичной реализации

Дзен-трансгуманист 06.05.2014 00:06

Node.textContent #Differences from innerText

cyber 06.05.2014 03:35

Цитата:

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

нигде не видел, что оно устаревшее

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

Цитата:

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

Сообщение от рони
и что вернёт если ничего нет

исправил

Цитата:

Сообщение от рони
так нет обхода всех элементов внутри искомого

это и не нужно http://jsfiddle.net/a7VbA/4/

cyber 06.05.2014 03:42

короче в итоге пришел к выводу что если не нужна поддержка древних ишаков (ие 8 -), то достаточно textContent и не нужно нечего городить:)

cyber 06.05.2014 03:44

Цитата:

Сообщение от Дзен-трансгуманист
Node.textContent #Differences from innerText

это только для ие меньше 9

Octane 06.05.2014 04:35

Цитата:

Сообщение от cyber
нигде не видел, что оно устаревшее

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

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

nerv_ 06.05.2014 11:00

Приведу реализацию "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

согласно реализации выше


Часовой пояс GMT +3, время: 10:09.