関数が呼び出されたときにtextareaフィールドから値を読み取ろうとするとonpaste
、新しい値(貼り付け操作の後の値)ではなく、フィールドの古い値(貼り付け操作の前の値)が取得されることがわかります。
これがこの振る舞いのデモンストレーションです:http://jsfiddle.net/qsDnr/
コードのコピーは次のとおりです。
<!DOCTYPE html>
<html>
<head>
<title>On Paste</title>
<script type="text/javascript">
var textareaElement;
var previewElement;
function update()
{
previewElement.innerHTML = textareaElement.value;
}
window.onload = function() {
textareaElement = document.getElementById('textarea');
previewElement = document.getElementById('preview');
textareaElement.onpaste = update
}
</script>
</head>
<body>
<textarea id="textarea">
</textarea>
<div id="preview">
</div>
</body>
</html>
以下の手順で動作を確認できます。
foo
文字列をクリップボードにコピーします。- textareaフィールドを右クリックして、[貼り付け]を選択します。div要素には何も表示されません。
- textareaフィールドを右クリックして、もう一度[貼り付け]を選択します。
foo
div要素に表示されます。
div要素に、貼り付け操作でtextarea要素で更新された内容を常に表示させたいので、目的の出力はfoo
、foo foo
それぞれステップ2とステップ3にあります。
目的の出力を得ることができた1つの方法は、update()
関数呼び出しをwindow.setTimeout()
で遅らせることです。
textareaElement.onpaste = update
私は持っています
textareaElement.onpaste = function() {
window.setTimeout(update, 100);
};
今回(デモ: http: //jsfiddle.net/cwpLS/)。これは私が望むことをします。ただし、これは、私がやりたいことを簡単に行う方法というよりは、回避策のように感じます。これを行うための代替またはより良い方法があるかどうか知りたいです。