Wednesday, 27 April 2016

onPaste clipboardData cross brouser support


Some of the current browsers support a clipboardData property as part of a paste event. This should allow you to query the different data formats created from the current data on the clipboard. Safari and Chrome have the best support, but it is still incomplete. Firefox has no support if you discount using the XPCOM objects interface. The IE interface is older and only supports Text or URL data.
Firefox, Safari IE and Chrome all sanitise any HTML being pasted. Opera will only paste plain text so HTML sanitisation is not an issue. Some earlier version of IE could cause some security issues as they copy hyperlinks in full. Try copying and pasting this paragraph and link into the box below.


  • Not supported in Firefox
  • Supported in Chrome
  • Supported in Safari
  • Supported in IE
  • Not supported in Opera

window.addEventListener('load', function (e) {

    var node = document.getElementById('edit-box');

    node.onpaste = function (e) {
        log('paste');
        if (e.clipboardData) {
            log('event.clipboardData');
            if (e.clipboardData.types) {
                log('event.clipboardData.types');

                // Look for a types property that is undefined
                if (!isArray(e.clipboardData.types)) {
                    log('event.clipboardData.types is undefined');
                }

                // Loop the data store in type and display it
                var i = 0;
                while (i < e.clipboardData.types.length) {
                    var key = e.clipboardData.types[i];
                    var val = e.clipboardData.getData(key);
                    log((i + 1) + ': ' + key + ' - ' + val);
                    i++;
                }

            } else {
                // Look for access to data if types array is missing 
                var text = e.clipboardData.getData('text/plain');
                var url = e.clipboardData.getData('text/uri-list');
                var html = e.clipboardData.getData('text/html');
                log('text/plain - ' + text);
                if (url !== undefined) {
                    log('text/uri-list - ' + url);
                }
                if (html !== undefined) {
                    log('text/html - ' + html);
                }
            }
        }

        // IE event is attached to the window object
        if (window.clipboardData) {
            log('window.clipboardData');
            // The schema is fixed
            var text = window.clipboardData.getData('Text');
            var url = window.clipboardData.getData('URL');
            log('Text - ' + text);
            if (url !== null) {
                log('URL - ' + url);
            }
        }

        // Needs a few msec to excute paste
        window.setTimeout(logContents, 50, true);

    };

    // Button events
   var btn = document.getElementById('clear-logs');
    btn.onclick = function (e) {
        clearLog();
    };
});


function logContents() {
    var node = document.getElementById('edit-box');
    log('Current contents - ' + node.innerHTML);
}

function log(str) {
    var node = document.getElementById('log-box');
    var li = document.createElement('li')
    li.appendChild(document.createTextNode(str));
    node.appendChild(li);
}

function clearLog() {
    var node = document.getElementById('log-box');
    while (node.firstChild) {
        node.removeChild(node.firstChild);
    }
}

function isArray(obj) {
    return obj && !(obj.propertyIsEnumerable('length')) && 
        typeof obj === 'object' && typeof obj.length === 'number';
};            


No comments:

Post a Comment