0

私はzeroclipboardを使用して、ユーザースクリプト内のかなり大きなリストの各行に「コピー」リンクを追加しています。これを実現するために、このページにリストされているものと同様のメソッドを使用します。このメソッドでは、ユーザーが行にマウスを合わせると、各行のZeroClipboard.Client()要素が作成されます。これはFireFoxではうまく機能しますが、Chromeでは機能しません。

また、メモとして、ZeroClipboard.jsファイルの内容を、外部ファイルに含めるのではなく、ユーザースクリプト自体にコピーしました。

各要素のコピーボタンを作成するマークアップは次のとおりです
<span style="color:blue; text-decoration:underline; cursor:pointer" id="copy_'+id+'" class="CopyLink" link="'+url+'" onmouseover="clipboard.add(this)">Copy</span>

クリップボードのクライアントオブジェクトを追加するコードセグメントは次のとおりです。

function main(){
    window.clipboard = {
        load: function (){
            if(!clipboard.initialized){
                ZeroClipboard.setMoviePath("http://www.swfcabin.com/swf-files/1343927328.swf");
                clipboard.initialized=true;
                console.log("Clipboard intialized");
            }
        },
        add: function(element){
            clipboard.load();
            var clip = new ZeroClipboard.Client();
            console.log('Clipboard client loaded: ' + element.id);

            clip.glue(element, element.parentNode);
            console.log('Clipboard glued: ' + element.id);

            clip.setText(element.getAttribute('link'));
            console.log('Clipboard text set: ' + element.getAttribute('link'));

            clip.addEventListener('complete',function(client,text) {
                console.log('Clipboard copied: ' + text);//doesn't fire in chrome
            });

            clip.addEventListener('load',function(client) {
                console.log('Clipboard loaded: ' + element.getAttribute('link'));
            });
        }        
    }
    //other code in user script including injecting above markup
    //as well as contents of ZeroClipboard.js
    window.ZeroClipboard = { ... }
}

var script = document.createElement("script");
script.appendChild(document.createTextNode('('+main+')()'));
(document.head || document.body || document.documentElement).appendChild(script);

このブロックでは、マウスオーバーしてコピースパンをクリックすると、FireFoxですべてのconsole.logが起動しますが、Chromeでは、「完全な」リスナーを除いてすべて起動します。このページの例を使用して、ZeroClipboardがChromeで機能していることを確認できました。また、フラッシュオブジェクトがページの正しい場所に追加されていることを確認できますが、クリックに応答していません。

ゼロクリップボードコードはサイトによるともはや維持されていないので、私はそこにいる誰かが私を助けてくれることを望んでいます。マウスオーバー時にChromeに埋め込まれたフラッシュオブジェクトを動的に追加することに問題があるのではないか、またはChromeのユーザースクリプトとGreasemonkeyを使用したFirefoxの違いがあると思いますか?どんな助けでも大歓迎です、ありがとう

4

2 に答える 2

1

その背後にある理由はわかりませんが、Chromeでもこれに遭遇しています。2つのゼロクリップボードの実装がありました。1つはページの読み込み時に表示され、もう1つはユーザーがダイアログを開いたときにのみ表示されました。ページの読み込み時に表示されたものは期待どおりに機能しましたが、もう1つは機能しませんでした。この問題を「解決」するには、ゼロクリップボードリンクをレンダリングし、その絶対位置を画面外(-500 px)に設定してから、ダイアログが開いたときにリンクを所定の位置に移動するJavaScriptを追加する必要がありました。これは醜い解決策ですが、Chromeで機能させる唯一の方法だと思います。あなたのページにはダイナミックなゼロクリップボードがたくさんあるのに、私は1つしか持っていなかったので、あなたのケースは特に毛深いですが、これがうまくいかない理由はないようです。

于 2012-08-21T22:10:25.933 に答える
0
<!-- <script type="text/javascript" src="http://davidwalsh.name/demo/ZeroClipboard.js"></script> -->
    function copyText(fieldName,buttonName){
        var fieldNameTemp =fieldName;
        var buttonNameTemp =buttonName;
        var val = "";
        try{
            val = navigator.userAgent.toLowerCase();
        }catch(e){}
        var swfurl = "js/ZeroClipboard.swf";
        setTimeout(function () {
            ZeroClipboard.setMoviePath(swfurl);
            var clip = new ZeroClipboard.Client();
            clip.addEventListener('mousedown', function () {
                clip.setText(document.getElementById(fieldNameTemp).value);
            });
            clip.addEventListener('complete', function (client, text) {
                try{
                    if(val.indexOf("opera") > -1 || val.indexOf("msie") > -1 || val.indexOf("safari") > -1 || val.indexOf("chrome") > -1){
                        alert('Your text has been copied');
                    }
                }catch(e){
                    alert('Please alert not use on fireFox');
                }
            });
            clip.glue(buttonNameTemp);
        }, 2000);
    }
于 2013-01-23T11:52:17.977 に答える