如何从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; 

    } 
+0

你是什么意思的价值 - 确切的文字被复制? –

+0

@Pekka,是的,我需要复制的文本。如果我得到它,稍后我会进行一些验证并将其放在文本框中 –

+0

因此,您的意思是*插入*值?也许更改字词 –

所有你必须做的事情勾到粘贴事件,让它完成通过打破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); 
}); 
+0

当你在输入数据之前需要对数据做些什么时,你会怎么做? – hvgotcodes

+0

你制作了许多可怕的复杂代码来阅读剪贴板。由于断开的callstack使得数据的读取在粘贴之后小于1ms发生,所以您可以在事后将其读取,将值设置为无,编辑价值并重新设定你的自我。用户不会更聪明,你有一个简单的解决方案。 –

+0

我已经做了一个更新小提示,告诉你如何修改输入:http://jsfiddle.net/Yqrtb/3/ - 从用户体验的角度来看,在粘贴的值被插入到字段之前发生更改。 –

这是非常依赖于浏览器。数据在传递给您的处理程序的事件中。 Safari /铬中,我们监听到的输入paste事件,然后做

event.clipboardData.getData('text/plain')

回调,似乎工作确定。你应该使用你最喜欢的调试器,并将一个断点放入你的粘贴事件处理程序,并查看传入的事件。

+0

在浏览器平台上阅读剪贴板是一个可怕的混乱,我强烈建议不要这样做,当有更简单的方法可用。 –

+0

-1,我同意马丁...这不是一个非常可靠的方法,取决于用户浏览器 – g19fanatic

+0

正确的,这我在句子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); 
} 

在这种所谓的情况下可变复制包含了你所需要的价值。

+0

你也应该展示如何实现它,例如教关于'paste'事件。 – Akxe

+0

@Akxe 你可以叫你的方法组件内部 或者ASIGN方法usign的jQuery: $( 'yourComponent')上( '粘贴',函数(){ var copied = event.view.clipboardData.getData(“Text”); }); –