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
, Я не уверен почему, но это к тому, что я смог сузить.
1 ответ
Несколько вещей:
Эти скрипты пытаются хранить поплавки.
GM_setValue()
работает только на: строки, целые числа и логические.
К счастью, для этого есть расширение; подробнее ниже.Более поздние вызовы GM_setValue не удалось, потому что они были внутри обработчика событий.
Если вы смотрели с консолью Firebug (всегда отлаживайте так!), Красное сообщение об ошибке прокручивается мимо:Greasemonkey access violation: unsafeWindow cannot call GM_setValue.
В том же духе, не тестирование с
alerts()
раздражает? Используйте функции консоли, и скрипт не должен будет останавливаться, и у вас не будет этих надоедливых всплывающих окон.
Итак, как исправить:
Сначала тест.
Установите этот скрипт:
// ==UserScript== // @name Super GM_setValue and GM_getValue TEST SHELL // @namespace DEBUG // @include https://stackru.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);
Затем перейдите на эту страницу ( /questions/3056293/gmsetvalue-ne-perenosit-znacheniya-kazhdyij-raz-tolko-neskolko-raz-nuzhna-pomosch).
С открытой консолью Firebug перезагрузите страницу.
Каковы результаты?
Используйте расширенную библиотеку GM_setValue. Добавьте эту строку в ваш скрипт (ы):
// @require http://userscripts.org/scripts/source/107941.user.js
Заменить все
GM_setValue
сGM_SuperValue.set
Заменить все
GM_getValue
сGM_SuperValue.get
Чтобы решить тот факт, что GM не позволит
GM_setValue
запустить обработчики событий, установленные из области видимости GM (это может быть ошибкой), изменить способParseJSON_Data
называется...- Закомментируйте
J_DataCell.bind ('DOMSubtreeModified' ...
линия. - добавлять
timerHandle = setInterval (function() { ParseJSON_Data (); }, 444);
, под этим. - Добавьте немного логики вокруг
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;}');