Hola people, he logrado algo en Mozilla, el problemático ahora es Internet Explorer, de este solo me interesa a partir de la versión 7.
Aquí dejo el código para el buen Mozilla, si ven alguna variante mejor o algo para el IE se los agradecería.
function getTextSelection() {
if(document.selection)
return document.selection;
else if(window.getSelection)
return window.getSelection();
else if(document.getSelection)
return document.getSelection();
else
return false;
}
function getSelectionRange() {
var selection = getTextSelection();
if(selection.getRangeAt)
return selection.getRangeAt(0);
else if (selection.createRange)
return selection.createRange();
else
return false;
}
function getSelectionParent(r) {
if(r.parentElement)//IE
return r.parentElement();
else if(r.commonAncestorContainer)//MOZ
return r.commonAncestorContainer;
else
return false;
}
function SplitNode(node, begin, end){
if(parseInt(begin)!=-1){
var spannode = document.createElement('span');
spannode.className='highlight';
var middlebit = node.splitText(begin);
if(parseInt(end)==-1){
end=middlebit.nodeValue.length;
}
var endbit = middlebit.splitText(end);
var middleclone = middlebit.cloneNode(true);
spannode.appendChild(middleclone);
if(spannode.innerHTML!='')
middlebit.parentNode.replaceChild(spannode, middlebit);
}else{//nodo completo
var copia = node.cloneNode(false);
var spannode = document.createElement('span');
spannode.className='highlight';
spannode.innerHTML=node.innerHTML;
copia.appendChild(spannode);
node.parentNode.replaceChild(copia, node);
}
}
function CrearSpanMO(hijos){
inicio=getTextSelection().anchorOffset;
fin=getTextSelection().focusOffset;
for(i=0;i<hijos.length;i++)
{
/*
var contenido=getTextSelection().createRange();
//alert(contenido)
var temp=document.body.createTextRange();
//var span=document.getElementById('222');
//alert(hijos[i].childNodes.length)
temp.moveToElementText(hijos[i]);
alert(hijos[i].childNodes[0].nodeType)
alert(contenido.inRange(temp))
if(contenido.inRange(temp))
SplitNode(hijos[i].childNodes[0], 0, -1, conf_selection)
*/
if(!(((hijos[i].nodeType == 3 && !/\S/.test(hijos[i].nodeValue)))||(hijos[i].nodeType==

)||!(((hijos[i].nodeType == 3 && !/\n/.test(hijos[i].nodeValue)))||(hijos[i].nodeType==

))//(hijos[i].innerHTML)||(hijos[i].nodeType==3&&ComprobarSaltos(hijos[i].nodeValue)))
{
var es_nodo_inicio=getTextSelection().anchorNode==hijos[i];
var es_nodo_fin=getTextSelection().focusNode==hijos[i];
if(getTextSelection().containsNode(hijos[i], false) && !es_nodo_inicio && !es_nodo_fin && hijos[i].className!='highlight')//devuelve true si el nodo completo esta en la seleccion
{
//alert('completo');
if(hijos[i].nodeType==3){
SplitNode(hijos[i], 0, -1, conf_selection);
}
else
{
if(!(hijos[i].childNodes.length==1 && hijos[i].childNodes[0].className=='highlight')){
SplitNode(hijos[i], -1, -1, conf_selection);
}
}
}
else if(getTextSelection().containsNode(hijos[i], true))//devuelve true si una parte del nodo esta en la seleccion
{
//alert('es una parte');
if(es_nodo_inicio&&es_nodo_fin){
//alert('es el nodo inicio y fin')
SplitNode(hijos[i], inicio, fin-inicio, conf_selection);
}
else if(es_nodo_inicio){
//alert('es el nodo de inicio');
SplitNode(hijos[i], inicio, -1, conf_selection);
}
else if(es_nodo_fin){
//alert('es el nodo de fin');
SplitNode(hijos[i], 0, fin, conf_selection);
}
else{
//agregar hijos
var y=hijos.length;
for(x=0;x<hijos[i].childNodes.length;x++)
{
if(!(hijos[i].className) || hijos[i].className!='highlight'){
hijos[hijos.length]=hijos[i].childNodes[x];
y++;
}
}
}
}
}
}
}
function Marcar()
{
var padre=getSelectionParent(getSelectionRange());
//var hijos=padre.childNodes;
var array_hijos=new Array();
array_hijos[0]=padre;
if(document.selection)
CrearSpanIE(array_hijos);
else if(window.getSelection)
CrearSpanMO(array_hijos);
}