GM_setvalue не переносит значения каждый раз, только иногда требуется помощь

В настоящее время я пытаюсь перенести переменные в сценарий GM при обновлении страницы. В основном я использую скрипт из "Использование Greasemonkey и jQuery для перехвата данных JSON/AJAX со страницы и их обработки". - который я уже использовал и добавил совсем немного.

Я выделил некоторые переменные и хотел бы перенести их при обновлении страницы, но этого не происходит. Он сбрасывает переменные в 0 каждый раз, когда обновляется, и не переносится.

Это в основном то, что у меня есть ... или, скорее, важные части, сценарий слишком длинный, чтобы вставить весь сценарий для этого вопроса.

var A12_old1 = GM_getValue('A12_old1', 0);
var A12_old2 = GM_getValue('A12_old2', 0);
var A12_old3 = GM_getValue('A12_old3', 0);

//then further on...
A12_current = parseFloat(singleAuctionData[8]);
A12_rest = singleAuctionData[1];
if (t_int < 1) {
    if (t_test) {
        alert_test = true;
        t_test = false;
        A12reset_go = true;
        A12_old3 = A12_old2;
        A12_old2 = A12_old1;
        A12_old1 = A12_current;
    }
}

/* so basically doing some calculations as to what the values should be then to
     carry them over, at almost the end of the script, but still running every
     second, there is:
*/
if (alert_test) {
    alert_test = false;
    alert(A12_old1 + '  ' + A12_old2 + '  ' + A12_old3);
}

GM_setValue('A12_old1', A12_old1);
GM_setValue('A12_old2', A12_old2);
GM_setValue('A12_old3', A12_old3);
}

/*but it isn't carrying the 3 values over when the page refreshes.
    It resets to '0'....
*/

Может ли кто-нибудь просто показать мне, где я могу ошибаться?

Обновление:

Верно... вот укороченная версия скрипта, которая доставляет мне проблемы, но с теми же проблемами:

// ==UserScript==
// @name            setvalue test
// @include         http://www.trada.net/*
// @require         http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js
// ==/UserScript==
var auctiontyp = 0;
var my_test = GM_getValue("tsttst", 0);
var my_test2 = GM_getValue("tsttst2", 0);
var h = 0;
var m = 0;
var s = 0;
var t_int = 0;
var t_str = '';
var A12_current = 0;
var a_tst = true;
var a_tst2 = true;
var A12_old1 = GM_getValue("A12_old1", 0);
var A12_old2 = GM_getValue("A12_old2", 0);
var A12_old3 = GM_getValue("A12_old3", 0);

if (a_tst) {
    alert(my_test);
    GM_setValue("tsttst", 5);
    a_tst = false;
}
//--- Create a cell for transmitting the date from page scope to GM scope.
$('body').prepend('<div id="LatestJSON_Data"></div>');

var J_DataCell = $('#LatestJSON_Data');

//--- Evesdrop on the page's AJAX calls and paste the data into our special div.
unsafeWindow.$('body').ajaxSuccess(

function (event, requestData) {
    J_DataCell.text(requestData.responseText);
} );

//--- Listen for changes to the special div and parse the data.
J_DataCell.bind('DOMSubtreeModified', ParseJSON_Data);

function ParseJSON_Data() {
    //--- Get the latest data from the special cell and parse it.
    var myJson = J_DataCell.text();
    var jsonObj = $.parseJSON(myJson);

    //--- The JSON should return a 2-D array, named "d".
    var AuctionDataArray = jsonObj.d;

    //--- Loop over each row in the array.
    $.each(AuctionDataArray, function (rowIndex, singleAuctionData) {

        //--- Print the 7th column.
        console.log('Row: ' + (parseInt(rowIndex) + 1) + ' Column: 7  Value: ' + singleAuctionData[6]);

        if (a_tst2) {
            alert(my_test2);
            GM_setValue("tsttst2", 15);

            alert(A12_old1 + '  ' + A12_old2 + '  ' + A12_old3);
            a_tst2 = false;
        }

        t_str = singleAuctionData[10];
        var time = t_str.split(":");
        h = 3600 * parseInt(time[0], 10);
        m = 60 * parseInt(time[1], 10);
        s = parseInt(time[2], 10);
        t_int = h + m + s;

        auctiontyp = parseInt(singleAuctionData[4]);
        if (auctiontyp == 4) {
            A12_current = parseFloat(singleAuctionData[8]);

            if (t_int < 1) {
                A12_old3 = A12_old2;
                A12_old2 = A12_old1;
                A12_old1 = A12_current;
                GM_setValue("A12_old1", A12_old1);
                GM_setValue("A12_old2", A12_old2);
                GM_setValue("A12_old3", A12_old3);
            }
        }
    });
}


Переменная "my_test" переносится, но "my_test2", которая выполняется в массиве json, а также другие мои переменные не переносятся GM_setvalue. Я не уверен, почему, но это то, к чему я смог сузить его.


person Ludwig    schedule 23.07.2011    source источник
comment
Если вы используете один и тот же сценарий GM для установки и извлечения значений, он должен работать, у меня никогда не было проблем.   -  person Jonathon    schedule 24.07.2011
comment
re: "the script is too getting too long to paste the whole script for this question."... Показанный код выглядит нормально, нам нужно увидеть весь скрипт и, возможно, протестировать его на сайте (который, как я помню, был немного размытым). Ссылку на полный скрипт на pastebin.com, пожалуйста.   -  person Brock Adams    schedule 24.07.2011
comment
Перейдите к about:config в адресной строке Firefox (вы используете FF, а не Chrome?). Фильтровать по greasemonkey.scriptvals. Что ты видишь? (добавьте его к вопросу.)   -  person Brock Adams    schedule 24.07.2011
comment
Хорошо, что у меня есть до сих пор, так это то, что если я добавляю значение gm_setvalue перед массивом json, например, прямо в начале скрипта, оно переносится, но в массиве json оно не переносится. я добавил укороченную версию скрипта с некоторыми тестами   -  person Ludwig    schedule 24.07.2011
comment
@brock в about:config я нахожу только Greasemonkey.scriptvals./setvalue test.tsttst;5 например, первый, а не остальные.   -  person Ludwig    schedule 24.07.2011


Ответы (1)


Несколько вещей:

  1. Эти скрипты пытаются хранить поплавки. GM_setValue() работает только со строками, целыми числами и логическими значениями.
    К счастью, есть расширение для этого; больше ниже.

  2. Последующие вызовы GM_setValue завершились неудачно, так как они находились внутри обработчика событий.
    Если вы наблюдали с помощью Консоль Firebug (всегда отлаживайте так!), мимо прокручивается красное сообщение об ошибке:

    Greasemonkey access violation: unsafeWindow cannot call GM_setValue.
    
  3. Точно так же, разве тестирование с alerts() не раздражает? Используйте функции консоли, и скрипту не придется останавливаться, и у вас не будет этих надоедливых всплывающих окон.

Итак, как исправить:

  1. Во-первых, тест.

    1. Установите этот скрипт:

      // ==UserScript==
      // @name            Super GM_setValue and GM_getValue TEST SHELL
      // @namespace       DEBUG
      // @include         https://stackoverflow.com/questions/*
      // @require         http://userscripts.org/scripts/source/107941.user.js
      // ==/UserScript==
      
      /*--- Run the test cases to make sure that the GM_setValue and GM_getValue
          extensions are able to run on this browser.
      */
      GM_SuperValue.runTestCases  (0);
      
    2. Затем перейдите на эту страницу (stackoverflow.com/q/6802750/).

    3. Открыв консоль Firebug, перезагрузите страницу.

    4. Каковы результаты?


  2. Используйте расширенную библиотеку GM_setValue. Добавьте эту строку в ваши скрипты:

    // @require http://userscripts.org/scripts/source/107941.user.js
    
  3. Замените все GM_setValue на GM_SuperValue.set

  4. Замените все GM_getValue на GM_SuperValue.get

  5. Чтобы устранить тот факт, что GM не позволяет запускать GM_setValue в обработчиках событий, установленных из области действия GM (это может быть ошибка), измените способ вызова ParseJSON_Data...

    1. Comment out the J_DataCell.bind ('DOMSubtreeModified' ... line.
    2. Добавьте timerHandle = setInterval (function() { ParseJSON_Data (); }, 444); под ним.
    3. Добавьте больше логики вокруг J_DataCell.

Собрав все вместе, тестовый сценарий становится таким:

// ==UserScript==
// @name            _setvalue test
// @include         http://www.trada.net/*
// @require         http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js
// @require         http://userscripts.org/scripts/source/107941.user.js
// ==/UserScript==

var auctiontyp  = 0;
var my_test     = GM_SuperValue.get("tsttst", 0);
var my_test2    = GM_SuperValue.get("tsttst2", 0);
var h           = 0;
var m           = 0;
var s           = 0;
var t_int       = 0;
var t_str       = '';
var A12_current = 0;
var a_tst       = true;
var a_tst2      = true;
var A12_old1    = GM_SuperValue.get("A12_old1", 0);
var A12_old2    = GM_SuperValue.get("A12_old2", 0);
var A12_old3    = GM_SuperValue.get("A12_old3", 0);

if (a_tst) {
    console.log(my_test);
    GM_SuperValue.set("tsttst", 5);
    a_tst = false;
}
//--- Create a cell for transmitting the date from page scope to GM scope.
$('body').prepend('<div id="LatestJSON_Data"></div>');

var J_DataCell = $('#LatestJSON_Data');

//--- Evesdrop on the page's AJAX calls and paste the data into our special div.
unsafeWindow.$('body').ajaxSuccess(
    function (event, requestData) {
        J_DataCell.text(requestData.responseText);
} );

//--- Listen for changes to the special div and parse the data.
//J_DataCell.bind ('DOMSubtreeModified', {StoreValFunc: GM_SuperValue.set}, ParseJSON_Data);

timerHandle = setInterval (function() { ParseJSON_Data (); }, 444);

function ParseJSON_Data () {
    //--- Get the latest data from the special cell and parse it.
    var myJson  = J_DataCell.text();
    if (!myJson  ||  /^\s*$/.test (myJson) )
        return
    else
        J_DataCell.text (" ");

    var jsonObj = $.parseJSON(myJson);

    //--- The JSON should return a 2-D array, named "d".
    var AuctionDataArray = jsonObj.d;

    //--- Loop over each row in the array.
    $.each(AuctionDataArray, function (rowIndex, singleAuctionData) {

        //--- Print the 7th column.
        //console.log('Row: ' + (parseInt(rowIndex) + 1) + ' Column: 7  Value: ' + singleAuctionData[6]);

        if (a_tst2) {
            console.log('******** ', my_test2);
            GM_SuperValue.set ("tsttst2", 15);

            console.log (A12_old1 + '  ' + A12_old2 + '  ' + A12_old3);
            a_tst2 = false;
        }

        t_str       = singleAuctionData[10];
        var time    = t_str.split(":");
        h           = 3600 * parseInt(time[0], 10);
        m           = 60 * parseInt(time[1], 10);
        s           = parseInt(time[2], 10);
        t_int       = h + m + s;

        auctiontyp = parseInt(singleAuctionData[4]);
        if (auctiontyp == 4) {
            A12_current = parseFloat(singleAuctionData[8]);

            if (t_int < 1) {
                A12_old3 = A12_old2;
                A12_old2 = A12_old1;
                A12_old1 = A12_current;
                GM_SuperValue.set ("A12_old1", A12_old1);
                GM_SuperValue.set ("A12_old2", A12_old2);
                GM_SuperValue.set ("A12_old3", A12_old2);
            }
        }
    });
}

GM_addStyle ('#LatestJSON_Data {display:none;}');
person Brock Adams    schedule 25.07.2011
comment
@brock, спасибо, теперь он показывает значения в about: config, просто небольшая ошибка, запускает раздел if (a_tst2) более одного раза, на самом деле много, много раз, заметил в сценарии, который я разместил, он иногда предупреждает 2 или 3 раз, но в вашей версии это кажется усиленным.. подумайте, что если (a_tst2) находится не с той стороны закрывающей скобки, просто исправите его, добавьте еще один, если или два, только хотите сохранить значение, когда один из аукционов уходит, или таймер работает до 0. я поработаю над этим сегодня вечером и исправлю... не о чем беспокоиться... еще раз спасибо..:) - person Ludwig; 25.07.2011