validar quitar especiales escape codificacion caracteres acentos acento javascript html internet-explorer selection dhtml

javascript - quitar - Compensación de caracteres en Internet Explorer TextRange



quitar caracteres especiales javascript (4)

Puede iterar a través de la propiedad TextRange.text del elemento TextRange.text usando String.substring() para comparar con el TextRange para el que desea el desplazamiento del carácter.

function charOffset(textRange, parentTextRange) { var parentTxt = parentTextRange.text; var txt = textRange.text; var parentLen = parentTxt.length; for(int i=0; i < parentLen ; ++i) { if (parentTxt.substring(i, txt.length+i) == txt) { var originalPosition = textRange.getBookmark(); //moves back one and searches backwards for same text textRange.moveStart("character",-1); var foundOther = textRange.findText(textRange.text,-parentLen,1); //if no others were found return offset if (!foundOther) return i; //returns to original position to try next offset else textRange.moveToBookmark(originalPosition); } } return -1; }

[ Referencia para findText() ]

Por lo que puedo decir, no hay una forma sencilla de recuperar un desplazamiento de caracteres de un objeto TextRange en Internet Explorer. El objeto W3C Range tiene un nodo y el desplazamiento en el texto dentro de ese nodo. IE parece tener solo compensaciones de píxeles. Existen métodos para crear, extender y comparar rangos, por lo que sería posible escribir un algoritmo para calcular el desplazamiento del carácter, pero creo que me falta algo.

Entonces, ¿cuál es la forma más fácil de calcular el desplazamiento de caracteres del inicio de un TextRange de Internet Explorer?


Utilizo un método basado en este truco de posición de intercalación:

// Assume r is a range: var offsetFromBody = Math.abs( r.moveEnd(''character'', -1000000) );

Dado que moveEnd devuelve el número de caracteres realmente movidos, el desplazamiento ahora debe ser el desplazamiento desde el inicio del documento. Esto funciona bien para probar el movimiento primitivo de intercalación, pero para selecciones ampliadas y para obtener el nodo exacto que contiene el anclaje de rango, necesitará algo más complejo:

// where paramter r is a range: function getRangeOffsetIE( r ) { var end = Math.abs( r.duplicate().moveEnd(''character'', -1000000) ); // find the anchor element''s offset var range = r.duplicate(); r.collapse( false ); var parentElm = range.parentElement(); var children = parentElm.getElementsByTagName(''*''); for (var i = children.length - 1; i >= 0; i--) { range.moveToElementText( children[i] ); if ( range.inRange(r) ) { parentElm = children[i]; break; } } range.moveToElementText( parentElm ); return end - Math.abs( range.moveStart(''character'', -1000000) ); }

Esto debería devolver el desplazamiento correcto del texto de intercalación. Por supuesto, si ya conoce el nodo de destino o puede proporcionar un contexto, entonces puede omitir todo el lío de búsqueda de bucles.


Usé una solución ligeramente más simple usando los valores de compensación de un textRange:

function getIECharOffset() { var offset = 0; // get the users selection - this handles empty selections var userSelection = document.selection.createRange(); // get a selection from the contents of the parent element var parentSelection = userSelection.parentElement().createTextRange(); // loop - moving the parent selection on a character at a time until the offsets match while (!offsetEqual(parentSelection, userSelection)) { parentSelection.move(''character''); offset++; } // return the number of char you have moved through return offset; } function offsetEqual(arg1, arg2) { if (arg1.offsetLeft == arg2.offsetLeft && arg1.offsetTop == arg2.offsetTop) { return true; } return false; }


Sugeriría IERange , o simplemente el TextRange TextRange -to- DOM Range de él.

Actualización, 9 de agosto de 2011

Ahora sugeriría usar mi propia biblioteca Rangy , que tiene una idea similar a IERange pero mucho más completa y compatible.