Скриптовому скрипту нужна обновленная страница для запуска?

Этот скрипт помогает оформить заказ в интернет-магазине. Все работает правильно, за исключением необходимости обновления страницы, чтобы программа запускалась изначально.

Интересно, если это проблема с кешем, потому что она работает на других продуктах, которые ранее просматривались. Я также пытался возиться с @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();

Почему этот пользовательский скрипт работает только при обновлении?

1 ответ

Решение

Это классическая проблема со страницами, которые изменяют свое содержимое через AJAX.
@run-at не имеет никакого эффекта, потому что целевой контент загружается долго после окна load событие. И "новые" страницы действительно полностью переписаны с помощью AJAX - по крайней мере, до тех пор, пока вы не обновите страницу.

Измените сценарий на @run-at document-end (или пропустите строку), а затем, в зависимости от целевой страницы и того, как вы ее используете, может быть достаточно запустить hashchange как показано на "Мне нужно обновить страницу, чтобы запустить мой скрипт Greasemonkey?" или как показано на этом другом ответе.

Перейти к инструменту waitForKeyElements Больше информации, однако. Ваш скрипт может быть таким простым:

// ==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".

Другие вопросы по тегам