我多年来一直在阅读Stack Overflow上的问题和答案(这个地方实际上教我编写代码)但这是我第一次提出问题,所以如果我做错了什么或者你需要,请告诉我更多信息。
我还会说我在JavaScript方面并不是特别擅长,只是在我自己的时候教会自己需要什么,所以我的知识可能很大。
基本上我正在研究一个用户脚本,它是三个先前脚本合二为一的(带有一些额外的和更改)。 它在Chrome上的TamperMonkey中运行得非常好,但在Firefox上的GreaseMonkey中无效,尽管三个独立的脚本都运行正常。
以下是the combined script on github/gist
的链接当我尝试访问AngularJS变量以查找范围等时出现问题。 起初Firefox给我一个错误,说它未定义,但将函数包装在setTimeout中解决了这个问题。现在它只是失败而没有给我任何错误。
正如所建议的那样,我尝试用较小的代码示例重新创建问题,这似乎(不)起作用:
// ==UserScript==
// @name test
// @namespace https://gist.github.com/adaliabooks/
// @version 1.0
// @description A package of fixes, new features and changes to improve GoG.com. I fix GoG, so you don't have to!
// @author adaliabooks
// @updateURL https://gist.github.com/adaliabooks/bf3cbdbb56db6c107dd8/raw/
// @downloadURL https://gist.github.com/adaliabooks/bf3cbdbb56db6c107dd8/raw/
// @include http://www.gog.com/*
// @include https://www.gog.com/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js
// @require https://raw.githubusercontent.com/bartaz/sandbox.js/master/jquery.highlight.js
// @require https://meetselva.github.io/attrchange/javascripts/attrchange.js
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// ==/UserScript==
function swapManualForDownloaderLinks()
{
console.log("Swap Links");
var accountProductsScope = angular.element(document.querySelectorAll('.game-details__title')).scope();
console.log("angular accessed successfully");
var main = accountProductsScope.details.main;
if(main.currentDownloads[0].manualUrl.indexOf("gogdownloader") <= -1)
{
console.log("Links swapped");
for (var i = 0; i < main.currentDownloads.length; i++)
{
var oldLink = main.currentDownloads[i].manualUrl;
main.currentDownloads[i].manualUrl = main.currentDownloads[i].downloaderUrl;
main.currentDownloads[i].downloaderUrl = oldLink;
}
for (var i = 0; i < main.extras.length; i++)
{
var oldLink = main.extras[i].manualUrl;
main.extras[i].manualUrl = main.extras[i].downloaderUrl;
main.extras[i].downloaderUrl = oldLink;
}
accountProductsScope.$apply();
$('.game-link').each(function(index){
$(this).attr('href', $(this).attr('ng-href'));
});
}
}
function changeDownloadLinks()
{
console.log("Change Download Links called");
var downloadRows = $(".game-details__column--left");
$('.game-details__header').parent().attrchange(
{
trackValues: true,
callback: function(event)
{
if (event.attributeName == "class")
{
if (!(event.newValue === "ng-hide"))
{
console.log("Game Details Loaded");
swapManualForDownloaderLinks();
}
}
}
});
}
changeDownloadLinks();
我认为这个问题与GreaseMonkey以及它如何对脚本进行沙盒化有关,但我不确定它是什么或者它是否可以修复......
我设法通过设置我自己的全局变量angular
并将其设置为unsafeWindow.angular
来解决这个问题,但是我需要访问的页面(gogData
)中还有另一个全局变量即使以window
或unsafeWindow
作为前缀,也无法正常工作。
真正令人费解的是,它可以在Chrome中运行,而the original script这段代码来自Firefox,可以很好地访问这些变量。如果我从控制台调用违规行,它也可以工作。
那么任何想法?我做错了什么?
尝试上面的示例并将@grant
设置为无效,所以它肯定与GreaseMonkey的安全设置有关......但是有解决方案还是可以解决?