I have a copy text button that I'm using ZeroClipboard with in order to copy certain text on the page. It works in Chrome and IE but it doesn't copy text in Firefox and the `complete` event is never fired.

My JavaScript for setting up the button looks something like this:

```
ZeroClipboard.setDefaults({
  moviePath: '/js/zeroclipboard/ZeroClipboard.swf',
  allowScriptAccess: 'always',
  forceHandCursor: true
});

function enableCopyButton(container) {
  var button = container.find('.text-copy'),
      source = container.find('.text'),
      clip = new ZeroClipboard(button);

  clip.setText(source.val());

  clip.on('load', function (client) {
    console.log('ZeroClipboard loaded.');

    client.on('complete', function (client, args) {
      console.log('Text copied: ' + args.text);
    });
  });

  clip.on('noFlash', function () {
    console.error('No Flash installed!');
  });
  clip.on('wrongFlash', function () {
    console.error('Wrong Flash installed!');
  });
}

```

The console ends up showing `"ZeroClipboard loaded."` and nothing else. No errors are thrown, and I've confirmed that `ZeroClipboard.swf` is being loaded and placed on the page. The `mousedown` and `mouseup` events are being fired, as well. The page this is running on is using a valid SSL certificate, and all assets on the page are loaded via HTTPS.

The library's demo page on GitHub works fine in FireFox, so I suspect it's something I'm doing.
['https://Stackoverflow.com/questions/18342961', 'https://Stackoverflow.com', 'https://Stackoverflow.com/users/784368/']
I'm not sure if this would help, but recently I have been working on using zeroclipboard for more than a month. Sometimes it works but sometimes it fails due to some very tiny things(maybe because I'm very new to javascript and html stuff)...and I understand the upset very well...

In your case, have you ever tried this event before?
Instead using clip.setText(source.val()) alone, move it inside a 'dataRequested' event like this:

```
clip.on('dataRequested', function(client, args) {
    client.setText(source.val());
});

```

Then after clicking on the button, see if the complete event gets fired. 

BTW, I'm wondering if your 'noflash' or 'wrongflash' got fired normally? In my case, if users don't have flash installed, the event is still not fired...not sure what's wrong with it...

Anyways, good luck :)
My dev environment:

* .NET 4.5
* ASP.NET MVC4 with Razor engine
* jQuery

Here is what I did to get Copy to Clipboard to work across 5 browsers:

* FF 23
* IE 10
* Chrome 29
* Safari 5.1.7
* Opera 16

My scenario:
The text I want to copy to clipboard is generated an put in a Div along with html breaks (br).
For the Copy, I needed to remove these html breaks and replace them with /r/n.
The copy is via a Button click.

Not this might not be the best way to code this up but it worked for me.

Grab latest ZeroClipboard from [github](https://github.com/zeroclipboard/zeroclipboard)

In my .cshtml file, I define the button and div and include the ZeroClipboard.min.js file.

```
<!-- language-all: lang-html -->
<button id="btCopyToClipboard" name="btCopyToClipboard" type="button">Copy To Clipboard</button>
<div id="Basket" ></div>

```

Javascript portion:

```
<!-- language: lang-js -->
<script type="text/javascript">
    $(document).ready(function () {
        //"style" the buttons
        $("#btCopyToClipboard").button();   

        //ZeroClipboard code
        var clip = new ZeroClipboard(document.getElementById('btCopyToClipboard'), {
            moviePath: "/Scripts/ZeroClipboard.swf",  // URL to movie
            trustedOrigins: null, //null Page origins that the SWF should trust (single string or array of strings)
            hoverClass: "",   // The class used to hover over the object
            activeClass: "",  // The class used to set object active
            allowScriptAccess: "always",               //sameDomain SWF outbound scripting policy
            useNoCache: true,                       // Include a nocache query parameter on requests for the SWF
            forceHandCursor: true                       //false Forcibly set the hand cursor ("pointer") for all glued elements
        });
        //if just using var clip = new ZeroClipboard(); then need to use .glue(..)
        //clip.glue(document.getElementById('btCopyToClipboard'));
        clip.on('load', function (client, args) {
            DebugLog("ZeroClipboard.swf is loaded and user's flash version is: " + args.flashVersion);
        });

        //The complete event is fired when the text is successfully copied to the clipboard.
        clip.on('complete', function (client, args) {
            //alert("clip.onComplete(..) -- Copied text to clipboard args.text: " + args.text);
        });

        clip.on('mouseover', function (client) {
            // alert("mouse over");
        });

        clip.on('mouseout', function (client) {
            //alert("mouse out");
        });

        clip.on('mousedown', function (client) {
            //alert("mouse down");
        });

        clip.on('mouseup', function (client) {
            //alert("mouse up");
        });

        clip.on('dataRequested', function (client, args) {
            //get text from basket
            var txt = $("#Basket").html();
            //to make Notepad honour line breaks, we have to do some magic
            var windowsText = txt.replace(/\n/g, '\r\n');
            //replace html break with line breaks
            windowsText = windowsText.replace(/<br\s*\/?>/g, "\r\n");
            client.setText(windowsText);
        });

        clip.on('noflash', function (client, args) {
            var msg = "You don't support flash, therefore the Copy To Clipboard will not work.";
            DebugLog(msg);
            alert(msg);
        });
        clip.on('wrongflash', function (client, args) {
            var msg = 'Your flash is too old ' + args.flashVersion + '.  The Copy To Clipboard supports version 10 and up.';
            DebugLog(msg);
            alert(msg);
        });

        function DebugLog(message) {
            if (console && console.log) {
                console.log(message);
            }
        }
    });//eof $(document).ready
</script>

```