如果文本可能位于 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,对吧?所以我无法获得他们选择的文本。
即使页面包含框架,是否有一种(简单)可靠的方法可以在网页上查找所选文本?
Thanks
经过更多调查后回答我自己的问题:
因此,如果框架属于不同的域,那么您无能为力,因为您没有访问它们的 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);
})()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)