跨浏览器粘贴捕获 - Mac Opera问题

时间:2011-12-17 06:25:42

标签: javascript jquery opera copy-paste

我正在进行跨浏览器粘贴捕获。我有这个工作&在Chrome和Firefox(在Mac上)测试过。它在PC上的Chrome和Firefox上运行,但我还没有机会测试它。希望我不是重新发明轮子,我已经为jQuery插件或任何真正实现文档范围粘贴的javascript寻找了一些好处。

尚未在Opera(版本11.52)中工作(在Mac上,尚未在PC上测试过)。我的问题是,当按下cmd键时,当我按下v键时,我没有收到keydown事件。我不确定如何解决这个问题,因为我对Opera不是很了解。

正在进行中的jsfiddle是here

下面的javascript不能正常工作,请参阅jsfiddle了解工作脚本。要使脚本在下面工作,您需要this os检测插件。

要回答的问题 - 如何在Opera中完成这项工作?

如果您愿意,请留下评论 - 这对您有用吗? (发布浏览器,评论中的os版本)

更新 - 根据Baez留下的评论,这是一个仅限Mac的Opera。

update2 - 我已经更新了jsfiddle,它简化了一些代码,但仍无法让它在mac Opera中运行。


javascript(jquery)

$(document).ready(function() {
    // Fake paste
    var doFakePaste = false;
    $(document).on('keyup', function(e) {
        $('#status').html('');
        if (($.client.os === "Mac" && e.which == 86 && e.metaKey) ||
            ($.client.os !== "Mac" && e.which == 86 && e.ctrlKey)) {
            doFakePaste = false;
            $('#paste').blur().remove();
        }
    }).on('keydown', function(e) {
        $('#status').html('which: ' + e.which);
        if (($.client.os === "Mac" && e.which == 86 && e.metaKey) ||
            ($.client.os !== "Mac" && e.which == 86 && e.ctrlKey)) {
            doFakePaste = true;
            // got a paste
            $('<div></div>').attr('contenteditable', '').attr('id', 'paste').appendTo('body').on('paste', function(e) {
                setTimeout(function() {
                    doFakePaste = false;
                    var html = $('#paste').html();
                    var text = $('#paste').text();
                    $('#resultA').text(html);
                    $('#resultB').text(text);
                    $('#paste').blur().remove();
                }, 1);
            }).focus();
        }
    });

    $('#data').html('os: ' + $.client.os + ' browser: ' + $.client.browser);
});

html - 再次查看jsfiddle是否有工作副本

<p>Click in this window and do a paste (ctrl-v or cmd-v). The pasted text will show up in the boxes below. I hope... the left box will be the HTML and the right box will be the TEXT.</p>

<div id="status"></div>
<div id="data"></div>

<div id="resultA"></div>
<div id="resultB"></div>

1 个答案:

答案 0 :(得分:0)

不是完整答案,而是我的部分经验:

  1. 您可以删除$.client.os并使用e.which == 86 && (e.metaKey || e.ctrlKey)

  2. 您在document上绑定了活动。在div[contenteditable="true"]上绑定活动 - 可能有帮助

  3. 您的代码:attr('contenteditable', '')contenteditable可以是truefalseinherit(=从父级获取价值)