编程语言
首页 > 编程语言> > javascript – 如何在HTML文档中查找包含iframe或仅包含框架的选择

javascript – 如何在HTML文档中查找包含iframe或仅包含框架的选择

作者:互联网

如果文本可能位于其中一个框架(或iframe)中,是否有办法在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

所以这适用于跨浏览器(虽然不是很漂亮).

问题是当文档包含框架或iframe时.
框架有自己的文档,所以仅使用上面的代码是不够的.
人们可能会迭代帧树并在其中一个中搜索所选文本,但是一般情况下帧​​可以包含来自不同域的内容,所以即使我要遍历所有帧以及搜索根文档的所有子帧等所选文本我没有权限访问他们的HTML,对吧?所以我无法得到他们选择的文字.

即使页面包含框架,是否有(简单)可靠的方法在网页上查找所选文本?

谢谢

解决方法:

经过一番调查后回答我自己的问题:
因此,如果框架属于不同的域,那么由于您没有访问其dom的权限,因此您无法做任何事情.但是,在所有帧都位于同一域(例如gmail)的常见情况下,只需像树一样迭代主题.这是完成该任务的代码:

下面的代码用于计算所选文本的字符和单词的书签:

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);
})()

标签:javascript,dhtml,iframe,html
来源: https://codeday.me/bug/20190701/1344868.html