Une solution que je suis venu avec est la suivante.
HTML:
<p>Semper mi vitae tellus <span class="date" title="19/03/09" data="19th of March">19th of March</span> quis, augue.</p>
CSS:
.date {
display:inline-block;
text-align:center;
}
Cela empêche le texte de sautiller lorsque le contenu est remplacé.
Javascript:
var travel = function(node, noChildren){
if (node.firstChild && !noChildren) {
return node.firstChild;
}
if (node.nextSibling) {
return node.nextSibling;
}
return travel(node.parentNode, true);
};
var onMouseDown = function(event){
var spans = document.getElementsByClassName(revertClass);
var i = spans.length;
while (i) {
i--;
spans[i].innerHTML = spans[i].getAttribute('data');
spans[i].className = window.baseClass;
}
var selection = window.getSelection();
if (selection.rangeCount && event.button === 2){
var n = selection.rangeCount;
var k = n;
do {
var i = k-n;
var range = selection.getRangeAt(i);
var element = range.startContainer;
var endContainer = range.endContainer;
do {
if (element.className === window.baseClass){
element.style.width = element.offsetWidth;
element.innerHTML = element.title;
element.className += ' ' + window.revertClass;
}
if (element == endContainer){
break;
}
}
while (element = travel(element));
var newRange = document.createRange();
newRange.setStart(range.startContainer, range.startOffset);
newRange.setEnd(range.endContainer, range.endOffset);
selection.removeRange(range);
selection.addRange(newRange);
}
while (--n);
}
};
var onKeyDown = function(event){
//Ctrl + C
if (event.keyCode === 67 && event.ctrlKey){
event.button = 2;
onMouseDown(event);
}
//Tab to deselect
else if (event.keyCode === 9){
onMouseDown(event);
}
};
window.baseClass = 'date';
window.revertClass = 'date_revert';
window.addEventListener ('mousedown', onMouseDown, false);
window.addEventListener ('keydown', onKeyDown, false);
Je n'ai pas utilisé à dessein jquery que je prévois sur l'utilisation dans un script Greasemonkey et le charger sur chaque page ralentirait les choses (je pense?). Je l'ai eu avec le changement automatique sur la sélection en liant mousemove après le mousedown, mais il a fini par être très lent, donc j'ai décidé qu'il était préférable de se concentrer sur mon objectif de changer ce qui a été copié.
A propos de l'utilisation des attributs non standard, je n'ai jamais trouvé que cela soit un problème? J'utilise le titre afin que les gens puissent voir le format alternatif sans le copier et les données parce que cela semblait logique.
Que voulez-vous dire par sélectionné? – SeanDowney
Un utilisateur positionne la souris à gauche de "Aujourd'hui" puis appuie sur le bouton gauche de la souris en faisant glisser la souris jusqu'à la fin de "Mars". À ce stade, il est sélectionné bien qu'il existe d'autres moyens de sélectionner des choses comme double ou triple cliquant sur un mot. – Annan
Pourquoi voulez-vous changer le texte qu'ils copient? Cela ressemble à un problème de conception d'interface. – strager