8

関数が呼び出されたときに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>

以下の手順で動作を確認できます。

  1. foo文字列をクリップボードにコピーします。
  2. textareaフィールドを右クリックして、[貼り付け]を選択します。div要素には何も表示されません。
  3. textareaフィールドを右クリックして、もう一度[貼り付け]を選択します。foodiv要素に表示されます。

div要素に、貼り付け操作でtextarea要素で更新された内容を常に表示させたいので、目的の出力はfoofoo fooそれぞれステップ2とステップ3にあります。

目的の出力を得ることができた1つの方法は、update()関数呼び出しをwindow.setTimeout()で遅らせることです。

textareaElement.onpaste = update    

私は持っています

textareaElement.onpaste = function() {
    window.setTimeout(update, 100);
};

今回(デモ: http: //jsfiddle.net/cwpLS/)。これは私が望むことをします。ただし、これは、私がやりたいことを簡単に行う方法というよりは、回避策のように感じます。これを行うための代替またはより良い方法があるかどうか知りたいです。

4

2 に答える 2

3

setTimeoutソリューションが目的の効果を達成する唯一の方法であるか、クリップボードオブジェクトにアクセスしようとする方法であると確信しています。これは、クロスブラウザーと古いブラウザーのサポートを利用する場合に厄介になる可能性があります。

于 2012-03-25T04:12:17.530 に答える
0

クロスブラウザでそれを行う直接的な方法はありません。Firefoxでの動作については、以下のリンクを参照してください。

Mozilla

現在、貼り付けられているテキストを取得するDOMのみの方法はありません。その情報を取得するには、nsIClipboardを使用する必要があります。

また、他の可能性について議論しているstackoverflowリンクもご覧ください。

于 2012-03-25T04:10:07.860 に答える