реализация 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, время: 13:07. |