Javascript 如何在包含iframe或仅包含框架的HTML文档中查找所选内容

Javascript 如何在包含iframe或仅包含框架的HTML文档中查找所选内容,javascript,html,dhtml,iframe,Javascript,Html,Dhtml,Iframe,如果文本可能位于HTML文档的某个框架(或iFrame)内,是否有方法在HTML文档中查找所选文本 如果文档没有框架,则很简单: var text; if (document.getSelection) { // Firefox and friends text = document.getSelection(); } else if (document.selection) { // IE text = document.selection.createRange(); } if (

如果文本可能位于HTML文档的某个框架(或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)上,只需像树一样迭代主题即可。下面是实现以下功能的代码:

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

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:(函数(){
//功能:查找文档d上的选定文本。
//@返回所选文本或null
函数f(d){
变量t;
如果(d.getSelection)t=d.getSelection();
如果(d.selection)t=d.selection.createRange(),则为else;
如果(t.text!=未定义)t=t.text;
如果(!t | | t==“”){
var a=d.getElementsByTagName('textarea');
对于(变量i=0;i
@为您自己的问题提供了极好的答案。但是,如果iframe文档未定义,则函数将失败。我添加了一个条件来检查这一点,现在它在包括Gmail在内的所有我尝试过的网站上都能正常工作<代码>如果(!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();
}
var getSelectedText=function(){
//功能:查找文档d上的选定文本。
//@返回所选文本或null
函数f(d){
变量t;
如果(d.getSelection)t=d.getSelection();
如果(d.selection)t=d.selection.createRange(),则为else;
如果(t.text!=未定义)t=t.text;
如果(!t | | t==“”){
var a=d.getElementsByTagName('textarea');
对于(变量i=0;i