Я пришел к следующему решению:
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;
}
Это не позволяет тексту прыгать вокруг при замене содержимого.
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);
Я специально не использовал jquery, так как планирую использовать это в скрипте greasemonkey, и загрузка его на каждую страницу замедлит процесс (я думаю?). Я работал с ним, автоматически меняя выбор, связывая указатель мыши после запуска mousedown, но в итоге он работал очень медленно, поэтому я решил, что лучше всего сосредоточиться на своей цели - изменить то, что было скопировано.
Насчет использования нестандартных атрибутов, я никогда не находил, что это проблема? Я использую заголовок, чтобы люди могли видеть альтернативный формат без копирования и данных, потому что это казалось логичным.