3

このスクリプトは、オンライン ストアでのチェックアウト プロセスを支援します。プログラムを最初に実行するためにページを更新する必要があることを除いて、すべてが正しく機能しています。

過去に閲覧した他の商品でも動くのでキャッシュの問題なのかな。@run-at私も無駄にいじってみました。Scriptish拡張機能を使用していますが、これはスタンドアロン.jsファイルです。

// ==UserScript==
// @id             proper-id
// @name           proper-name
// @version        1.0
// @namespace      
// @description    
// @include        proper-url-here
// @include about:blank
// @run-at window-load
// ==/UserScript==

for (var i=0; i<document.getElementsByName("skuAndSize")[0].length; i++){
    if(document.getElementsByName("skuAndSize")[0].options[i].text == 11) {
        document.getElementsByName("skuAndSize")[0].selectedIndex = i;
    }
}
document.getElementsByClassName("button-container add-to-cart")[0].click();

このユーザースクリプトが更新時にのみ実行されるのはなぜですか?

4

1 に答える 1

4

これは、AJAX を介してコンテンツを変更するページの典型的な問題です。
@run-at対象のコンテンツはウィンドウloadイベントのかなり後にロードされるため、効果はありません。そして、「新しい」ページは、少なくともページを更新するまでは、AJAX を介して完全に書き直されたものです。

スクリプトを次のように変更@run-at document-end(または行を省略) し、ターゲット ページとその使用方法によっては、hashchangeGreasemonkey スクリプトを実行するにはページを更新する必要がありますか? " またはこの他の回答に示されているように。

ただし、ツールへの移動はwaitForKeyElementsMore infoです。スクリプトは次のように単純です。

// ==UserScript==
// @name     _YOUR_SCRIPT_NAME
// @include  http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require  https://gist.github.com/raw/2625891/waitForKeyElements.js
// ==/UserScript==

waitForKeyElements ("[name='skuAndSize']", setSizeIndex);
waitForKeyElements (".button-container.add-to-cart", clickAddToCart);

function setSizeIndex (jNode) {
    var node    = jNode[0];
    for (var J = node.options.length - 1;  J >= 0;  --J) {
        if (node.options[J].text == "11") {
            node.selectedIndex = J;
            break;
        }
    }
}

function clickAddToCart (jNode) {
    var clickEvent  = document.createEvent ('MouseEvents');
    clickEvent.initEvent ('click', true, true);
    jNode[0].dispatchEvent (clickEvent);
}


「AJAX 駆動サイトでの適切なコントロールの選択とアクティブ化」 も参照してください。

于 2013-06-29T22:17:49.203 に答える