1

ターゲット/テスト ページ: http://wwwdyn.zdf.de/common/weather/00012.html

このサイトについて何か特別なことはありますか? または私のコードの失敗?

ホットキーは、天気ページを除くすべてのサイトで機能します。すべてのジョブは、天気以外のif()ステートメント内で実行されます (一部を非表示にします)。

Cookie は天気の場所を保存します (天気ページではなく、メイン ページの小さな天気情報)。スポーツ ページで記事のプレビューを開きます。

ホットキーは、含まれているすべてのページで使用できる必要があります。

// ==UserScript==
// @name        heute.de (zdf)
// @version     1.4.2
// @author      unrealmirakulix
// @description optimiert heute.de
// @icon        http://www.heute.de/ZDF/zdfportal/blob/5983926/8/data.png
// @include     http*://www.heute.de/
// @include     http*://www.zdfsport.de/*
// @include     http://wwwdyn.zdf.de/common/weather/00012.html
// @copyright   none
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
// ==/UserScript==

// Handler for .ready() called
if (document.readyState == "complete") {

    // not on weather module
    if ( location.href.indexOf("weather") == -1 ) {
        // hide header + footer
        document.getElementById('header').style.visibility = 'hidden'; // hide #header

        var cf = document.getElementById('footer'); // #footer selection
        cf.style.visibility = 'hidden'; // hide it
        // also hide its children
        if ( cf.hasChildNodes() )   {
            while ( cf.childNodes.length >= 1 )
            {
                cf.removeChild( cf.firstChild );       
            } 
        }

        // different actions @ different subpages
        // ZDF Sport (check if url in address bar contains "zdfsport.de")
        if ( location.href.indexOf("zdfsport.de") > -1 ) {
            $("#a2").click();
            $("#a3").click();
            $("#a4").click();
            $("#a5").click();
        }
        // Heute.de (check if url in address bar contains "heute.de")
        else if ( location.href.indexOf("heute.de") > -1 ) {
            //minimize latest news
            window.document.querySelector("#ncWrapper > #nc > #action_ncMinMax").click();

            // check if variable is stored in cookie
            var loc = $.cookies.get('loc_cookie');
            if ( loc != null) {
                var loc_exists = 1;
            }
            else { var loc_exists = 0; };

            // only ask for location if no location is saved yet [functions inside if work]
            if ( !loc_exists ) {
                var loc = prompt("Wählen Sie den Ort für den Wetterbericht?");
                alert('Sie haben ' + loc + ' als Ort für den Wetterbericht gewählt.');
            };

            $("a:contains('" + loc + "')").click();

            // save to cookie
            $.cookies.set('loc_cookie', loc);
        }
        // Error
        else {
            alert('Die Webseite wurde nicht detektiert - heute_de.user.js');
        };
    }

    // Hotkeys (listen to keyboard input)
    $('html').keypress(
        function(event){

            // exclude SHIFT
            if (event.shiftKey) {
                return;
            }
            // exclude CTRL
            else if (event.ctrlKey) {
                return;
            }
            // exlcude ALT
            else if (event.altKey) {
                return;
            }

            // if inside textarea or input
            else if ('textarea' == event.target.tagName.toLowerCase()) {
                return;
            }
            else if ('input' == event.target.tagName.toLowerCase()) {
                return;
            }

            // if key 'w' is pressed
            else if (event.which == 119){
                // open weather modul
                window.location = 'http://wwwdyn.zdf.de/common/weather/00012.html';
            }
            // if key 's' is pressed
            else if (event.which == 115){
                // open sports section
                window.location = 'http://www.zdfsport.de/ZDFsport-Startseite-4002.html';   
            }
            // if key 'h' is pressed
            else if (event.which == 104){
                // open news section
                window.location = 'http://www.heute.de/';   
            } 
        }
    );
};
4

2 に答える 2

1

ページに JavaScript エラーがあります。それらが関連しているかどうかはわかりませんが、エラーによって他の動作が正しく実行されないことがよくあります。

「Uncaught ReferenceError: _etc が定義されていません。」「リソースの読み込みに失敗しましたhttp://code.etracker.com/t.js?et=GrKHKx

