1

Greasemonkey で質問に自動で回答したい。質問と回答はありますが、どうすれば選択できますか?

HTMLは次のとおりです。

<div class="vito_form_q">
    <div class="vito_form_title_min_no">
        <span id="ContentPlaceHolder1_lblquestionNo">8</span>
    </div>
    <div class="vito_form_title_min">
        <span id="ContentPlaceHolder1_lblquestion">Which sport is not playing with the ball?</span>
    </div>
    <div class="clearfloat"></div>
    <div class="meter orange nostripes"><span style="width: 100%"></span></div>
    <div class="quest">
        <table id="rbAnswer" class="q1">
        <tr><td>
            <input id="rbAnswer_0" type="radio" name="ctl00$ContentPlaceHolder1$rbAnswer" value="157"/><label for="rbAnswer_0">Handball</label>
        </td></tr>
        <tr><td>
            <input id="rbAnswer_1" type="radio" name="ctl00$ContentPlaceHolder1$rbAnswer" value="158"/><label for="rbAnswer_1">Basketball</label>
        </td></tr>
        <tr><td>
            <input id="rbAnswer_2" type="radio" name="ctl00$ContentPlaceHolder1$rbAnswer" value="159"/><label for="rbAnswer_2">Football</label>
        </td></tr>
        <tr><td>
            <input id="rbAnswer_3" type="radio" name="ctl00$ContentPlaceHolder1$rbAnswer" value="160"/><label for="rbAnswer_3">Fencing</label>
        </td></tr>


たとえば、この質問の場合:

    <span id="ContentPlaceHolder1_lblquestion">Which sport is not playing with the ball?</span>

答えを選択してください:

<td>
    <input id="rbAnswer_3" type="radio" name="ctl00$ContentPlaceHolder1$rbAnswer" value="160" />
    <label for="rbAnswer_3">Fencing</label>

Greasemonkeyでこれを行うにはどうすればよいですか?

4

1 に答える 1

1

次のように、質問と回答の配列を作成します。

var answerKey   = [
      { q: "sport is not playing with the ball", a: "Fencing" }
    , { q: "Best SciFi franchise",               a: "Star Trek" }
    , { q: "Most badass monster",                a: "Bun-Bun" }
    , { q: "Most toxic chemical in this list",   a: "Mountain Dew" }
    // etc.
];


次に、Greasemonkey スクリプトのメタデータ ブロックに次の行を追加します。

// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js


次に、jQueryの優れた機能を使用して、スクリプトで次のコードを使用して適切なラジオ ボタンをチェックできます。

( jsFiddle で基礎となるコードのデモを参照してください。 )

var answerKey   = [
      { q: "sport is not playing with the ball", a: "Fencing" }
    , { q: "Best SciFi franchise", a: "Star Trek" }
    , { q: "Most badass monster", a: "Bun-Bun" }
    , { q: "Most toxic chemical in this list", a: "Mountain Dew" }
    // etc.
];

//--- Loop through the question(s) on the page and answer then if possible.
var questionTxt = $("div div.vito_form_title_min span[id$='question']");

questionTxt.each ( function () {
    var bFoundAnswer    = false;
    var answerTxt       = getAnswer (this.textContent);
    if (answerTxt) {
        //--- We have the answer text, now find the matching radio button and select it.
        var ansForThisQ     = $(this).parent (). nextAll ("div.quest").find ("label");

        ansForThisQ.each ( function () {
            var zRegExp     = new RegExp (answerTxt, 'i');
            if (zRegExp.test (this.textContent) ) {
                bFoundAnswer    = true;
                var label       = $(this);
                var radioButt   = $("#" + label.prop ("for") );
                radioButt.prop  ("checked", "checked");
                label.css       ("background", "lime");
                return false;   // End loop
            }
        } );
    }
    else {
        alert ("I don't know how to answer: '" + this.textContent + "'");
        $(this).css ("background", "pink");
    }
    if ( answerTxt  &&  ! bFoundAnswer) {
        alert ("The page does not have the specified answer for the question: '" + this.textContent + "'");
        $(this).css ("background", "pink");
    }
} );

function getAnswer (questionText) {
    for (var J = answerKey.length - 1;  J >= 0;  --J) {
        var zRegExp = new RegExp (answerKey[J].q, 'i');

        if (zRegExp.test (questionText) )
            return answerKey[J].a;
    }
    return null;
}
于 2012-06-14T02:10:16.933 に答える