Получить вставленный контент в документе при вставке
Как уже упоминалось в Вопросе, как я могу получить вставленный контент на документе. В настоящее время я создаю текстовую область и dblclick, чтобы получить фокус в textarea, а затем при вставке события текстового поля я собираю данные. Я не думаю, что это хороший подход. Мой код ниже
$('body').dblclick(function()
{
$('#textare').focus();
});
Then
$('#textare').keyup(function()
{
alert( $(this).val() );
});
Пожалуйста, предложите мне альтернативный процесс.
Я ищу альтернативу, например
$(document).paste(function()
{
// Get the pasted content
});
Я использую браузер Chrome Chrome. Я не хочу использовать textarea, чтобы поймать текст.
Ответы
Ответ 1
Вы можете добавить событие onpaste
к вашему элементу. Поддерживается всеми браузерами.
onpaste="return getPastedValue(this);"
<script type="text/javascript">
function getPastedValue (obj) {
alert(obj.innerHTML);
return false;
}
</script>
Ответ 2
Это решение выходит за рамки получения текста, оно фактически позволяет вам редактировать вставленный контент, прежде чем он будет вставлен в элемент.
Он работает с использованием контента contenteditable, onpaste (поддерживается всеми основными браузерами) en mutation observers (поддерживается Chrome, Firefox и IE11 +)
шаг 1
Создайте HTML-элемент с contenteditable
<div contenteditable="true" id="target_paste_element"></div>
шаг 2
В вашем Javascript-коде добавьте следующее событие
document.getElementById("target_paste_element").addEventListener("paste", pasteEventVerifierEditor.bind(window, pasteCallBack), false);
Нам нужно связать pasteCallBack, так как наблюдатель мутации будет вызываться асинхронно.
шаг 3
Добавьте в свой код
следующую функцию:
function pasteEventVerifierEditor(callback, e)
{
//is fired on a paste event.
//pastes content into another contenteditable div, mutation observer observes this, content get pasted, dom tree is copied and can be referenced through call back.
//create temp div
//save the caret position.
savedCaret = saveSelection(document.getElementById("target_paste_element"));
var tempDiv = document.createElement("div");
tempDiv.id = "id_tempDiv_paste_editor";
//tempDiv.style.display = "none";
document.body.appendChild(tempDiv);
tempDiv.contentEditable = "true";
tempDiv.focus();
//we have to wait for the change to occur.
//attach a mutation observer
if (window['MutationObserver'])
{
//this is new functionality
//observer is present in firefox/chrome and IE11
// select the target node
// create an observer instance
tempDiv.observer = new MutationObserver(pasteMutationObserver.bind(window, callback));
// configuration of the observer:
var config = { attributes: false, childList: true, characterData: true, subtree: true };
// pass in the target node, as well as the observer options
tempDiv.observer.observe(tempDiv, config);
}
}
function pasteMutationObserver(callback)
{
document.getElementById("id_tempDiv_paste_editor").observer.disconnect();
delete document.getElementById("id_tempDiv_paste_editor").observer;
if (callback)
{
//return the copied dom tree to the supplied callback.
//copy to avoid closures.
callback.apply(document.getElementById("id_tempDiv_paste_editor").cloneNode(true));
}
document.body.removeChild(document.getElementById("id_tempDiv_paste_editor"));
}
function pasteCallBack()
{
//paste the content into the element.
restoreSelection(document.getElementById("target_paste_element"), savedCaret);
delete savedCaret;
pasteHtmlAtCaret(this.innerHTML, false, true);
}
saveSelection = function(containerEl) {
if (containerEl == document.activeElement)
{
var range = window.getSelection().getRangeAt(0);
var preSelectionRange = range.cloneRange();
preSelectionRange.selectNodeContents(containerEl);
preSelectionRange.setEnd(range.startContainer, range.startOffset);
var start = preSelectionRange.toString().length;
return {
start: start,
end: start + range.toString().length
};
}
};
restoreSelection = function(containerEl, savedSel) {
containerEl.focus();
var charIndex = 0, range = document.createRange();
range.setStart(containerEl, 0);
range.collapse(true);
var nodeStack = [containerEl], node, foundStart = false, stop = false;
while (!stop && (node = nodeStack.pop())) {
if (node.nodeType == 3) {
var nextCharIndex = charIndex + node.length;
if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {
range.setStart(node, savedSel.start - charIndex);
foundStart = true;
}
if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {
range.setEnd(node, savedSel.end - charIndex);
stop = true;
}
charIndex = nextCharIndex;
} else {
var i = node.childNodes.length;
while (i--) {
nodeStack.push(node.childNodes[i]);
}
}
}
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
}
function pasteHtmlAtCaret(html, returnInNode, selectPastedContent) {
//function written by Tim Down
var sel, range;
if (window.getSelection) {
// IE9 and non-IE
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
range.deleteContents();
// Range.createContextualFragment() would be useful here but is
// only relatively recently standardized and is not supported in
// some browsers (IE9, for one)
var el = document.createElement("div");
el.innerHTML = html;
var frag = document.createDocumentFragment(), node, lastNode;
while ( (node = el.firstChild) ) {
lastNode = frag.appendChild(node);
}
var firstNode = frag.firstChild;
range.insertNode(frag);
// Preserve the selection
if (lastNode) {
range = range.cloneRange();
if (returnInNode)
{
range.setStart(lastNode, 0); //this part is edited, set caret inside pasted node.
}
else
{
range.setStartAfter(lastNode);
}
if (selectPastedContent) {
range.setStartBefore(firstNode);
} else {
range.collapse(true);
}
sel.removeAllRanges();
sel.addRange(range);
}
}
} else if ( (sel = document.selection) && sel.type != "Control") {
// IE < 9
var originalRange = sel.createRange();
originalRange.collapse(true);
sel.createRange().pasteHTML(html);
if (selectPastedContent) {
range = sel.createRange();
range.setEndPoint("StartToStart", originalRange);
range.select();
}
}
}
Что делает код:
- Кто-то запускает событие вставки с помощью ctrl-v, contextmenu или других средств.
- В событии вставки создается новый элемент с contenteditable (элемент с contenteditable имеет повышенные привилегии)
- Позиция каретки целевого элемента сохраняется.
- Фокус установлен на новый элемент
- Содержимое вставляется в новый элемент и отображается в DOM.
- Наблюдатель за мутацией ловит это (он регистрирует все изменения в дереве и контенте). Затем запускается событие мутации.
- Домен вставляемого содержимого клонируется в переменную и возвращается к обратному вызову. Временный элемент уничтожен.
- Обратный вызов получает клонированную DOM. Каретка восстанавливается. Вы можете отредактировать это, прежде чем присоединять его к своей цели. элемент. В этом примере я использую функции Tim Downs для сохранения/восстановления каретки и вставки HTML в элемент.
Большое спасибо Tim Down
Ответ 3
Что-то вроде этого:
$("yourTextAres").bind('paste', function() {
alert($(this).val());
});