如何从javascript中的ctrl + v键事件获取复制值
此方法检测到ctrl + v事件,但我无法找到如何获取它的值?如何从javascript中的ctrl + v键事件获取复制值
由于提前,
$(".numeric").keydown(function (event) {
if (event.shiftKey) {
event.preventDefault();
}
switch (event.keyCode) {
case 86:
if (event.ctrlKey) { // detects ctrl + v
var value = $(this).val();
alert(value); // returns ""
}
break;
}
所有你必须做的事情勾到粘贴事件,让它完成通过打破callstack和然后读取该值。
它可能看起来很丑陋,但它对浏览器非常友好,并且可以节省您创建很多蹩脚的代码来阅读实际的剪贴板。
$(".numeric").bind('paste', function (event) {
var $this = $(this); //save reference to element for use laster
setTimeout(function(){ //break the callstack to let the event finish
alert($this.val()); //read the value of the input field
},0);
});
看到它在这里的行动:http://jsfiddle.net/Yqrtb/2/
更新:
因为我最近不得不做同样的事情,我想我会分享我的最终实现,它是这样的:
$('textarea').on('paste',function(e) {
//store references for lateer use
var domTextarea = this,
txt = domTextarea.value,
startPos = domTextarea.selectionStart,
endPos = domTextarea.selectionEnd,
scrollTop = domTextarea.scrollTop;
//clear textarea temporarily (user wont notice)
domTextarea.value = '';
setTimeout(function() {
//get pasted value
var pastedValue = domTextarea.value;
//do work on pastedValue here, if you need to change/validate it before applying the paste
//recreate textarea as it would be if we hadn't interupted the paste operation
domTextarea.value = txt.substring(0, startPos) + pastedValue + txt.substring(endPos, txt.length);
domTextarea.focus();
domTextarea.selectionStart = domTextarea.selectionEnd = startPos + pastedValue.length;
domTextarea.scrollTop = scrollTop;
//do work on pastedValue here if you simply need to parse its ccontents without modifying it
}, 0);
});
当你在输入数据之前需要对数据做些什么时,你会怎么做? – hvgotcodes
你制作了许多可怕的复杂代码来阅读剪贴板。由于断开的callstack使得数据的读取在粘贴之后小于1ms发生,所以您可以在事后将其读取,将值设置为无,编辑价值并重新设定你的自我。用户不会更聪明,你有一个简单的解决方案。 –
我已经做了一个更新小提示,告诉你如何修改输入:http://jsfiddle.net/Yqrtb/3/ - 从用户体验的角度来看,在粘贴的值被插入到字段之前发生更改。 –
这是非常依赖于浏览器。数据在传递给您的处理程序的事件中。 Safari /铬中,我们监听到的输入paste
事件,然后做
event.clipboardData.getData('text/plain')
回调,似乎工作确定。你应该使用你最喜欢的调试器,并将一个断点放入你的粘贴事件处理程序,并查看传入的事件。
在浏览器平台上阅读剪贴板是一个可怕的混乱,我强烈建议不要这样做,当有更简单的方法可用。 –
-1,我同意马丁...这不是一个非常可靠的方法,取决于用户浏览器 – g19fanatic
正确的,这我在句子1和3中清楚地说明了...... – hvgotcodes
如果需要使用更少的代码为URL链接粘贴一个简单的解决方案,该解决方案:我之前已经详细一个堆栈溢出几次可能正在查看插入到textarea中的文本的长度。代码很自我解释。基本上你看看textarea值的长度并保存最后两个变化的值。如果两个值之间的差异大于5个字符,则认为用户粘贴了文本。普通用户一般不会一次按五个以上的键,从而消除不必要的假设。
此解决方案仅适用于长度超过5个字符的粘贴文本,这些URL通常是。
var length1 = 0,
length2 = 0;
$('textarea').keyup(function (e) {
//save last two inserted values
length2 = length1;
length1 = $(this).val().length;
//check the difference and get the substring
if (length1 - length2 > 5) {
alert('Probable Ctrl + V. Pasted text: ' + $(this).val().substring(length1, length2));
}
});
这很简单,下面的代码工作正常,在我的情况下需要剪贴板上包含的文本。
function onPaste(info) {
var copied = event.view.clipboardData.getData("Text");
alert(copied);
}
在这种所谓的情况下可变复制包含了你所需要的价值。
你也应该展示如何实现它,例如教关于'paste'事件。 – Akxe
@Akxe 你可以叫你的方法组件内部 或者ASIGN方法usign的jQuery: $( 'yourComponent')上( '粘贴',函数(){ var copied = event.view.clipboardData.getData(“Text”); }); –
你是什么意思的价值 - 确切的文字被复制? –
@Pekka,是的,我需要复制的文本。如果我得到它,稍后我会进行一些验证并将其放在文本框中 –
因此,您的意思是*插入*值?也许更改字词 –