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);

在此块中,当我将鼠标悬停并单击复制范围时,每个 console.log 都会在 FireFox 中触发,但在 chrome 中,除了“完整”侦听器触发之外的所有内容。通过使用此页面上的示例,我能够验证 ZeroClipboard 是否在我的 Chrome 中工作。我还能够验证 Flash 对象是否被添加到页面中的正确位置,但它根本没有响应点击。

由于该站点不再维护 zeroclipboard 代码,因此我希望有人可以帮助我。我认为在鼠标悬停时动态添加 chrome 中的嵌入式 Flash 对象可能存在一些问题,或者 chrome 与 firefox 中的用户脚本与greasemonkey 之间可能存在一些差异?任何帮助将不胜感激,谢谢

4

2 回答 2

1

我不确定它背后的原因,但我也在 Chrome 上遇到了这个问题。我有两个 zeroclipboard 实现,一个在页面加载时可见,一个仅在用户打开对话框时可见。在页面加载时可见的一个按预期工作,但另一个没有。为了“解决”这个问题,我必须渲染 zeroclipboard 链接,将其绝对位置设置为离开屏幕(-500 像素),然后添加一些 javascript 以在对话框打开时将链接移动到位。这是一个丑陋的解决方案,但我认为这是让它在 Chrome 中工作的唯一方法。您的情况特别棘手,因为您的页面上有很多动态零剪贴板,而我只有一个,但在我看来,这没有理由不适合您。

于 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 回答