欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  web前端

复制剪贴板功能--ZeroClipboard_html/css_WEB-ITnose

程序员文章站 2022-06-12 14:53:00
...
复制剪贴板功能分为两部分:ie 浏览器和非 ie 浏览器,ie 浏览器可以使用 clipboardData 对象,而非 ie 浏览器则利用 flash 与 js 的结合来实现,即 ZeroClipboard.js。

clipboardData 对象

clipboardData 对象只有 ie 浏览器认识,该对象有 3 个方法: clearData, getData和 setData。

方法 描述
clearData 通过 dataTransfer 或 clipboardData 对象从剪贴板删除一种或多种数据格式。
getData 通过 dataTransfer 或 clipboardData 对象从剪贴板获取指定格式的数据。
setData 以指定格式给 dataTransfer 或 clipboardData 对象赋予数据。

ZeroClipboard.js

对于非 ie 浏览器我们可以使用 ZeroClipboard.js。

实现原理

利用透明的 flash 覆盖在复制按钮上,点击 flash,将复制内容传入到 flash 中,再通过 flash 把传入的内容写到剪贴板上。

使用方法

首先需要把 flash 和 js 放到同一目录下,然后引用 js。如果 flash 和 js 不在同一目录,可以通过 ZeroClipboard.setMoviePath('Flash路径');来设置 flash 路径,或者修改源码中的 moviePath。

