2012-01-22 3 views
2

Этот сайт я пытаюсь получить доступ, имеетОбход неопределенной переменной

<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, и я вижу пустую страницу.

Я попытался установить var FB = 0; со сценарием greasemonkey для страницы, однако это не сработало. Кто-нибудь знает, как я могу обойти это? Есть ли способ удалить этот javascript со страницы с помощью greasemonkey?

+0

Если кто-то разместил указанный файл js на CDN, тогда ссылайтесь на него. Например, google сделал для jquery. –

ответ

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

Попробуйте

+0

OP не может изменить этот JS, поэтому это не вариант. – ziesemer

+0

В вашем скрипте gm введите мой код – Extaze

+0

Привет, я попробовал, я получаю ту же ошибку «Неподготовленный ReferenceError: FB не определен» –

0

Я вижу 2 проблемы здесь.

Во-первых, установка FB = 0 бы предотвратить ошибку доступа FB.Canvas, но любые аксессоров к FB.Canvas - такие, как FB.Canvas.setAutoResize будет по-прежнему бросать ошибку.

Во-вторых, все это, вероятно, происходит до выполнения сценария GreaseMonkey.


Edit:

Вы должны использовать @run_at document_start. См. http://wiki.greasespot.net/Metadata_Block#.40run-at и https://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_Injection, так и http://wiki.greasespot.net/Content_Script_Injection, но ни одна из них не работала - возможно, снова из-за проблем с синхронизацией. Я также могу пересмотреть это позже.) Также не забудьте заполнить соответствующие @namespace и @include.

Вначале нет необходимости проверять существующую переменную FB, так как на данный момент нет способа ее существования, поэтому нет необходимости перезаписывать что-то.


В противном случае, только обходное я могу сразу же думать о является расширение Firefox, который предоставляет макет FB объекта в области видимости страницы до страницы равномерной загрузки.

+0

Итак, не обойтись без этого? –

+0

@joerosa - Не в соответствии с этим: http://stackoverflow.com/questions/708136/how-does-one-have-greasemonkey-run-before-anything-else-in-the-page – ziesemer

+0

@joerosa - Смотрите мой обновленный ответ. Я не использовал это раньше, но '@run_at document_start' может работать для вас (после решения других проблем, которые я заметил). – ziesemer

1

У меня нет выбора, кроме как «перезаписать» этот объект, если он не существует.

Поместите этот код в самом конце вашей страницы:

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

Таким образом, код в $(document).ready() будет использовать этот фиктивный объект и не врезаться.

+1

Привет, я не могу изменить javascript. Это не моя страница, просто сайт, который я вист –

+0

@joerosa жаль, что не знаком с greasemonkey. Я предположил, что у вас есть сайт, использующий этот код в качестве внешнего ресурса. –

+1

Это все равно не сработает, по крайней мере, само по себе - хотя макет объектов будет полезен. Пожалуйста, обратитесь к моему ответу за то, почему. – ziesemer

0

Вы должны использовать оба @run-at document-start и unsafeWindow так:

// ==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, как и сценарий, который я дал, в порядке.

Смежные вопросы