реализация 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; } } |
cyber,
так нет обхода всех элементов внутри искомого и что вернёт если ничего нет |
Ну вон там комментарий, что innerText коверкает переходы на новую строку. Хотел подробнее почитать про этот баг #11153, но не нашел закладку issues на странице проекта в GitHub :blink:
Цитата:
|
Цитата:
Ты можешь выяснить, что и куда там менялось, с помощью команды git. А заодно и глянуть, как оно смотрелось в самом начале - при первичной реализации |
|
Цитата:
http://learn.javascript.ru/basic-dom...го-узла Цитата:
Цитата:
Цитата:
|
короче в итоге пришел к выводу что если не нужна поддержка древних ишаков (ие 8 -), то достаточно textContent и не нужно нечего городить:)
|
Цитата:
|
Цитата:
data – это геттер в Text.prototype.__proto__ , а nodeValue – геттер в Node.prototype , так как Text.prototype instanceof Node → trueто чтобы охватить больше видов узлов, лучше использовать nodeValue |
Приведу реализацию "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. |