【问题标题】:Scriptish script needs the page refreshed to run?Scriptish 脚本需要刷新页面才能运行?
【发布时间】:2013-06-29 22:10:40
【问题描述】:

此脚本有助于在线商店的结帐过程。一切正常,除了需要刷新页面以使程序最初运行。

我想知道这是否是缓存问题,因为它适用于以前查看过的其他产品。我还尝试修改 @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();

为什么这个用户脚本只在刷新时运行?

【问题讨论】:

    标签: javascript greasemonkey userscripts scriptish


    【解决方案1】:

    这是通过 AJAX 更改其内容的页面的典型问题。
    @run-at 无效,因为目标内容在窗口 load 事件之后很长时间才加载。而且,“新”页面实际上是通过 AJAX 完全重写的——至少在您刷新页面之前。

    将脚本更改为@run-at document-end(或省略该行),然后根据目标页面和您使用它的方式,可能足以触发hashchange,如"I have to refresh the page for my Greasemonkey script to run?" 所示或显示在this other answer

    不过,转到工具是 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);
    }
    


    另请参阅"Choosing and activating the right controls on an AJAX-driven site"

    【讨论】:

    • 谢谢你!这就像一个魅力。一个很好的描述和一切启动。 =) 我应该只使用 jQuery。我还认为可以实现类似于 addEventListener() 的功能以使功能达到标准。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多