function clipboard(text, button, msg, parent) {    var clip = new ZeroClipboard.Client(); // 新建一个对象    clip.setHandCursor(true);    clip.setText(text); // 设置要复制的文本。    clip.addEventListener('mouseUp', function(client) {        alert(msg);    });    // 注册一个 button,参数为 id。点击这个 button 就会复制。    //这个 button 不一定是 input 按钮,也可以是其他 DOM 元素。    clip.glue(button, parent);}

参数说明

  • text:需要复制的文本内容
  • button:需要绑定复制功能的元素 id
  • msg:复制内容后 alert 的信息
  • parent:复制按钮(DOM 元素)所在的父层的 id,如果没有该 id,默认为 body

综上所述

function clipboard(text, button, msg, parent) {    if(window.clipboardData) {	//for ie        var oBtn = document.getElementById(button);        oBtn.onclick = function() {            window.clipboardData.setData('text', text);            alert(msg);        }    } else {        var clip = new ZeroClipboard.Client();        clip.setHandCursor(true);        clip.setText(text);        clip.addEventListener('mouseUp', function(client) {            alert(msg);        });        clip.glue(button, parent);    }    return false;}

ZeroClipboard.js 源码

// Simple Set Clipboard System// Author: Joseph Huckabyvar ZeroClipboard = {        version: "1.0.7",    clients: {}, // registered upload clients on page, indexed by id    moviePath: 'ZeroClipboard.swf', // URL to movie    nextId: 1, // ID of next movie        $: function(thingy) {        // simple DOM lookup utility function        if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);        if (!thingy.addClass) {            // extend element with a few useful methods            thingy.hide = function() { this.style.display = 'none'; };            thingy.show = function() { this.style.display = ''; };            thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };            thingy.removeClass = function(name) {                var classes = this.className.split(/\s+/);                var idx = -1;                for (var k = 0; k  -1) {                    classes.splice( idx, 1 );                    this.className = classes.join(' ');                }                return this;            };            thingy.hasClass = function(name) {                return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );            };        }        return thingy;    },        setMoviePath: function(path) {        // set path to ZeroClipboard.swf        this.moviePath = path;    },        dispatch: function(id, eventName, args) {        // receive event from flash movie, send to client         var client = this.clients[id];        if (client) {            client.receiveEvent(eventName, args);        }    },        register: function(id, client) {        // register new client to receive events        this.clients[id] = client;    },        getDOMObjectPosition: function(obj, stopObj) {        // get absolute coordinates for dom element        var info = {            left: 0,             top: 0,             width: obj.width ? obj.width : obj.offsetWidth,             height: obj.height ? obj.height : obj.offsetHeight        };        while (obj && (obj != stopObj)) {            info.left += obj.offsetLeft;            info.top += obj.offsetTop;            obj = obj.offsetParent;        }        return info;    },        Client: function(elem) {        // constructor for new simple upload client        this.handlers = {};                // unique ID        this.id = ZeroClipboard.nextId++;        this.movieId = 'ZeroClipboardMovie_' + this.id;                // register client with singleton to receive flash events        ZeroClipboard.register(this.id, this);                // create movie        if (elem) this.glue(elem);    }};ZeroClipboard.Client.prototype = {        id: 0, // unique ID for us    ready: false, // whether movie is ready to receive events or not    movie: null, // reference to movie object    clipText: '', // text to copy to clipboard    handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor    cssEffects: true, // enable CSS mouse effects on dom container    handlers: null, // user event handlers        glue: function(elem, appendElem, stylesToAdd) {        // glue to DOM element        // elem can be ID or actual DOM element object        this.domElement = ZeroClipboard.$(elem);                // float just above object, or zIndex 99 if dom element isn't set        var zIndex = 9999;        if (this.domElement.style.zIndex) {            zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;        }                if (typeof(appendElem) == 'string') {            appendElem = ZeroClipboard.$(appendElem);        }        else if (typeof(appendElem) == 'undefined') {            appendElem = document.getElementsByTagName('body')[0];        }                // find X/Y position of domElement        var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem);                // create floating DIV above element        this.div = document.createElement('div');        var style = this.div.style;        style.position = 'absolute';        style.left = '' + box.left + 'px';        style.top = '' + box.top + 'px';        style.width = '' + box.width + 'px';        style.height = '' + box.height + 'px';        style.zIndex = zIndex;                if (typeof(stylesToAdd) == 'object') {            for (addedStyle in stylesToAdd) {                style[addedStyle] = stylesToAdd[addedStyle];            }        }                // style.backgroundColor = '#f00'; // debug                appendElem.appendChild(this.div);                this.div.innerHTML = this.getHTML( box.width, box.height );    },        getHTML: function(width, height) {        // return HTML for movie        var html = '';        var flashvars = 'id=' + this.id +             '&width=' + width +             '&height=' + height;                    if (navigator.userAgent.match(/MSIE/)) {            // IE gets an OBJECT tag            var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';            html += '







';        }        else {            // all other browsers get an EMBED tag            html += '';        }        return html;    },        hide: function() {        // temporarily hide floater offscreen        if (this.div) {            this.div.style.left = '-2000px';        }    },        show: function() {        // show ourselves after a call to hide()        this.reposition();    },        destroy: function() {        // destroy control and floater        if (this.domElement && this.div) {            this.hide();            this.div.innerHTML = '';                        var body = document.getElementsByTagName('body')[0];            try { body.removeChild( this.div ); } catch(e) {;}                        this.domElement = null;            this.div = null;        }    },        reposition: function(elem) {        // reposition our floating div, optionally to new container        // warning: container CANNOT change size, only position        if (elem) {            this.domElement = ZeroClipboard.$(elem);            if (!this.domElement) this.hide();        }                if (this.domElement && this.div) {            var box = ZeroClipboard.getDOMObjectPosition(this.domElement);            var style = this.div.style;            style.left = '' + box.left + 'px';            style.top = '' + box.top + 'px';        }    },        setText: function(newText) {        // set text to be copied to clipboard        this.clipText = newText;        if (this.ready) this.movie.setText(newText);    },        addEventListener: function(eventName, func) {        // add user event listener for event        // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel        eventName = eventName.toString().toLowerCase().replace(/^on/, '');        if (!this.handlers[eventName]) this.handlers[eventName] = [];        this.handlers[eventName].push(func);    },        setHandCursor: function(enabled) {        // enable hand cursor (true), or default arrow cursor (false)        this.handCursorEnabled = enabled;        if (this.ready) this.movie.setHandCursor(enabled);    },        setCSSEffects: function(enabled) {        // enable or disable CSS effects on DOM container        this.cssEffects = !!enabled;    },        receiveEvent: function(eventName, args) {        // receive event from flash        eventName = eventName.toString().toLowerCase().replace(/^on/, '');                        // special behavior for certain events        switch (eventName) {            case 'load':                // movie claims it is ready, but in IE this isn't always the case...                // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function                this.movie = document.getElementById(this.movieId);                if (!this.movie) {                    var self = this;                    setTimeout( function() { self.receiveEvent('load', null); }, 1 );                    return;                }                                // firefox on pc needs a "kick" in order to set these in certain cases                if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {                    var self = this;                    setTimeout( function() { self.receiveEvent('load', null); }, 100 );                    this.ready = true;                    return;                }                                this.ready = true;                this.movie.setText( this.clipText );                this.movie.setHandCursor( this.handCursorEnabled );                break;                        case 'mouseover':                if (this.domElement && this.cssEffects) {                    this.domElement.addClass('hover');                    if (this.recoverActive) this.domElement.addClass('active');                }                break;                        case 'mouseout':                if (this.domElement && this.cssEffects) {                    this.recoverActive = false;                    if (this.domElement.hasClass('active')) {                        this.domElement.removeClass('active');                        this.recoverActive = true;                    }                    this.domElement.removeClass('hover');                }                break;                        case 'mousedown':                if (this.domElement && this.cssEffects) {                    this.domElement.addClass('active');                }                break;                        case 'mouseup':                if (this.domElement && this.cssEffects) {                    this.domElement.removeClass('active');                    this.recoverActive = false;                }                break;        } // switch eventName                if (this.handlers[eventName]) {            for (var idx = 0, len = this.handlers[eventName].length; idx