كيفية العثور على التحديد في وثيقة HTML تحتوي على IFRAME أو إطارات فقط

StackOverflow https://stackoverflow.com/questions/808744

  •  03-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة للعثور على النص المحدد في وثيقة HTML إذا كان النص قد يكون ضمن واحدة من إطارات (أو نوافذ الأطر المدمجة)؟

إذا الوثيقة لا تحتوي على إطارات انها بسيطة:

var text;
if (document.getSelection) {
 // Firefox and friends
 text = document.getSelection();
} else if (document.selection) {
 // IE 
 text = document.selection.createRange();
}
if (text == undefined || text == '') {
 // Iterate over all textarea elements and see if one of them has selection
 var areas = document.getElementsByTagName('textarea');
 for(var i = 0; i = areas.length; i++) {
  if(areas[i].selectionStart != undefined && 
     areas[i].selectionStart != areas[i].selectionEnd){
   text = areas[i].value.substring(areas[i].selectionStart, a[i].selectionEnd);
   break;
  }   
 }   
}
// Now if document has selected text, it's in text

وهكذا هذا يعمل عبر متصفح (وإن لم يكن جميلة جدا).

والمشكلة هي عندما يحتوي المستند على الإطارات أو نوافذ الأطر المدمجة. إطارات لها ثيقة خاصة بها، وذلك فقط باستخدام التعليمات البرمجية أعلاه ليست كافية. يمكن للمرء أن يحتمل تكرار فوق الشجرة إطارات والبحث عن النص المحدد في واحدة منها، ولكن في الأطر العامة يمكن أن يكون المحتوى من مختلف المجالات، وذلك حتى إذا كان لي أن أعاد على جميع الأطر وعلى جميع نقالة وغيرها من جذر المستند بحثا النص المحدد I لم يكن لديها إذن للوصول HTML الخاصة، أليس كذلك؟ ولذا فإنني لن تكون قادرة على الحصول على نصوصها المختارة.

هل هناك (بسيطة) وسيلة يمكن الاعتماد عليها لإيجاد النص المحدد على صفحة ويب حتى لو كانت الصفحة تحتوي على إطارات؟

والشكر

هل كانت مفيدة؟

المحلول

لإجابة على سؤالي الخاص، بعد أكثر قليلا من التحقيق: لذلك، إذا كانت الإطارات هي من المجالات المختلفة ثم لا يوجد شيء يمكنك القيام به حيال ذلك منذ لم يكن لديك إذن الوصول دوم بهم. ومع ذلك، في الحالة العامة حيث كل الإطارات في نفس المجال (مثل جوجل) مجرد موضوع تكرار كل مثل شجرة. وفيما يلي التعليمات البرمجية التي يحقق ما يلي:

ورمز أدناه هو لبووكمركلت أن تحصي حرف وكلمات النص المحدد:

javascript:(function(){
  // Function: finds selected text on document d.
  // @return the selected text or null
  function f(d){
    var t;
    if (d.getSelection) t = d.getSelection();
    else if(d.selection) t = d.selection.createRange();
    if (t.text != undefined) t = t.text;
    if (!t || t=='') {
      var a = d.getElementsByTagName('textarea');
      for (var i = 0; i < a.length; ++i) {
        if (a[i].selectionStart != undefined && a[i].selectionStart != a[i].selectionEnd) {
          t = a[i].value.substring(a[i].selectionStart, a[i].selectionEnd);
          break;
        }
      }
    }
    return t;
  };
  // Function: finds selected text in document d and frames and subframes of d
  // @return the selected text or null
  function g(d){
    var t;
    try{t = f(d);}catch(e){};
    if (!t || t == '') {
      var fs = d.getElementsByTagName('frame');
      for (var i = 0; i < fs.length; ++i){
        t = g(fs[i].contentDocument);
        if(t && t.toString() != '') break;
      }
      if (!t || t.toString() == '') {
        fs = d.getElementsByTagName('iframe');
        for (var i = 0; i < fs.length; ++i){
          t = g(fs[i].contentDocument);
          if(t && t.toString() != '') break;
        }
      }
    }
    return t;
  };
  var t= g(document);
  if (!t || t == '') alert('please select some text');
  else alert('Chars: '+t.toString().length+'\nWords: '+t.toString().match(/(\S+)/g).length);
})()

نصائح أخرى

وRan إجابة ممتازة لسؤالك. ومع ذلك، إذا كان غير معرفة وثيقة الإطار من ثم تفشل الوظيفة. أضفت مشروطة للتحقق من هذا، والآن يعمل على كل موقع حاولت بما في ذلك Gmail. if ((!t || t == '') && d) شكرا مرة أخرى لرمز كبير.

var getSelectedText = function(){
  // Function: finds selected text on document d.
  // @return the selected text or null
  function f(d){
    var t;
    if (d.getSelection) t = d.getSelection();
    else if(d.selection) t = d.selection.createRange();
    if (t.text != undefined) t = t.text;
    if (!t || t=='') {
      var a = d.getElementsByTagName('textarea');
      for (var i = 0; i < a.length; ++i) {
        if (a[i].selectionStart != undefined && a[i].selectionStart != a[i].selectionEnd) {
          t = a[i].value.substring(a[i].selectionStart, a[i].selectionEnd);
          break;
        }
      }
    }
    return t;
  };
  // Function: finds selected text in document d and frames and subframes of d
  // @return the selected text or null
  function g(d){
    var t;
    try{t = f(d);}catch(e){console.log('ERROR: ',e);};
    if ((!t || t == '') && d){
      var fs = d.getElementsByTagName('frame');
      for (var i = 0; i < fs.length; ++i){
        t = g(fs[i].contentDocument);
        if(t && t.toString() != '') break;
      }
      if (!t || t.toString() == '') {
        fs = d.getElementsByTagName('iframe');
        for (var i = 0; i < fs.length; ++i){
          t = g(fs[i].contentDocument);
          if(t && t.toString() != '') break;
        }
      }
    }
    return t;
  };
  var t= g(document);
  if (!t || t == '') ;
  else return t.toString();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top