如何在Javascript中粘贴事件后发出警报?

时间:2012-12-15 18:43:57

标签: javascript javascript-events

我有一个简单的过去事件

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

可在此处找到一个工作示例http://jsfiddle.net/XEQzz/

警告和通知将在粘贴前显示。 如何在粘贴事件实际完成后延迟警报操作?

4 个答案:

答案 0 :(得分:28)

您可以将提醒设置为setTimeout

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

这将延迟代码,直到值更新为止。

请注意,this回调中的setTimeout将具有与封闭环境中不同的值。

如果你需要引用外部this,它将是元素,那么在变量中引用它......

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

或使用.bind() (在大多数支持addEventListener的浏览器中都支持。较旧的Safari不支持它。) ...

setTimeout(function() {alert(this.value);}.bind(this), 0);

答案 1 :(得分:3)

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;
    };

答案 2 :(得分:0)

用于更新自己的值

 $(".number").on("paste", function (e) {
        var Value = e.originalEvent.clipboardData.getData('text');
        var Self=this
        setTimeout(function () {
            if (Value != Value.replace(/[^\d\.]/g, "")) {
                $(Self).val(Value.replace(/[^\d\.]/g, ""));
            }
        }, 0);
    });

答案 3 :(得分:0)

我通常喜欢这样模仿后期粘贴。

我有一个叫做“ 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">