javascript - GM_registerMenuCommand 未定义

原文 标签 javascript jquery google-chrome cross-browser greasemonkey

大家。当我尝试运行我创建的用户脚本时,为什么我不断收到错误“GM_registerMenuCommand 未定义”,这让我感到困惑。我已经在 Firefox 中使用 Scriptish 1.0b9 和最新版本的 Greasemonkey 进行了尝试。我什至禁用了除 Scriptish 之外的所有插件,以查看是否存在冲突,但没有任何乐趣。

我使用 this template by Erik Vold 在我的用户脚本中包含 jQuery .在尝试此模板之前,我将完全相同的代码块放入 Joan Piedra 提出的模板中,一切正常。不幸的是,Piedra 的模板在 Chrome 中不起作用,考虑到 Chrome 不断增长的用户群,我认为这是必要的。引发错误的代码段如下:

    // a function that loads jQuery and calls a callback function when jQuery has finished loading
function addJQuery(callback) {
  var script = document.createElement("script");
  script.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js");
  script.addEventListener('load', function() {
    var script = document.createElement("script");
    script.textContent = "(" + callback.toString() + ")();";
    document.body.appendChild(script);
  }, false);
  document.body.appendChild(script);
}

// the guts of this userscript
function main() {


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);

if(localStorage.getItem('prevoColor') == null || localStorage.getItem('evoColor') == null)
{
    localStorage.setItem('prevoColor', 'red');
    localStorage.setItem('evoColor', 'orange');
}
var prevoColor = localStorage.getItem('prevoColor');
var evoColor = localStorage.getItem('evoColor');

function prevoColorPrompt()
{
    var input = prompt("Please enter a desired 6-digit hex color-code for pre-evolutionary pokemon:") 
    localStorage.setItem('prevoColor', '#'+input);
}

function evoColorPrompt()
{
    var input = prompt("Please enter the desired 6-digit hex color-code for first-evolution pokemon:") 
    localStorage.setItem('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'))

}//end main()

// load jQuery and execute the main function
addJQuery(main);

This is the userscript I'm trying to implement this for .如果有人对我为什么会收到错误有任何建议或想法,我很想听听他们的意见!

最佳答案

这不起作用,因为如果您仔细查看 addJQuery确实,您会意识到它会将您传递给它的函数的代码注入(inject)到 script 中。附加到 body 末尾的元素元素。

这意味着您现在与网站的脚本在同一个空间工作,所以所有 GM_*将不可用。您可以做的是将一些需要这些功能的代码移到 main 之外。函数,但请记住,Greasemonkey 沙箱意味着代码在 main 中运行。函数不能直接与它外部的代码通信。您可以进行间接通信,例如通过观看 DOM 操作,甚至 unsafeWindow ,但看看你的代码,它似乎不容易分开。

关于javascript - GM_registerMenuCommand 未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5282954/

相关文章:

css - 从 Google Chrome 打印网络字体时显示的垃圾字符

javascript - 仅使用 JS 确定 WebView 是否不可见

javascript - 使用JavaScript在Android(Chrome)上使用计时器播放声音

javascript - 在 angularjs 页面中获取 mysql 结果

javascript - 谁都知道如何自动从<Li> Javascript HTML中选择一个选项

javascript - Javascript&CSS:如何获取样式表文件的值?

javascript - 如何使用jQuery在加载时加载iframe?

javascript - C++ node.js 模块。 cout 不工作?

javascript - 使 li 选择复选框

javascript - 是否可以从任何加载了 jquery 的页面向 google.com 发出成功的 ajax get 请求?