document.execCommand()
做到這一點你在所有主要的瀏覽器:
document.execCommand("CreateLink", false, "http://stackoverflow.com/");
要同時保留選擇您的顯示鏈接對話框中,可以使用以下功能:
function saveSelection() {
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
var ranges = [];
for (var i = 0, len = sel.rangeCount; i < len; ++i) {
ranges.push(sel.getRangeAt(i));
}
return ranges;
}
} else if (document.selection && document.selection.createRange) {
return document.selection.createRange();
}
return null;
}
function restoreSelection(savedSel) {
if (savedSel) {
if (window.getSelection) {
sel = window.getSelection();
sel.removeAllRanges();
for (var i = 0, len = savedSel.length; i < len; ++i) {
sel.addRange(savedSel[i]);
}
} else if (document.selection && savedSel.select) {
savedSel.select();
}
}
}
的jsfiddle例如:http://jsfiddle.net/JRKwH/1/
UPDATE
要獲得創建鏈接(S)的保持(如果有的話創建在所有)是棘手的。您可以使用我自己的Rangy磁帶庫:
var sel = rangy.getSelection();
if (sel.rangeCount) {
var links = sel.getRangeAt(0).getNodes([1], function(el) {
return el.nodeName.toLowerCase() == "a";
});
alert(links.length);
}
...或類似如下:
function getLinksInSelection() {
var selectedLinks = [];
var range, containerEl, links, linkRange;
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
linkRange = document.createRange();
for (var r = 0; r < sel.rangeCount; ++r) {
range = sel.getRangeAt(r);
containerEl = range.commonAncestorContainer;
if (containerEl.nodeType != 1) {
containerEl = containerEl.parentNode;
}
if (containerEl.nodeName.toLowerCase() == "a") {
selectedLinks.push(containerEl);
} else {
links = containerEl.getElementsByTagName("a");
for (var i = 0; i < links.length; ++i) {
linkRange.selectNodeContents(links[i]);
if (linkRange.compareBoundaryPoints(range.END_TO_START, range) < 1 && linkRange.compareBoundaryPoints(range.START_TO_END, range) > -1) {
selectedLinks.push(links[i]);
}
}
}
}
linkRange.detach();
}
} else if (document.selection && document.selection.type != "Control") {
range = document.selection.createRange();
containerEl = range.parentElement();
if (containerEl.nodeName.toLowerCase() == "a") {
selectedLinks.push(containerEl);
} else {
links = containerEl.getElementsByTagName("a");
linkRange = document.body.createTextRange();
for (var i = 0; i < links.length; ++i) {
linkRange.moveToElementText(links[i]);
if (linkRange.compareEndPoints("StartToEnd", range) > -1 && linkRange.compareEndPoints("EndToStart", range) < 1) {
selectedLinks.push(links[i]);
}
}
}
}
return selectedLinks;
}
的jsfiddle:http://jsfiddle.net/JRKwH/3/
唐先生。你是我所有的英雄!最後,我可以擺脫醜陋的JavaScript提示窗口;)儘管我認爲clmarquart有一個有效的觀點。我想要做的下一件事是創建一個與目標(_blank)的鏈接,我想我需要insertHTML(或其他)爲此。是否有可能通過向'a'標籤添加目標來使代碼工作?如果你能,你不僅是我的英雄,而且我會將你的地位升級爲上帝! :) – PeeHaa 2011-04-12 19:23:37
@PeeHaa:好問題。這將是棘手的,因爲該命令處理多個案例。有時候根本不會創建任何鏈接(如果所選內容已經在具有相同URL的鏈接中)或者只有不在其他鏈接內的內容纔會鏈接。我會補充一點我的答案。 – 2011-04-14 12:02:19
@PeeHaa:更新。 – 2011-04-14 13:53:41