我有一个简单的过去事件
document.getElementById('paste_area').addEventListener('paste', function() {
document.getElementById('notice').innerHTML='Text was successfully pasted!';
alert('Pasted');
}, true);
可在此处找到一个工作示例http://jsfiddle.net/XEQzz/
警告和通知将在粘贴前显示。 如何在粘贴事件实际完成后延迟警报操作?
答案 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">