Tampermonkey は、Greasemonkey の機能をエミュレートしようとする Google Chrome の拡張機能です。明確にするために、スクリプトを Chrome で動作させ、デフォルトの JavaScript の変更が表示されるようにしました。しかし、メニュー コマンドをテストしたかったので、Tampermonkey メニューでコマンドをクリックした後、6 桁の 16 進数のカラー コードを入力しました。ページをリロードすると、コマンドがメニューから消えました! 私のスクリプトはまだそこにありました(チェックボックスはチェックされていました)。
何をしたか、またはどのコードを変更したかに関係なく、ユーザー定義の入力が設定された後、この初期機能をエミュレートすることはできませんでした。これにより、スクリプトが途中で失敗する原因となっている、削除できない永続データがいくつかあると思われます。注: この正確なスクリプトは、Firefox でエラーなく完全に機能します。
これは明らかに Tampermonkey フォーラムではありませんが、ここの人々はクロスプラットフォームの互換性について非常に精通しているようです。以下のすべての変更の後、Chrome コンソールからのぞき見は 1 つも聞こえませんでした。この時点では、本当にアイデアがありません。ここに私が試したいくつかのことがあります(成功しませんでした)。コンソール エラーが一覧表示されます。
- jQuery のバージョンを 1.5.1 から 1.3.2 に変更する
- ページの読み込み後にコンソールから localStorage.getItem('prevoColor') を呼び出す (両方の値が null)
- クライアント側のストレージを localStorage から get/setValue に変更する
- コンソールから GM_getValue を呼び出す = ReferenceError: GM_getValue が定義されていません
- Chrome オプションで veekun.com の localStorage エントリを削除する
- 更新、スクリプトの再インストール、ブラウザの再起動を数え切れないほど繰り返しています
- Firebug Lite (ブックマークレット) を使用して上記のコマンドをすべて繰り返す
私が使用していたコードは次のとおりです。
// ==UserScript==
// @name Veekun Comparison Highlighter
// @namespace tag://veekun
// @description Highlights moves exclusive to pre-evolutions on veekun.com's family comparison pages (user-defined colors available)
// @include http://veekun.com/dex/gadgets/*
// @author Matthew Ammann
// @version 1.0.3
// @date 3/11/11
// @require http://sizzlemctwizzle.com/updater.php?id=98824
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
// ==/UserScript==
/*
Goal: Change checkmark color & move name to user-specified color on family comparison pages if
[DONE] Baby poke has a LEVEL-UP move unlearned by any evolutions
[DONE] a) Make sure move is not a TM or tutor move
[DONE] Any other mid-evolution has a move unlearnable by a final evo (Caterpie, Weedle families)
[DONE] a) Make sure move is not a TM or tutor move
[DONE] Any pre-evo has a TUTOR move unlearned by any evo (Murkrow in HG/SS)
[] Implement auto-update after uploading to userscripts.org
Credits: Brock Adams, for helping with Chrome compatibility
Metalkid, for the jQuery consult
*/
var isLevelupMove = false;
var isTutorMove = false;
var isTM = false;
var TMhead = $('#moves\\:machine');
var hasSecondEvo = false;
var hasFinalEvo1 = false;
var hasFinalEvo2 = false;
var header = $('.header-row').eq(1);
var TMmoves = new Array();
//This section deals with the user-defined colors
GM_registerMenuCommand("Color for pre-evolutionary-only moves", prevoColorPrompt)
GM_registerMenuCommand("Color for first evolution-only moves", evoColorPrompt)
var prevoColor = GM_getValue('prevoColor', '#FF0000');
var evoColor = GM_getValue('evoColor', '#339900');
function prevoColorPrompt()
{
var input = prompt("Please enter a desired 6-digit hex color-code for pre-evolutionary pokemon:")
GM_setValue('prevoColor', '#'+input);
}
function evoColorPrompt()
{
var input = prompt("Please enter the desired 6-digit hex color-code for first-evolution pokemon:")
GM_setValue('evoColor', '#'+input);
}
//This loop tests each 'th' element in a sample header row, determining how many Evos are currently present in the chart.
$('.header-row').eq(1).find('th').each(function(index)
{
if($(this).find('a').length != 0)
{
switch(index)
{
case 2:
hasSecondEvo = true;
break;
case 3:
hasFinalEvo1 = true;
break;
case 4:
hasFinalEvo2 = true;
break;
}
}
});
//All 'tr' siblings are TM moves, since it's the last section on the page
//This array puts only the names of the available TMs into the TMmoves array
TMhead.nextAll().each(function(index)
{
TMmoves.push($(this).children(":first").find('a').eq(0).html());
});
$('tr').each(function(index)
{
var moveName = $(this).children(":first").find('a').eq(0).html();
moveName = $.trim(moveName);
switch($(this).attr('id'))
{
case 'moves:level-up':
isLevelupMove = true;
break;
case 'moves:egg':
isLevelupMove = false;
break;
case 'moves:tutor':
isTutorMove = true;
case 'moves:machine':
isTM = true;
}
if(isLevelupMove || isTutorMove)
{
var babyMoveCell = $(this).find('td').eq(0);
babyMoveText = $.trim(babyMoveCell.html());
secondEvoCell = babyMoveCell.next();
secondEvoText = $.trim(secondEvoCell.html());
finalEvo1Cell = secondEvoCell.next();
finalEvo1Text = $.trim(finalEvo1Cell.html());
finalEvo2Cell = finalEvo1Cell.next();
finalEvo2Text = $.trim(finalEvo2Cell.html());
//This checks if evolutions have checkmarks
if(babyMoveText.length > 0)
{
if(hasSecondEvo && secondEvoText.length == 0 || hasFinalEvo1 && finalEvo1Text.length == 0 ||
hasFinalEvo2 && finalEvo2Text.length == 0)
{
//See if the move is a TM before proceeding
var tm = tmCheck(moveName);
if(!tm)
{
if(secondEvoText.length > 0)
{
babyMoveCell.css("color", evoColor);
secondEvoCell.css("color", evoColor);
babyMoveCell.prev().find('a').eq(0).css("color", evoColor); //highlights move name
}
else
{
babyMoveCell.css("color", prevoColor);
babyMoveCell.prev().find('a').eq(0).css("color", prevoColor);
}
}
}
}
else if(secondEvoText.length > 0)
{
if(hasFinalEvo1 && finalEvo1Text.length == 0 || hasFinalEvo2 && finalEvo2Text.length == 0)
{
var tm = tmCheck(moveName);
if(!tm)
{
secondEvoCell.css("color", evoColor);
babyMoveCell.prev().find('a').eq(0).css("color", evoColor);
}
}
}
}
});
function tmCheck(input)
{
var isTM = false;
//Iterate through TMmoves array to see if the input matches any entries
for(var i = 0; i < TMmoves.length; i++)
{
if(input == TMmoves[i])
{
isTM = true;
break;
}
}
if(isTM == true)
return true;
else
return false;
}
//alert("evoColor: " + localStorage.getItem('evoColor') + ". prevoColor: " + localStorage.getItem('prevoColor'));
なぜこれが起こっているのかについてのアイデアはありますか?
編集: この問題について sizzlemctwizzle にメッセージを送信したところ、彼の返信は次のとおりでした。「Tampermonkey の @require 実装は正しくありません。アップデーターをあまりにも頻繁にダウンロードするため、ブラウザー スニッフィング経由でアップデーターを使用することを禁止しました。サーバーが処理できないだけです」サーバーからダウンロードしているスクリプトには、実際のコードが含まれていてはなりません.スクリプトでエラーが発生しているため、Tampermonkey がこれらの要求を行うときに、ユーザー エージェント ヘッダーを渡していないと思います. Chrome でアップデーターをテストしたことがないので、なぜ壊れたのかわかりません。おそらく、代わりに NinjaKit をインストールしてみてください。」