Вот концепция, с некоторым кодом, чтобы вы начали. Каждый раз, когда текст выделяется на странице, добавляйте этот текст к скрытой текстовой области на странице, а затем выберите текстовую область. Затем оберните исходное выделение в промежуток, чтобы он выглядел выделенным. Таким образом, у вас появляется вид выделения, и, поскольку скрытая текстовая область фактически выбрана, когда пользователь нажимает «Ctrl + C», он копирует текст из текстовой области.
Чтобы получить полную функциональность, которую вы ищете, вы, вероятно, захотите расширить ее. Отнюдь клавиши "Ctrl + A" (для выбора всех). Я не думаю, что вы сможете изменить поведение при щелчке правой кнопкой мыши ... по крайней мере, не просто и не элегантно. Но это, по крайней мере, является доказательством вашей концепции.
window.onload = init;
function init()
{
document.getElementById("hidden").value = "";
document.body.ondblclick = interceptSelection;
document.body.onmouseup = interceptSelection;
}
function interceptSelection(e)
{
e = e || window.event;
var target = e.target || e.srcElement;
var hidden = document.getElementById("hidden");
if (target == hidden) return;
var range, text;
if (window.getSelection)
{
var sel = getSelection();
if (sel.rangeCount == 0) return;
range = getSelection().getRangeAt(0);
}
else if (document.selection && document.selection.createRange)
{
range = document.selection.createRange();
}
text = "text" in range ? range.text : range.toString();
if (text)
{
if (range.surroundContents)
{
var span = document.createElement("span");
span.className = "selection";
range.surroundContents(span);
}
else if (range.pasteHTML)
{
range.pasteHTML("<span class=\"selection\">" + text + "</span>")
}
hidden.value += text;
}
hidden.select();
}
Вот CSS, который я использовал в своем тесте, чтобы скрыть текстовую область и стиль выделенного текста:
#hidden
{
position: fixed;
top: -100%;
}
.selection
{
background-color: Highlight;
color: HighlightText;
}