Sulla risposta accettato di Rox Dorentus (e con riferimento alla conversione utile Javascript del CPM-ae), qui è un miglioramento rispetto l'algoritmo che non coinvolge l'hacking lo stile display
degli <rt>
elementi, che si sente fragile per me.
Invece, costruiamo una serie di riferimenti a tutti i nodi nella selezione, filtriamo per qualsiasi con il tag <rb>
e restituiamo il loro innerText
. Fornisco anche un'alternativa commentata nel caso in cui non vengano utilizzati tag <rb>
per avvolgere il kanji.
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;
}
}
}
});
fonte
2017-03-18 23:32:23
vedere l'ultima CSS per disabilitare 'user-select': http://stackoverflow.com/questions/826782/how-to-disable-text-selection-highlighting-using-css –