将JavaScript转换为Greasemonkey脚本

时间:2011-08-15 13:13:05

标签: javascript greasemonkey

我对编程非常陌生,而且我已经阅读了" Diving into Greasemonkey"中的很多例子。预订(Mark Pilgrim),但我无法解决这个问题。

我基本上需要将以下代码转换为可以在给定网站上运行的Greasemonkey脚本。我看到这些代码发布在其他地方,它的作用是在任何页面上创建一个可切换的URL栏。

所以基本上你可以使用这个JavaScript URL栏而不是浏览器的URL栏。您通常通过执行http://www.site-with-script.com/?url=www.google.com来运行它(在这种情况下,它会将可切换的网址栏放在Google页面的顶部)。

我在Greasemonkey中尝试了一些innerHTML和CSS的东西,但是我无法让它工作。 JavaScript代码100%有效。我只是不确定如何让它作为Greasemonkey脚本工作。我希望Greasemonkey脚本在加载脚本时在每个页面上放置相同的URL栏:

    <head>
        <style type="text/css">
            html, body {
                margin: 0;
                padding: 0;
                width: 100%;
                height: 100%;
                min-height: 100%;
                background: #BBB;
                color: #222;
                text-shadow: 0 1px 0 rgba(255,255,255,0.5);
                -moz-text-shadow: 0 1px 0 rgba(255,255,255,0.5);
                -webkit-text-shadow: 0 1px 0 rgba(255,255,255,0.5);
                overflow: hidden;
            }

            #div_frameHolder {
                display: block;
                position: absolute;
                left: 0;
                top: 0;
                width: 100%;
                height: 100%;
                background: #FFF;
                border: none;
                z-index: 100;
            }

            iframe.iframe_tab {
                display: block;
                position: absolute;
                left: 0;
                top: 0;
                width: 100%;
                height: 100%;
                background: #FFF;
                border: none;
                z-index: 100;
            }

            .toolbar {
                display: none;
                position: absolute;
                left: 0;
                top: 0;
                width: 100%;
                height: 22px;
                background: rgba(0,0,0,0.8);
                border: none;
                border-bottom: 1px solid rgb(0,0,0);
                box-shadow: 0 -3px 10px #000;
                -moz-box-shadow: 0 -3px 10px #000;
                -webkit-box-shadow: 0 -3px 10px #000;
                overflow: hidden;
                z-index: 600;
            }

            .toolbar .bottom {
                position: absolute;
                left: 0;
                bottom: 0;
                width: 100%;
                height: 1px;
                background: #777;
                border: none;
                overflow: hidden;
                font-size: 1px;
            }

            #btn_showToolbar, #btn_hideToolbar {
                position: absolute;
                left: 0;
                top: 0;
                display: block;
                width: 22px;
                height: 22px;
                background: url('img/show-toolbar.png') center no-repeat;
                border: none;
                cursor: pointer;
                z-index: 500;
            }
            body #btn_hideToolbar {
                position:relative;
                float: left;
                clear: none;
            }

            #text_locationBar {
                position: relative;
                display: block;
                width: 400px;
                height: 18px;
                float: left;
                clear: none;
                padding: 0;
                margin: 1px 2px 0;
                background: rgba(150,150,150,0.8);
                border: 1px solid rgba(255,255,255,0.5);
                color: #FFF;
                text-shadow: 0 -1px 0 rgba(0,0,0,0.5);
                -moz-text-shadow: 0 -1px 0 rgba(0,0,0,0.5);
                -webkit-text-shadow: 0 -1px 0 rgba(0,0,0,0.5);
                text-indent: 1px;
            }

            #btn_locationGo {
                position: relative;
                display: block;
                width: 22px;
                height: 22px;
                float: left;
                clear: none;
                padding: 0;
                margin: 0 2px;
                background: url('img/go.png') center no-repeat;
                border: none;
                cursor: pointer;
                opacity: 0.7;
                filter: alpha(opacity=70);
            }
            #btn_locationGo:hover {
                opacity: 1;
                filter: alpha(opacity=100);
            }
        </style>


        <script type="text/javascript">
            window.urlbar = (function() {
                var self        = {},
                    initialized    = false,
                    showing        = false,
                    tabs        = [],
                    tabMaxId    = 0,
                    homeUrl        = null,
                    toolbar,
                    showBtn,
                    hideBtn,
                    locationBar,
                    locationGo,
                    frameHolder;

                function el(id) {
                    return document.getElementById(id);
                }

                function vis(el, visible) {
                    el.style.display = visible===false ? "none" : "block";
                }

                function addEvent(obj, type, fn) {
                    if ( obj.attachEvent ) {
                        obj['e'+type+fn] = fn;
                        obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
                        obj.attachEvent( 'on'+type, obj[type+fn] );
                    } else
                        obj.addEventListener( type, fn, false );
                }

                function removeEvent( obj, type, fn ) {
                    if ( obj.detachEvent ) {
                        obj.detachEvent( 'on'+type, obj[type+fn] );
                        obj[type+fn] = null;
                    } else
                        obj.removeEventListener( type, fn, false );
                }

                function stopEvent(e) {
                    e = e || window.event;
                    if (e.preventDefault) {
                        e.preventDefault();
                    }
                    if (e.cancelBubble) {
                        e.cancelBubble();
                    }
                    e.returnValue = false;
                    return false;
                }

                function init() {
                    if (initialized===true) {
                        return false;
                    }
                    initialized = true;

                    toolbar = el("urlbar_toolbar");
                    showBtn = el("btn_showToolbar");
                    hideBtn = el("btn_hideToolbar");
                    locationBar = el("text_locationBar");
                    locationGo = el("btn_locationGo");
                    frameHolder = el("div_frameHolder");

                    addEvent(showBtn, "mousedown", stopEvent);
                    addEvent(showBtn, "click", function() {
                        self.showToolbar();
                        return stopEvent.apply(this,arguments);
                    });

                    addEvent(hideBtn, "mousedown", stopEvent);
                    addEvent(hideBtn, "click", function() {
                        self.hideToolbar();
                        return stopEvent.apply(this,arguments);
                    });

                    addEvent(locationGo, "mousedown", stopEvent);
                    addEvent(locationGo, "click", function() {
                        var didNavigate = self.navigate(locationBar.value);
                        if (didNavigate) {
                            self.hideToolbar();
                        }
                        return stopEvent.apply(this,arguments);
                    });

                    addEvent(locationBar, "keydown", function(e) {
                        e = e || window.event;
                        var key = e.keyCode || e.which;
                        var rval = true;
                        switch (key) {
                            case 13:        // enter
                                var didNavigate = self.navigate(locationBar.value);
                                if (didNavigate) {
                                    self.hideToolbar();
                                }
                                rval = false;
                            break;
                        }
                        if (rval===false) {
                            return stopEvent.apply(this,arguments);
                        }
                    });

                    var getHomeUrl = window.location.href.match(/[\?&](url|location)\=(.+)$/);
                    homeUrl = (getHomeUrl && getHomeUrl[2]) || null;

                    if (homeUrl) {
                        self.navigate(homeUrl);
                    }
                    else {
                        self.showToolbar();
                    }

                    tabs.push({
                        navigate : function(url) {
                            this.iframe.src = url;
                        },
                        iframe : el("iframe_tab_0")
                    });
                }

                function doResize() {
                    var w = window.innerWidth || (document.documentElement||document.body).offsetWidth;
                    if (showing===true) {
                        locationBar.style.width = (w - locationGo.offsetWidth - hideBtn.offsetWidth - 20) + "px";
                    }
                }

                function openTab(options) {
                    options = options || {};
                    var iframe = document.createElement("iframe");
                    iframe.setAttribute("frameborder", "0");
                    iframe.className = "iframe_tab";
                    if (options.url || options.location) {
                        iframe.setAttribute("src", options.url || options.location);
                    }
                    if (options.focus===true || options.focussed===true) {
                        iframe.style.zIndex = "200";
                    }

                    var tab = {
                        id : tabMaxId++,
                        iframe : iframe,
                        navigate : function(url) {
                            if (url) {
                                this.iframe.src = url;
                            }
                        },
                        stop : function() {
                            this.iframe.contentWindow.stop();
                        },
                        back : function() {
                            this.iframe.contentWindow.back();
                        },
                        forward : function() {
                            this.iframe.contentWindow.forward();
                        }
                    };

                    tabs.push(tab);

                    frameHolder.appendChild(iframe);

                    return tab;
                }


                self.navigate = function (url, options) {
                    options = options || {};
                    url = url || options.url || options.location;
                    if (!url) {
                        return false;
                    }

                    if (url.indexOf("://")<0) {
                        url = "http://" + url;
                    }

                    var tab = Math.round(options.tab) || 0;

                    if (tabs[tab]) {
                        tabs[tab].navigate(url);
                    }
                    else {
                        openTab({
                            url : url,
                            focus : true
                        });
                    }
                    return true;
                };

                self.showToolbar = function () {
                    vis(toolbar, true);
                    vis(showBtn, false);
                    showing = true;
                    doResize();
                };

                self.hideToolbar = function () {
                    vis(toolbar, false);
                    vis(showBtn, true);
                    showing = false;
                };

                addEvent(window, "load", function() {
                    init();
                });

                addEvent(document, "load", function() {
                    init();
                });

                addEvent(window, "resize", function() {
                    doResize();
                });

                return self;
            }());
        </script>
    </head>
    <body>
        <div id="urlbar_toolbar" class="toolbar">
            <a id="btn_hideToolbar" class="toolbar_closebutton" href="#hide-tooblar" title="Hide Toolbar"></a>

            <input id="text_locationBar" type="text" value="" />
            <a id="btn_locationGo" href="#go" title="Go to the location in the address bar"></a>
        </div>
        <a id="btn_showToolbar" class="floating_button" href="#show-toolbar" title="Show Toolbar"></a>
        <div id="div_frameHolder"></div>
        <!--<iframe id="iframe_tab_0" class="webview" src="" frameborder="0"></iframe>-->
    </body>
</html>

1 个答案:

答案 0 :(得分:0)

只有比较标准JavaScript和Greasemonkey才有所不同,它是原点或回调函数。

标准JavaScript代码源是当前的浏览器窗口,但Greasemonkey脚本在“另一个维度”中工作。要在Greasemonkey脚本中使用浏览器窗口,您需要对其使用回调,在Greasemonkey中称为unsafeWindow。因此,如果您想使用在浏览器中加载的jQuery代码,请通过unsafeWindow.jquery.stuff()调用它。

您可以在their wiki page中了解更多相关信息。