【问题标题】:How much of the Clipboard API can I use within the Paste event of CKEDITOR?我可以在 CKEDITOR 的粘贴事件中使用多少剪贴板 API?
【发布时间】:2013-05-09 06:05:28
【问题描述】:

我正在尝试读取我正在为 CKEditor 4 开发的插件的粘贴事件的 clipboardData 属性。

我已经确定,在 Chrome 中,如果我侦听文档对象中的粘贴事件,那么我在处理程序中传递的事件对象将包含 clipboardData 属性。我很惊讶地发现 Firefox (v20) 并非如此。

这是我在我的 CKEditor 插件中使用的代码,尽管我不认为这是一个仅与 CKEditor 相关的问题。在 Chrome 中我看到了 clipboardData 对象,在 Firefox 中我没有。

editor.document.on('paste', function(event) {
  var clipboardData = event.data.$.clipboardData;
  if (clipboardData) {
    console.log(clipboardData);
  }
});

我在 MDN 网站上看不到任何确认是否支持此功能的内容,我也相信 IE10 旨在支持此功能,但它可以在标准 API 上运行吗?

编辑:

我应该从一开始就明确这一点,但我正在尝试开发对粘贴图像的支持,因此我需要将剪贴板数据作为文件读取。

【问题讨论】:

  • 一些(略过时的)关于此处支持的详细信息:quirksmode.org/dom/events/cutcopypaste.html。标准 API 在这里:dev.w3.org/2006/webapi/clipops(仍是草案)。如果您乐于进行代码潜水,请查看 Github 上关于检测对 Modernizr 的剪贴板 API 支持的讨论github.com/Modernizr/Modernizr/pull/659
  • 提示:阅读contentDom event,因为您没有正确添加侦听器(或至少不是最佳)。
  • @Reinmar - 我在 contentDom 事件中使用那个 sn-p。这个问题真的不是关于CKEditor的!
  • 我知道,我知道 :P 但作为核心开发人员,我觉得有义务提供帮助 :P。无论如何,如果你在 contentDom 中使用它,那么 a) 它不会在 contentDomUnload 上被删除,b) 它可能会在 setData/switching 模式后停止工作。你应该使用editable.attachListener 来避免问题(有时这真的很令人惊讶)。
  • 太棒了!谢谢你的提示。介意我的插件功能更强大一点后我由你运行吗?

标签: javascript html ckeditor clipboarddata


【解决方案1】:

如果您想在粘贴事件中获取剪贴板数据,这些可以帮助您:

W3C 标准(Chrome):

event.clipboardData.getData(type)

您无法从 event.clipboardData.types 中获取类型,通常是“text/plain”。 http://www.w3.org/TR/clipboard-apis/

IE:

window.clipboardData.getData(type)

类型只能是“文本”或“URL”:http://msdn.microsoft.com/en-us/library/ie/ms536436%28v=vs.85%29.aspx

火狐:

ff中没有访问剪贴板的api,如果你想实现的话,你可以尝试一些其他的方式,这取决于你想要做什么。

【讨论】:

  • 如果使用jQuery,可能需要使用event.originalEvent.clipboardData
【解决方案2】:

这确实是 CKEditor 唯一的问题。问题是您正在阅读基本的 Javascript 事件。但是您缺少 CKEditor 的开发人员为您制作的 CKEditor 层..

他们已经处理了浏览器之间的差异。而你唯一需要做的事情:

var clipboardData = ev.data.dataValue

【讨论】:

  • 这没有帮助,因为 CKEditor 不包含对 clipboardData 对象的支持,在 Chrome 中您无法读取图像数据;这就是为什么我想直接参加基础活动。
【解决方案3】:

您应该在paste 事件中使用剪贴板数据:

editor.on( 'paste', function( event ) {
    console.log( event.data.dataValue );
});

您可以修改event.data.dataValue 来操作粘贴的内容。另请注意,优先级很重要,因为粘贴的数据是pre-processed during pasting phases。因此,您可以通过指定数字侦听器优先级在不同阶段“注入”您的更改:

editor.on( 'paste', function( event ) {
    console.log( event.data.dataValue );
}, null, null, priority );

【讨论】:

  • 谢谢,我真的不应该把这个问题和CKEditor联系起来,因为它的粘贴方法不支持获取我需要的剪贴板数据。我将编辑问题
【解决方案4】:

在ie中,我们可以使用所有的剪贴板API,而在chrome和firefox中只能在触发粘贴事件的地方使用。所以用户不能使用剪贴板api从网站上复制一些东西,而在那里使用办公室,msn..

【讨论】:

    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多