绕过未定义的变量

时间:2012-01-22 10:18:45

标签: javascript greasemonkey

我试图访问此网站

  <script type="text/javascript">
function setCanvasSize()
{
  FB.Canvas.setAutoResize(false);
  FB.Canvas.setSize({ "width": 760, "height": 730 });
}
window.fbAsyncInit = function() {
  setCanvasSize();
}
$(document).ready(function() {
  setCanvasSize();
});

主页上的

,但FB未定义,因为我的主机文件中已阻止Facebook。

每当我尝试访问它时,它会发出错误Uncaught ReferenceError: FB is not defined并看到一个空白页。

我尝试使用页面的greasemonkey脚本设置var FB = 0;,但它不起作用。有谁知道我怎么能解决这个问题?反正有没有用greasemonkey从页面中删除这个javascript?

4 个答案:

答案 0 :(得分:1)

我认为别无选择,只能在不存在时“覆盖”此对象。

将此代码放在页面的最后:

if (typeof FB == "undefined" || !FB) {
    FB = { 
        Canvas: {
            setAutoResize: function() {}, 
            setSize: function() {}
        }
    };
}

这样$(document).ready()中的代码将使用此虚拟对象,不会崩溃。

答案 1 :(得分:0)

window.setCanvasSize = '';
function setCanvasSize()
{
      try {
          FB.Canvas.setAutoResize(false);
          FB.Canvas.setSize({ "width": 760, "height": 730 });
          }
          catch (e) {}
}

试试这个

答案 2 :(得分:0)

我在这里看到2个问题。

首先,设置FB = 0可以防止访问FB.Canvas时出错,但FB.Canvas的任何访问者(例如FB.Canvas.setAutoResize)仍会抛出错误。

其次,所有这些可能都发生在你的GreaseMonkey脚本执行之前。


修改

您需要使用@run_at document_start。有关详细信息,请参阅http://wiki.greasespot.net/Metadata_Block#.40run-athttps://github.com/greasemonkey/greasemonkey/issues/1103。从GreaseMonkey 0.9.8+开始提供。然后,在他的答案中使用Shadow Wizard提供的模拟对象。

还要确保您正确地与内容窗口连接,而不是GreaseMonkey范围。这是有效的,但根据嵌入式和以下注释 - 这需要一些安全工作!

// ==UserScript==
// @name           Mock Facebook
// @namespace      ...
// @include        ...
// @run-at         document-start
// ==/UserScript==

// DO NOT DO THIS - EXAMPLE ONLY - SEE http://wiki.greasespot.net/UnsafeWindow

unsafeWindow.FB = {
    Canvas: {
        setAutoResize: function(){},
        setSize: function(){}
    }
};

这需要一些进一步的工作来绕过使用不安全的unsafeWindow,但这是一个有效的例子,希望可以由你自己或其他人适当地扩展。 (我尝试了http://wiki.greasespot.net/Content_Script_Injectionhttp://wiki.greasespot.net/Content_Script_Injection,但这些都没有奏效 - 可能由于时间问题而再次发生。我也可能稍后重新审视。)另外,请务必填写一份{ {1}}和@namespace

首先不需要检查现有的@include变量,因为此时它确实无法存在 - 因此不必担心覆盖某些内容。


否则,我可以立即想到的唯一解决方法是Firefox扩展,在页面加载之前在页面范围内提供模拟FB对象。

答案 3 :(得分:0)

您需要同时使用@run-at document-startunsafeWindow

// ==UserScript==
// @name    _Ensure that setCanvasSize or FB is defined
// @include YOUR_SITE/YOUR_PATH
// @run-at  document-start
// ==/UserScript==

unsafeWindow.FB = { 
    Canvas: {
        setSize:        function () {},
        setAutoResize:  function () {} 
    }
};


请注意,GM脚本将在DOM可用之前开始运行,因此尝试DOM操作甚至alert()console.log()都会导致脚本无声地失败。

只是设置JS对象,就像我给出的脚本一样,但是很好。