很難寫出跨瀏覽器的功能。見How to bind a handler to a selection change on window?。
我們應該捕獲一些事件,如mousedown
,mouseup
,touchstart
,touchend
。這些事件的組合可能沒有問題。
function addEvent(elem, event, func) {
if (elem.addEventListener) {
elem.addEventListener(event, func, false);
} else {
elem.attachEvent('on' + event, func);
}
}
接下來是使用window.getSelection
或document.selection
的getSelectedHTML()
。
function getSelectedHTML(event) {
// http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/ranges.html
var range = window.getSelection ? window.getSelection() /* W3C */
: document.getSelection ? document.getSelection() /* redundant? */
: document.selection ? document.selection.createRange() /* IE */
: null;
if (range) {
if (range.getRangeAt) {
range = range.getRangeAt(0);
} else if (range.setStart) { // Safari 1.3
// Create range by itself
range.setStart(range.anchorNode, range.anchorOffset);
range.setEnd(range.focusNode, range.focusOffset);
} else {
// IE is already reange
}
var html = null, link = null;
if (range.cloneContents) {
var dummy = document.createElement('div');
dummy.appendChild(range.cloneContents());
html = dummy.innerHTML;
} else {
html = range.htmlText; /* IE */
}
if (html) {
link = html.match(/<a.*?href\s*?=['"](.*?)['"]/);
return link ? link[1] : null;
}
}
return null;
}
該代碼應特別用舊瀏覽器進行檢查。
下面是示例小提琴:http://jsfiddle.net/tokkonoPapa/CQ63a/
哦,幾乎相同的回答中可以找到[如何獲得選擇使用JavaScript的HTML文本?](http://stackoverflow.com/questions/5643635/how-對獲得選擇-HTML的文本與JavaScript的)。 – tokkonopapa
它的工作很好,但有一個問題:當只選擇鏈接或鏈接片段時,返回空值 – kicaj