2010-05-07 59 views
13

我需要执行的任务是为RichTextEditors相当普遍的特征 - 以HTML从剪贴板。 任何人都可以帮助指导如何解决这个任务?HTML内容从剪贴板中的JavaScript

它必须是跨平台的(IE,FF,Chrome,Opera)。 我刚从这个代码开始:

<script type="text/javascript"> 
    $('.historyText').live('input paste', function(e) { 

     var paste = e.clipboardData && e.clipboardData.getData ? 
     e.clipboardData.getData('text/plain') :    // Standard 
     window.clipboardData && window.clipboardData.getData ? 
     window.clipboardData.getData('Text') :     // MS 
     false; 

     alert(paste); 
    });</script> 

两个window.clipboardData和e.clipboardData为空器(Chrome,火狐)。

更新:用户希望文章内容从其他浏览器窗口粘贴,和我需要的html标签。

+0

看到此信息[JavaScript的获得上粘贴事件(跨浏览器)剪贴板数据(http://stackoverflow.com/questions/2176861/javascript-get-clipboard-data-on-paste-事件 - 跨浏览器) – 2013-09-07 05:33:44

+0

[JavaScript获取粘贴事件上的剪贴板数据(跨浏览器)]的可能重复](https://stackoverflow.com/questions/2176861/javascript-get-clipboard-data-on-paste-event-跨浏览器) – jgauffin 2017-09-01 07:06:40

回答

7

您将无法从单独使用JavaScript剪贴板,这是它的方式应该是获取数据。 TinyMCE的和CKEditor的方式当前版本做到这一点如下:

  1. 使用按键事件处理
  2. 在该处理程序检测CTRL-V /班-INS事件,保存在当前用户的选择,加div元素离屏(左-1000px说吧)的文件中,移动插入符是DIV中,从而有效地重定向贴
  3. 设置一个非常简短的计时器(例如1毫秒)在事件处理程序调用另一个函数,它从div中检索HTML内容并执行所需的任何处理,从文档中移除div,恢复用户选择并插入处理的HTML。

请注意,这只适用于键盘粘贴事件,不适用于上下文或编辑菜单中的粘贴。在粘贴事件触发时,将脱字符重定向到div(至少在某些浏览器中)为时已晚。

+0

蒂姆,它是有道理的,但我不能做的过程,称为“重定向粘贴” - 我只能得到纯文本,而不是HTML。 我需要允许从浏览器的html文章的副本聊天。基本“粘贴”只是过去的文本版本与HTML标签 – st78 2010-05-07 13:40:48

+0

喜蒂姆,'div'我想你的意思,'contenteditable div',对吧? – SexyBeast 2013-08-05 15:25:12

+0

@Cupidvogel:是的,还是其他元素。看起来像我的复制粘贴工作。 – 2013-08-05 15:40:11

2

在Chrome中,我使用此代码通过事件访问clipboardData:

$(document).bind('paste', function(e) { 
    var clipboardData = e.originalEvent.clipboardData; 
}); 
14

其实我已经做了很多工作,这一点,只是写了nice blog post描述我们如何在Lucidchart做了详细(作为免责声明,我在Lucidchart工作)。我们有a JSFiddle,显示复制和粘贴(在Firefox,Safari,Chrome和IE9 +中测试)。

答案的缺点是您需要在系统粘贴事件期间获取HTML。在大多数(非IE)浏览器,这可以通过如下面所示,简单的事情要做:

document.addEventListener('paste', function(e) { 
    var html = e.clipboardData.getData('text/html'); 
    // Whatever you want to do with the html 
} 

问题是,当你想在IE HTML内容。无论出于何种原因,IE不会通过javascript访问text/html剪贴板数据。你所要做的就是让浏览器粘贴到一个可以理解的div上,然后在粘贴事件结束后得到html。

<div id="ie-clipboard-contenteditable" class="hidden" contenteditable="true"></div> 
var ieClipboardDiv = $('#ie-clipboard-contenteditable'); 

var focusIeClipboardDiv = function() { 
    ieClipboardDiv.focus(); 
    var range = document.createRange(); 
    range.selectNodeContents((ieClipboardDiv.get(0))); 
    var selection = window.getSelection(); 
    selection.removeAllRanges(); 
    selection.addRange(range); 
}; 

document.addEventListener('beforepaste', function() { 
    if (hiddenInput.is(':focus')) { 
    focusIeClipboardDiv(); 
    } 
}, true); 

document.addEventListener('paste', function(e) { 
    ieClipboardDiv.empty(); 
    setTimeout(function() { 
    var html = ieClipboardDiv.html(); 
    // Do whatever you want with the html 
    ieClipboardDiv.empty(); 
    // Return focus here 
    }, 0); 
} 
+0

尼斯解释 – EasyBB 2015-02-28 17:53:55

+0

谢谢,这是非常有帮助!请注意,在IE 10和11中,'focusIeClipboardDiv'中的所有额外选择内容似乎都是不必要的。另外,为什么在'setTimeout'之前的粘贴监听器中有一个额外的'ieClipboardDiv.empty()'? – Raman 2015-07-10 01:28:41

+0

我怀疑'focusIeClipboardDiv'中额外的选择是用于相应的复制操作,而不是粘贴。 – Raman 2015-07-10 16:40:20