于 2012-12-20T22:33:07.697 に答える
1

スクリプトはすべてのサイトで機能したとのことですが、天気ページでは?! まったく機能しないはずだったので、それはかなり幸運です。

すべてのコードは次のようにラップされています。

if (document.readyState == "complete") {
    ... ...
}

ただし、 が指定されていない限り、または一部の超高速読み込みページの場合は、document.readyState常に になります。interactive@run-at document-start

$(document).ready()とにかく、Greasemonkey スクリプトでテストを試みる必要はほとんどありません。Greasemonkey スクリプトはデフォルトで実行されるときだからです。

また、そのページでは、jQuery がページの JavaScript と競合します。ディレクティブを使用して@grant、スクリプトをサンドボックスに復元します (これは、すべての Greasemonkey スクリプトにとって良い習慣です)。

マイナーな注意として、1.3.2 より新しいバージョンの jQuery を使用できます。. バージョン 1.7.2 は問題なく動作するようです。

すべてをまとめると、そのスクリプトは次のようになります。

// ==UserScript==
// @name        heute.de (zdf)
// @version     1.4.2
// @author      unrealmirakulix
// @description optimiert heute.de
// @icon        http://www.heute.de/ZDF/zdfportal/blob/5983926/8/data.png
// @include     http://wwwdyn.zdf.de/common/weather/00012.html
// @include     http*://www.heute.de/
// @include     http*://www.zdfsport.de/*
// @copyright   none
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

// not on weather module
if (location.href.indexOf("weather") == -1) {
    // hide header + footer
    document.getElementById('header').style.visibility = 'hidden'; // hide #header

    var cf = document.getElementById('footer'); // #footer selection
    cf.style.visibility = 'hidden'; // hide it
    // also hide its children
    if (cf.hasChildNodes()) {
        while (cf.childNodes.length >= 1) {
            cf.removeChild(cf.firstChild);
        }
    }

    // different actions @ different subpages
    // ZDF Sport (check if url in address bar contains "zdfsport.de")
    if (location.href.indexOf("zdfsport.de") > -1) {
        $("#a2").click();
        $("#a3").click();
        $("#a4").click();
        $("#a5").click();
    }
    // Heute.de (check if url in address bar contains "heute.de")
    else if (location.href.indexOf("heute.de") > -1) {
        //minimize latest news
        window.document.querySelector("#ncWrapper > #nc > #action_ncMinMax").click();

        // check if variable is stored in cookie
        var loc = $.cookies.get('loc_cookie');
        if (loc != null) {
            var loc_exists = 1;
        } else {
            var loc_exists = 0;
        };

        // only ask for location if no location is saved yet [functions inside if work]
        if (!loc_exists) {
            var loc = prompt("Wählen Sie den Ort für den Wetterbericht?");
            alert('Sie haben ' + loc + ' als Ort für den Wetterbericht gewählt.');
        };

        $("a:contains('" + loc + "')").click();

        // save to cookie
        $.cookies.set('loc_cookie', loc);
    }
    // Error
    else {
        alert('Die Webseite wurde nicht detektiert - heute_de.user.js');
    };
}

// Hotkeys (listen to keyboard input)
$('html').keypress ( function (event) {

    // exclude SHIFT
    if (event.shiftKey) {
        return;
    }
    // exclude CTRL
    else if (event.ctrlKey) {
        return;
    }
    // exlcude ALT
    else if (event.altKey) {
        return;
    }

    // if inside textarea or input
    else if ('textarea' == event.target.tagName.toLowerCase()) {
        return;
    } else if ('input' == event.target.tagName.toLowerCase()) {
        return;
    }

    // if key 'w' is pressed
    else if (event.which == 119) {
        // open weather modul
        window.location = 'http://wwwdyn.zdf.de/common/weather/00012.html';
    }
    // if key 's' is pressed
    else if (event.which == 115) {
        // open sports section
        window.location = 'http://www.zdfsport.de/ZDFsport-Startseite-4002.html';
    }
    // if key 'h' is pressed
    else if (event.which == 104) {
        // open news section
        window.location = 'http://www.heute.de/';
    }
} );
于 2012-12-21T09:57:10.907 に答える