Inhaltsverzeichnis
clipboardData 对象
ZeroClipboard.js
实现原理
使用方法
参数说明
综上所述
ZeroClipboard.js 源码
Heim Web-Frontend HTML-Tutorial 复制剪贴板功能--ZeroClipboard_html/css_WEB-ITnose

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

Jun 24, 2016 am 11:24 AM

复制剪贴板功能分为两部分: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);}
Nach dem Login kopieren

参数说明

  • 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;}
Nach dem Login kopieren

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    }    };
Nach dem Login kopieren

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was ist der Zweck des & lt; Fortschritts & gt; Element? Was ist der Zweck des & lt; Fortschritts & gt; Element? Mar 21, 2025 pm 12:34 PM

Der Artikel erörtert den HTML & lt; Progress & gt; Element, Absicht, Styling und Unterschiede vom & lt; Meter & gt; Element. Das Hauptaugenmerk liegt auf der Verwendung & lt; Fortschritt & gt; Für Aufgabenabschluss und & lt; Meter & gt; für stati

Was ist der Zweck des & lt; datalist & gt; Element? Was ist der Zweck des & lt; datalist & gt; Element? Mar 21, 2025 pm 12:33 PM

Der Artikel erörtert den HTML & lt; Datalist & gt; Element, das die Formulare verbessert, indem automatische Vorschläge bereitgestellt, die Benutzererfahrung verbessert und Fehler reduziert werden.Character Count: 159

Was sind die besten Praktiken für die Kompatibilität des Cross-Browsers in HTML5? Was sind die besten Praktiken für die Kompatibilität des Cross-Browsers in HTML5? Mar 17, 2025 pm 12:20 PM

In Artikel werden Best Practices zur Gewährleistung der HTML5-Cross-Browser-Kompatibilität erörtert und sich auf die Erkennung von Merkmalen, die progressive Verbesserung und die Testmethoden konzentriert.

Was ist der Zweck des & lt; Meter & gt; Element? Was ist der Zweck des & lt; Meter & gt; Element? Mar 21, 2025 pm 12:35 PM

Der Artikel erörtert das HTML & lt; Meter & gt; Element, verwendet zur Anzeige von Skalar- oder Bruchwerten innerhalb eines Bereichs und seine gemeinsamen Anwendungen in der Webentwicklung. Es differenziert & lt; Meter & gt; von & lt; Fortschritt & gt; und Ex

Wie verwende ich HTML5 -Formularvalidierungsattribute, um die Benutzereingabe zu validieren? Wie verwende ich HTML5 -Formularvalidierungsattribute, um die Benutzereingabe zu validieren? Mar 17, 2025 pm 12:27 PM

In dem Artikel werden unter Verwendung von HTML5 -Formularvalidierungsattributen wie Erforderlich, Muster, Min, MAX und Längengrenzen erörtert, um die Benutzereingabe direkt im Browser zu validieren.

Was ist das Ansichtsfenster -Meta -Tag? Warum ist es wichtig für reaktionsschnelles Design? Was ist das Ansichtsfenster -Meta -Tag? Warum ist es wichtig für reaktionsschnelles Design? Mar 20, 2025 pm 05:56 PM

In dem Artikel wird das Ansichtsfenster -Meta -Tag erörtert, das für das reaktionsschnelle Webdesign auf mobilen Geräten unerlässlich ist. Es wird erläutert, wie die ordnungsgemäße Verwendung eine optimale Skalierung von Inhalten und Benutzerinteraktion gewährleistet, während Missbrauch zu Design- und Zugänglichkeitsproblemen führen kann.

Was ist der Zweck des & lt; iframe & gt; Etikett? Was sind die Sicherheitsüberlegungen bei der Verwendung? Was ist der Zweck des & lt; iframe & gt; Etikett? Was sind die Sicherheitsüberlegungen bei der Verwendung? Mar 20, 2025 pm 06:05 PM

Der Artikel erörtert das & lt; iframe & gt; Der Zweck von Tag, externe Inhalte in Webseiten, seine gemeinsamen Verwendungen, Sicherheitsrisiken und Alternativen wie Objekt -Tags und APIs einzubetten.

Gitee Pages statische Website -Bereitstellung fehlgeschlagen: Wie können Sie einzelne Dateien 404 Fehler beheben und beheben? Gitee Pages statische Website -Bereitstellung fehlgeschlagen: Wie können Sie einzelne Dateien 404 Fehler beheben und beheben? Apr 04, 2025 pm 11:54 PM

GitePages statische Website -Bereitstellung fehlgeschlagen: 404 Fehlerbehebung und Auflösung bei der Verwendung von Gitee ...

See all articles