2011-07-23 5 views
1

В настоящее время я пытаюсь переносить переменные в GM-скрипт, когда страница обновляется. В основном я использую скрипт от "Using Greasemonkey and jQuery to intercept JSON/AJAX data from a page, and process it." - который я использовал и добавил уже совсем немного.GM_setvalue не несет значения за каждый раз, только несколько раз ... нужна помощь

Я выделил некоторые переменные и хотел бы переносить их, когда страница обновляется, но они этого не делают. Он сбрасывает переменные до 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'.... 
*/ 

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

Update:

правый .. вот сокращенный вариант сценария, который дает мне неприятности, по-прежнему с теми же проблемами:

// ==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. Я не уверен, почему, но это то, к чему я смог сузить его.

+0

Если вы используете один и тот же сценарий GM для установки и извлечения значений, то он должен работать, никогда не было никаких проблем сам. – Jonathon

+0

re: '' скрипт слишком длинный, чтобы вставить весь скрипт для этого вопроса. "... ... Показанный код выглядит нормально, нам нужно увидеть весь скрипт и, возможно, проверить его на сайте (что я помню как немного «шерстивый»). Пожалуйста, напишите ссылку на полный скрипт на сайте pastebin.com. –

+0

Перейти к *** about: config *** в адресной строке Firefox (вы используете FF, а не Chrome?). Фильтр на 'greasemonkey.scriptvals'. Что ты видишь? (добавьте его к вопросу.) –

ответ

3

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

  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. Комментировать outline 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;}'); 
+0

@ brock, спасибо, он показывает значения теперь примерно в: config, всего лишь небольшая ошибка, запускает раздел «if (a_tst2)» более одного раза, много раз, много раз, заметил в скрипте, который я отправил, иногда предупреждает 2 или 3 раза, но в вашей версии это кажется усиленным .. думаю, что «if (a_tst2)» находится на неправильной стороне закрывающей скобки, просто исправит его, добавит еще один или два, только хочу сохранить значение, когда один из auctios go, или таймер работает до «0». я буду работать над этим сегодня вечером и исправить это ... не о чем беспокоиться ... Еще раз спасибо .. :) – Ludwig