شخصية تعويض في مستكشف TextRange الإنترنت
-
03-07-2019 - |
سؤال
وبقدر ما استطيع ان اقول ليس هناك طريقة بسيطة لاسترجاع شخصية تعويض من كائن TextRange في Internet Explorer. الكائن W3C المدى لديه عقدة، والإزاحة في النص ضمن تلك العقدة. يبدو IE أن يكون مجرد إزاحة بكسل. هناك طرق لإنشاء وتوسيع ومقارنة نطاقات، لذلك سيكون من الممكن كتابة خوارزمية لحساب الطابع عوض، ولكن أشعر أنني يجب أن يكون في عداد المفقودين شيء.
وهكذا، ما هي أسهل طريقة لحساب شخصية إزاحة بداية اكسبلورر TextRange الإنترنت؟
المحلول
وأنا أقترح IERange أو مجرد خوارزمية TextRange
إلى DOM Range
من ذلك.
تحديث، 9 أغسطس 2011
ويهمني الآن أقترح استخدام بلدي مكتبة رشيق السيقان ، الذي يشبه في فكرة ل IERange لكن الكثير تتحقق بشكل كامل ودعمها.
نصائح أخرى
وأنا استخدم طريقة بناء على هذه الخدعة موقف الإقحام:
// Assume r is a range:
var offsetFromBody = Math.abs( r.moveEnd('character', -1000000) );
ومنذ moveEnd إرجاع عدد الأحرف انتقلت فعلا، ويقابل ينبغي الآن الإزاحة من بداية الوثيقة. هذا يعمل بشكل جيد لاختبار حركة الإقحام البدائية، ولكن لتشكيلة موسعة وللحصول على عقدة الدقيقة التي تحمل مرساة النطاق الذي سوف تحتاج إلى شيء أكثر تعقيدا:
// 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) );
}
وهذا يجب إرجاع النص الإقحام الصحيح الإزاحة. بالطبع، إذا كنت تعرف العقدة الهدف بالفعل، أو هي قادرة على توفير السياق، ثم يمكنك تخطي بحث حلقات كله فوضى.
وأنا استخدم الحل أسهل قليلا باستخدام القيم تعويض من 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;
}
ويمكنك تكرار خلال خاصية TextRange.text
العنصر الأساسي باستخدام String.substring()
لمقارنة ضد TextRange التي تريد الطابع الإزاحة.
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;
}