Javascript-форум (https://javascript.ru/forum/)
-   Opera, Safari и др. (https://javascript.ru/forum/css-html-browser/)
-   -   selectNode и surroundContents в Safari (https://javascript.ru/forum/css-html-browser/2469-selectnode-i-surroundcontents-v-safari.html)

Octane 30.12.2008 12:17

selectNode и surroundContents в Safari
 
Есть функция 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 очень медленно работает с этими методами :(


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