Aufbauend auf Rox Dorentus die akzeptierte Antwort (und mit Bezug auf jpc-ae ist hilfreich Javascript-Konvertierung), hier ist eine Verbesserung des Algorithmus, der nicht Hacking mit sich bringt, die display
Stil der <rt>
Elemente, die mir zerbrechlich anfühlt.
Stattdessen erstellen wir ein Array von Referenzen auf alle Knoten in der Auswahl, filtern nach einem beliebigen mit dem Tag <rb>
und geben ihre innerText
zurück. Ich biete auch eine auskommentierte Alternative an, wenn keine <rb>
Tags verwendet werden, um die Kanji zu verpacken.
document.addEventListener('copy', function (e) {
var nodesInRange = getRangeSelectedNodes(window.getSelection().getRangeAt(0));
/* Takes all <rb> within the selected range, ie. for <ruby><rb>振</rb><rt>ふ</rt></ruby> */
var payload = nodesInRange.filter((node) => node.nodeName === "RB").map((rb) => rb.innerText).join("");
/* Alternative for when <rb> isn't used: take all textNodes within <ruby> elements, ie. for <ruby>振<rt>ふ</rt></ruby> */
// var payload = nodesInRange.filter((node) => node.parentNode.nodeName === "RUBY").map((textNode) => textNode.textContent).join("");
e.clipboardData.setData('text/plain', payload);
e.preventDefault();
/* Utility function for getting an array of references to all the nodes in the selection area,
* from: http://stackoverflow.com/a/7784176/5951226 */
function getRangeSelectedNodes(range) {
var node = range.startContainer;
var endNode = range.endContainer;
if (node == endNode) return [node];
var rangeNodes = [];
while (node && node != endNode) rangeNodes.push(node = nextNode(node));
node = range.startContainer;
while (node && node != range.commonAncestorContainer) {
rangeNodes.unshift(node);
node = node.parentNode;
}
return rangeNodes;
function nextNode(node) {
if (node.hasChildNodes()) return node.firstChild;
else {
while (node && !node.nextSibling) node = node.parentNode;
if (!node) return null;
return node.nextSibling;
}
}
}
});
Siehe die neueste CSS deaktivieren 'benutzer select': http://stackoverflow.com/questions/826782/how-to-disable-text-selection-highlighting-using-css –