1

私の会社は Web ベースの製品を使用しており、その UI では、使用例によっては 200 を超えるチェックボックスをクリックする必要があります。「すべてのチェックを外す」機能をリクエストしましたが、予定されていないようです。

この問題を解決するために、簡単な GreaseMonkey スクリプトを作成しようとしました。

$('img').click(function() {
    $('input.HideQuestion:checked').each(function() {
        $(this).click();
    });
});

(私がクリックターゲットとして使用しているページには、当社のロゴの画像が 1 つあります)

問題は、画像をクリックするたびに、(~270 のうちの) 1 つのチェックボックスだけが影響を受けることです。さらにクリックするたびに、次のチェックボックスに影響します。

チェックボックスがチェックされるたびに Web サイトが Ajax 呼び出しを行うことがわかりますが、その Ajax 呼び出しの応答本文は空であるため、ページの一部を置き換えるのではなく、サーバーの状態を更新しているだけだと思います。

チェックボックスが 1 つだけオフになるのはなぜですか?

別のアプローチを使用する場合

$(this).prop("checked", true);

すべてのチェックボックスが視覚的にオフになっていますが、Ajax 呼び出しは発生せず、サーバーの状態は更新されません。さらに、チェックボックスをチェックすると、すべてのチェックボックスが GreaseMonkey 以前の状態に戻ります。

アップデート

Ajax呼び出しをインターセプトするために、@BrockAdamsが提案した次の両方を試しました。どちらのalert()も呼び出されていません。

XMLHttpRequest.prototype.open をオーバーライドし ます https://stackoverflow.com/a/7778218/141172

(function() {
    var proxied = window.XMLHttpRequest.prototype.open;
    window.XMLHttpRequest.prototype.open = function() {
        alert('A-ha! Open!');
        return proxied.apply(this, [].slice.call(arguments));
    };
})();

.ajaxSuccess()
https://stackoverflow.com/a/8252726/141172を使用して、ターゲット ページの AJAX をインターセプトします。

// Also tried: unsafeWindow.$('body').ajaxSuccess (
$('body').ajaxSuccess ( 
        function (event, requestData)
        {
            alert('A-ha.  Success!');
        }
    );  
4

2 に答える 2

2

これには、ターゲット ページの JS コードを確認する必要があります。しかし、ターゲット ページが AJAX 応答を待ってから内部状態を設定しているようです。また、サーバーによって維持されている状態でローカル状態を上書きしている可能性もあります。

その場合は、オフにするたびにサーバーの応答を待つ必要があります。または、ターゲット ページの JavaScript がより良い解決策を提供する可能性があります。

あなたからの詳細(特に、ターゲットページがこの特定の AJAX に jQuery を使用しているかどうか)を待っているので、一般的なアプローチは次のとおりです。

  1. jQuery キュー$('input.HideQuestion:checked').each()に入力するために使用します。

  2. .ajaxSuccess()可能であれば、ターゲット ページの AJAX を使用してインターセプトします。XMLHttpRequest.prototype.openまたは、そうでない場合はオーバーライドします。

  3. AJAX が正常に完了するたびにdequeue、ステップ 1 のキューに残っている次のアイテム (存在する場合)。

    dequeue一致するチェックボックスをオフにする関数をセットアップします。

于 2012-08-24T01:19:26.137 に答える
0

これを試して:

$('img').click(function() {
    $('input[type="checkbox"]:checked').prop('checked', false)
});
于 2012-08-24T00:50:27.607 に答える