To solve your specific problem I managed to get your JavaScript code to execute without any error in this version:
javascript:(function(){function text(){this.type="text"};function password(){this.type="password"};function addHandlers(){var e=false;var t=document.evaluate("//input[@type='password']",document,null,6,null);for(var n=t.snapshotLength-1,r;r=t.snapshotItem(n);n--){if(!e){r.addEventListener("mouseover",text,false);r.addEventListener("mouseout",password,false)}else{r.addEventListener("focus",text,false);r.addEventListener("blur",password,false)}}};addHandlers();alert("bookmarklet loaded");})();
To see if your code works, I added an alert("bookmarklet loaded");
at the end of the bookmarklet. So you can try and should - since I tested on Firefox 17- see as a result a messagebox appears. If your code works or does not work I am unable to say, but of course this was not the question.
There are some things you can keep in mind or make transformation of JavaScript code within <script></script>
tags easier to be adopted for a bookmarklet
- In normal JavaScript code a newline can separate two commands. Bookmarklets are in one line so substitute the linebreak with a semicolon ;.
An example here
Let's have an example. Let's have two sourcecode snippets with two instructions:
var anumber=1
var atext="hallo"
When put all in one line (= make the linebreak to whitespaces) you would first end up with this:
var anumber=1 var atext="hallo"
This is not valid JavaScript code anymore. If you want to combine two instructions in one line you need to separate/delimit the two instructions by using a semicolon like this:
var anumber=1; var atext="hallo"
- Wrap all you code in kind of this kind of closure:
javascript:(function(){ [...here your code...] })();
There are quite some websites out there to investigate the solution. Like here.
Best Answer
You could change window.location property which specifies the current location of the document you are viewing. A simple replace can work: