首页  >  文章  >  web前端  >  复制剪贴板功能--ZeroClipboard_html/css_WEB-ITnose

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

WBOY
WBOY原创
2016-06-24 11:24:521127浏览

复制剪贴板功能分为两部分: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 < classes.length; k++) {                    if (classes[k] == name) { idx = k; k = classes.length; }                }                if (idx > -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 += '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';        }        else {            // all other browsers get an EMBED tag            html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';        }        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 < len; idx++) {                var func = this.handlers[eventName][idx];                            if (typeof(func) == 'function') {                    // actual function reference                    func(this, args);                }                else if ((typeof(func) == 'object') && (func.length == 2)) {                    // PHP style object + method, i.e. [myObject, 'myMethod']                    func[0][ func[1] ](this, args);                }                else if (typeof(func) == 'string') {                    // name of function                    window[func](this, args);                }            } // foreach event handler defined        } // user defined handler for event    }    };

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn