【问题标题】:GM_setvalue not carrying values over every time,only some times...need helpGM_setvalue 每次都没有携带值,只有几次......需要帮助
【发布时间】:2011-07-23 19:24:56
【问题描述】:

我目前正在尝试在页面刷新时在 GM 脚本中传递变量。基本上我正在使用来自"Using Greasemonkey and jQuery to intercept JSON/AJAX data from a page, and process it." 的脚本——我已经使用并添加了很多。

我已经挑选出一些变量,并希望在页面刷新时将它们保留下来,但他们没有。每次刷新都会将变量重置为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”被继承,但在 json 数组中运行的“my_test2”以及我的其他变量没有被GM_setvalue 继承。我不确定为什么,但这是我能够缩小的范围。

【问题讨论】:

  • 如果您使用相同的 GM 脚本来设置和检索值,那么它应该可以工作,我自己从来没有遇到过任何麻烦。
  • re: "the script is too getting too long to paste the whole script for this question."... 显示的代码看起来不错,我们需要查看整个脚本并可能针对站点对其进行测试(我记得这有点“笨拙”)。请链接到 pastebin.com 上的完整脚本。
  • 转到 Firefox 地址栏中的 about:config(您使用的是 FF 而不是 Chrome?)。过滤greasemonkey.scriptvals。你看到了什么? (将其附加到问题中。)
  • 好的,到目前为止我得到的是,如果我在 json 数组之前添加 gm_setvalue,例如在脚本的开头,它会被结转,但在 json 数组中它是没有结转。我通过一些测试添加了 ia 脚本的缩短版本
  • @brock 在about:config 中,我只找到了greasemonkey.scriptvals./setvalue test.tsttst;5 例如,第一个,而不是其他的。

标签: javascript greasemonkey storing-data


【解决方案1】:

一些事情:

  1. 那些脚本正在尝试存储浮点数。 GM_setValue() only works on: strings, integers and booleans.
    幸运的是,有一个扩展;更多内容如下。

  2. 后来对 GM_setValue 的调用失败,因为它们位于事件处理程序中。
    如果您一直在使用Firebug console 观看(始终以这种方式调试!),则会滚动过去一条红色错误消息:

    Greasemonkey access violation: unsafeWindow cannot call GM_setValue.
    
  3. 类似地,使用alerts() 进行测试不是很烦人吗?使用console functions,脚本就不必停止,也不会出现那些讨厌的弹出窗口。

那么,如何解决

  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. 注释掉J_DataCell.bind ('DOMSubtreeModified' ... 行。
    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;}');

【讨论】:

  • @brock,谢谢,它现在在 about:config 中显示值,只是一个小错误,不止一次运行“if (a_tst2)”部分,实际上很多很多次,在我发布的脚本有时会发出 2 或 3 次警报,但在您的版本中,它似乎被放大了。认为“如果(a_tst2)”在右括号的错误一侧会更正它添加另一个如果或两个,只想要当其中一个拍卖行运行或计时器运行到“0”时存储一个值。我今晚会处理它并修复它...没什么好担心的...再次感谢..:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
相关资源
最近更新 更多