22

私は単純な過去の出来事を持っています

document.getElementById('paste_area').addEventListener('paste', function() {
    document.getElementById('notice').innerHTML='Text was successfully pasted!';
    alert('Pasted');
}, true);

実際の例はここにありますhttp://jsfiddle.net/XEQzz/

貼り付ける前にアラートと通知が表示されます。貼り付けイベントが実際に完了した後にアラート アクションが発生するのを遅らせるにはどうすればよいですか?

4

5 に答える 5

34

アラートを に入れることができますsetTimeout

setTimeout(function() {alert('Pasted');}, 0);

これにより、値が更新されるまでコードが遅延します。

コールバックでは、囲んでいる環境とは異なる値になることthisに注意してください。setTimeout

要素となるouter への参照が必要な場合はthis、変数で参照してください...

var self = this;
setTimeout(function() {alert(self.value);}, 0);

または使用.bind() (をサポートするほとんどのブラウザーでサポートされていますaddEventListener。古い Safari ではサポートされていませんでした。) ...

setTimeout(function() {alert(this.value);}.bind(this), 0);
于 2012-12-15T18:48:18.643 に答える
2

setTimeout が最良のオプションと思われ、このようなものを使用して一般化できます

// オブジェクト定義

    function PasteMonitor(element)
    {
        if(typeof element == "string")
        {
            this.target = document.getElementById(element);
        }
        else if(typeof element == "object" || typeof element == "function")
        {
            this.target = element;
        }

        if(this.target != null && this.target != undefined)
        {
            this.target.addEventListener('paste',this.inPaste.bind(this),false);
            this.target.addEventListener('change',this.changed.bind(this),false);
        }
        this.oldstate = "";
    }
    PasteMonitor.prototype = Object.create({},{
        pasted:{ value: false, enumerable: true, configurable: true, writable: true },
        changed:{ value: function(evt){
            //elements content is changed
            if(typeof this.onChange == "function")
            {
                this.onChange(evt);
            }
            if(this.pasted)
            {
                if(typeof this.afterPaste == "function")
                {
                    this.afterPaste(evt);
                    this.pasted = false;
                }
            }
        }, enumerable: true, configurable: true, writable: true },
        inPaste:{ value: function(evt){
            var cancelPaste = false;
            if(typeof this.beforePaste == "function")
            {
                // process pasted data
                cancelPaste = this.beforePaste(evt);
            }
            if(cancelPaste == true)
            {
                evt.preventDefault();
                return false;
            }
            this.pasted = true;
            setTimeout(function(){
                var evt = document.createEvent("HTMLEvents");
                evt.initEvent("change", false, true);
                this.target.dispatchEvent(evt);
            }.bind(this),0);
        }, enumerable: true, configurable: true, writable: true }
    })
    PasteMonitor.prototype.constructor = PasteMonitor;

//PasteMonitor の使用法

    //var element = document.getElementById('paste_area');
    var msgArea = document.getElementById('message');
    var myMonitor = new PasteMonitor("paste_area");
    //or use and object as argument => var myMonitor = new PasteMonitor(element);

    myMonitor.onChange = function(evt){
        if(this.pasted)
        {
            //do something on paste change
            msgArea.innerHTML = "onChange by paste";
            this.oldstate = this.target.value;
        }
        //check to prevent processing change event when the element loses focus if the change is done by paste
        else if(this.target.value != this.oldstate)
        {
            msgArea.innerHTML = "onChange by typing";
        }
    };
    myMonitor.afterPaste = function(evt){
       // do something after paste
        msgArea.innerHTML = "afterPaste";
    };
    myMonitor.beforePaste = function(evt){
        // do something before the actual paste
        msgArea.innerHTML = "beforePaste";
        //return true to prevent paste
        return false;
    };
于 2012-12-15T23:38:33.470 に答える
1

私は通常、onafterpaste を模倣するためにこれを行います。

「onafterpaste」という特別な機能があり、次のように使用します。

onpaste="onafterpaste(myFunction, this)"

ご覧のとおり、myFunction が呼び出されたときに使用される追加のパラメーターも受け入れます。

次のライブ スニペットを参照してください (実際に試してみてください)。

function onafterpaste(f,elm) {
  setTimeout(function() {f(elm)},0);
}

function  myFunction(elm) {
  alert('After the paste, the input has the following text:\r\n\r\n'+elm.value);
}
<p>Paste something down here:</p>
<input type="text" onpaste="onafterpaste(myFunction,this)" value="The original text">

于 2020-08-01T12:12:21.530 に答える