Есть функция wrap(узел, имя_тега [, сторона]):
var wrap = function(ie) {
return ie ? function(node, tag, side) {
return node.applyElement(document.createElement(tag), side);
} : function(node, tag, side) {
var range = document.createRange(), wrapper = document.createElement(tag);
range[side == 'inside' ? 'selectNodeContents' : 'selectNode'](node);
range.surroundContents(wrapper);
return wrapper;
};
}(/*@cc_on 1 @*/);
3-й параметр может быть «inside» или «outside» (по умолчанию).
Safari и Chrome почему-то ничего не делают, если используется метод selectNode, т.е. когда 3-й параметр не указан или имеет значение «outside».
Google выдает кучу ссылок на страницы, где написано что в Opera и Safari исправили какие-то баги, большинство еще 2006 года, связанные с selectNode, но что конкретно там не работало так и не нашел.
Решение конечно есть:
var wrap = function(ie) {
return ie ? function(node, tag, side) {
return node.applyElement(document.createElement(tag), side);
} : function(node, tag, side) {
var wrapper = document.createElement(tag);
if(side == 'inside') {
var range = document.createRange();
range.selectNodeContents(node);
range.surroundContents(wrapper);
}
else {
node.parentNode.insertBefore(wrapper, node);
wrapper.appendChild(node);
}
return wrapper;
};
}(/*@cc_on 1 @*/);
Но хотелось бы разобраться, что не так с selectNode, может-быть кто-нибудь решал подобную задачу? В каких версиях Firefox, Safari и Opera может быть ошибка при использовании selectNode, selectNodeContents и surroundContents в данном контексте?
-------------------
Еще выяснилось, что Opera очень медленно работает с этими методами