سؤال

وبقدر ما استطيع ان اقول ليس هناك طريقة بسيطة لاسترجاع شخصية تعويض من كائن 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;
 }

[ المرجعي لfindText() ]

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top