西红柿爱番茄

Feed Rss

获取文档选取的文本

12.24.2009, Javascript, by .

近日写了一个获取文档选择文本的封装的对象Range,这可是使得获取文档的文本非常的方便,在某些应用中可以用到(比如爱词霸网站的划词翻译的功能,划词搜索功能,划词赋值功能等等)它兼容现在流行的浏览器(FF,Opera,Safari,Google Chrome,IE6及以上版本),操作方式如下:

[javascript]
Range.callback = function(){
alert(Range.text);
}
[/javascript]

只需要调用Range的callback方法,在该方法内调用执行Range的text属性,就可以获取已选择的文本,同时Range对象支持在iframe中获取选择的内容。测试页面。下面提供Range的源码:


[javascript]
(function(){
var global = this;
//获取Range的开始index,在FF等浏览器下支持
function getSelectionStart(o){
return o.selectionStart;
};
//获取Range的结束index,在FF等浏览器下支持
function getSelectionEnd(o){
return o.selectionEnd;
};
//获取选择的文本
function getRangeText(doc, el){
var text = "";
//如果是text或者textarea控件
if ((el.nodeName.toLowerCase() === "input" || el.nodeName.toLowerCase() === "textarea") && document.getSelection) {
s = getSelectionStart(el);
end = getSelectionEnd(el);
text = el.value.slice(s, end);
}
else {
if (doc.getSelection) { //IE
text = doc.getSelection() || doc.getSelection();
}
else
if (doc.selection.createRange) {
text = doc.selection.createRange().text;
}
}
return text;
};
//判断是否有iframe框架
function hasIframe(){
return document.getElementsByTagName("iframe").length > 0;
}
//获取全部iframe框架引用
function getIframeObject(){
var iframes = document.getElementsByTagName("iframe");
var docs = [];
//跨浏览器
for (var i = 0; iframes[i]; i++) {
var doc = iframes[i].document;
if (iframes[i].contentDocument) {
doc = iframes[i].contentDocument;
}
else
if (iframes[i].contentWindow.document) {
doc = iframes[i].contentWindow.document;
}
docs.push(doc);
}
return docs;
}
//添加事件
function addEvent(elem, t, handler){
if (elem.addEventListener) {
elem.addEventListener(t, handler, false);
}
else
if (elem.attachEvent) {
elem.attachEvent("on" + t, handler);
}
}
//声明Range对象
!global.Range ? global.Range = {} : null;
//mouseup事件的回调函数
function handler(doc, e){
var text = "";
var el = e.target || e.srcElement;
text = getRangeText(doc, el);
if (text == "")
return;
Range.text = text;
Range.callback();
}
addEvent(window, "load", function(e){
//本文档的document的mouseup事件驱动程序
var evt = function(e){
handler(document, e);
};
addEvent(document, "mouseup", evt);
//如果存在iframe框架,则给iframe框架添加mouseup事件驱动程序
if (hasIframe()) {
var docs = getIframeObject();
for (var i = 0, l = docs.length; i < l; i++) {
(function(doc){
addEvent(doc, "mouseup", function(e){
handler(doc, e);
});
})(docs[i]);
}
}
});
})();
[/javascript]

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>