обзор работы с JavaScript - захват паст в браузер


Я ищу обзор мой текущий код. Предполагается захватить вставить в окно браузера, независимо от элемента, имеющего фокус. Это не окончательная форма, как я буду преобразовывать его в плагин jQuery, но я ищу обзор логику кода.

jfiddle: http://jsfiddle.net/JgU37/44/

$(document).ready(function() {
    // Fake paste
    var doFakePaste = false;
    $(document).on('keydown', function(e) {
        $('#status').html('metaKey: ' + e.metaKey + 
                          ' ctrlKey: ' + e.ctrlKey + 
                          ' which: ' + e.which);

        // These browser work with the real paste event
        if ($.client.browser === "Chrome")
            return;
        if ($.client.os === "Windows" && $.client.browser === "Safari")
            return;

        // Check for patse keydown event
        if (!doFakePaste &&
            ($.client.os === "Mac" && e.which == 86 && e.metaKey) ||
            ($.client.os !== "Mac" && e.which == 86 && e.ctrlKey)) {
            doFakePaste = true;
            // got a paste
            if (!$("*:focus").is("input") &&
                !$("*:focus").is("textarea")) {
                $('#status').html('fake paste');

                // Focus the offscreen editable
                $('#TribblePaste').focus();

                // Opera doesn't support onPaste events so we have
                // to use a timeout to get the paste
                if ($.client.browser === "Opera")
                {
                    setTimeout(function() {
                        doFakePaste = false;
                        var html = $('#TribblePaste').html();
                        var text = $('#TribblePaste').text();
                        if (text == '') text = $('#TribblePaste').val();
                        $('#resultA').text('[o] '+html);
                        $('#resultB').text('[o] '+text);
                        $('#TribblePaste').val('');
                        $('#TribblePaste').text('');
                        $('#TribblePaste').blur();
                    }, 1);
                }
            }
        }
    }).on('paste', function (e) {
        // Firefox is not supported - they don't
        // expose the real clipboard
        if ($.client.browser === 'Firefox')
            return;

        $('#status').html('paste event');

        // real pasteing
        var html = '';
        var text = '';
        if (window.clipboardData) // IE
        {  
            text = window.clipboardData.getData("Text");
        }
        if (e.clipboardData && e.clipboardData.getData) // Standard
        {
            text = e.clipboardData.getData('text/plain');
            text = e.clipboardData.getData('text/html');
        }
        if (e.originalEvent.clipboardData &&
            e.originalEvent.clipboardData.getData) // jQuery
        {
            text = e.originalEvent.clipboardData.getData('text/plain');
            html = e.originalEvent.clipboardData.getData('text/html');
        }
        $('#resultA').text(html);
        $('#resultB').text(text);
    });

    // Setup the offscreen paste capture area
    $('<div contenteditable id="TribblePaste"></div>').css({
        'position': 'absolute',
        'top': '-100000px',
        'width': '100px',
        'height': '100px'
    }).on('paste', function(e) {
        setTimeout(function() {
            doFakePaste = false;
            var html = $('#TribblePaste').html();
            var text = $('#TribblePaste').text();
            if (text == '') text = $('#TribblePaste').val();
            $('#resultA').text(html);
            $('#resultB').text(text);
            $('#TribblePaste').val('');
            $('#TribblePaste').text('');
            $('#TribblePaste').blur();
        }, 1);
    }).appendTo('body');

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

На стороне записки, Если вы попробовать его в браузере, это еще не перечисленных (на скрипке), или в тот, что перечислены и получить другой результат, пожалуйста, напишите комментарий :)



2125
3
задан 18 декабря 2011 в 07:12 Источник Поделиться
Комментарии
2 ответа

Вам нужно обнаружить браузером только один раз, не на каждое нажатие.

3
ответ дан 18 декабря 2011 в 09:12 Источник Поделиться

Ты перезаписи в вставить обработчики, вам необходимо цепи еслис ещес:

    // Reverted order to ensure we get the same result as with the previous code version.
if (e.originalEvent.clipboardData &&
e.originalEvent.clipboardData.getData) // jQuery
{
text = e.originalEvent.clipboardData.getData('text/plain');
html = e.originalEvent.clipboardData.getData('text/html');
}
else if (e.clipboardData && e.clipboardData.getData) // Standard
{
text = e.clipboardData.getData('text/plain');
text = e.clipboardData.getData('text/html');
}
else if (window.clipboardData) // IE
{
text = window.clipboardData.getData("Text");
}

0
ответ дан 19 декабря 2011 в 11:12 Источник Поделиться