Ошибки в IE 8 от connect.facebook.net/en_US/all.js, вызванные обратным вызовом кредитов
Настроить:
Получил работающее приложение для Facebook и правильно настроен для транзакций с кредитами в Facebook (т.е. все на стороне сервера работает нормально).
В Firefox и Chrome транзакции завершаются без проблем, однако в IE8 обратный вызов после завершения / закрытия диалогового окна покупки выдает следующие ошибки:
Ошибка 1:
Line: 52 Error: Object doesn't support this property or method
Object doesn't support this property or method JScript - script block, line 52 character 37
Где функция, на которую это указывает, является:
ui: function( params )
{
obj = FB.JSON.parse( params );
method = obj.method;
cb = function( response ) { FBAS.getSwf().uiResponse( FB.JSON.stringify( response ), method ); }
FB.ui( obj, cb );
},
Конкретно выделив этот бит:
FBAS.getSwf().uiResponse( FB.JSON.stringify( response ), method )
в файле http://connect.facebook.net/en_US/all.js
Ошибка 2:
Строка: 65 Ошибка: объект не поддерживает это действие
Объект не поддерживает это действие all.js, строка 65, символ 2198
[Строка, на которую он указывает, представляет собой тупо длинный неформатированный нечитаемый беспорядок, поэтому я опущу его, если не будет запрошено]
Конкретно выделив этот бит:
delete d._old_visibility
снова в файле http://connect.facebook.net/en_US/all.js
HTML-код, который я использую (с приложением, определяющим удаленные материалы), выглядит следующим образом:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="https://www.facebook.com/2008/fbml">
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta http-equiv="Expires" content ="0" />
<meta http-equiv="Pragma" content ="no-cache" />
<meta http-equiv="Cache-Control" content ="no-cache" />
<title>[ APP NAME ]</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
</head>
<body>
<div id="fb-root"></div>
<script type="text/javascript">
$(document).ready
(
function()
{
var appId = [ APP ID ];
var host = [ APP HOST ];
// If the user did not grant the app authorization go ahead and
// tell them that. Stop code execution.
if (0 <= window.location.href.indexOf ("error_reason"))
{
$(document.body).append ("<p>Authorization denied!</p>");
return;
}
// Loads the Facebook SDK script.
(function(d)
{
var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
d.getElementsByTagName('head')[0].appendChild(js);
}(document));
// When the Facebook SDK script has finished loading init the
// SDK and then get the login status of the user. The status is
// reported in the handler.
window.fbAsyncInit = function()
{
//debugger;
FB.init(
{
appId : appId,
status : true,
cookie : true,
oauth : true,
});
FB.getLoginStatus (onCheckLoginStatus);
};
// Handles the response from getting the user's login status.
// If the user is logged in and the app is authorized go ahead
// and start running the application. If they are not logged in
// then redirect to the auth dialog.
function onCheckLoginStatus (response)
{
if (response.status != "connected")
{
top.location.href = "https://www.facebook.com/dialog/oauth?client_id=" + appId + "&redirect_uri=" + encodeURIComponent (host+"[ RELATIVE APP PATH ]") + "&scope=publish_stream,user_about_me,read_friendlists,user_photos";
}
else
{
// Start the application
loadGame();
}
}
}
);
function loadGame()
{
var flashvars = {};
var params = {};
var attributes = {};
params.allowscriptaccess = "always";
attributes.id = 'flashContent';
attributes.name = 'flashContent';
swfobject.embedSWF("[ APP SWF ]?"+Math.floor(Math.random()*10000), "flashContent", "100%", "99%", "10.0", null, flashvars, params, attributes);
}
</script>
<div id="flashContent" >
Loading...
</div>
</body>
Это просто проблема для IE 8, но он останавливает запуск приложения, так как значительное количество транзакций пользователей не будет выполнено (или скорее завершится, начислится и не вступит в силу из-за неудачного обратного вызова).
Последние несколько дней я искал других с этой или подобной проблемой, но безрезультатно.
Я видел подобные проблемы, когда людей предупреждали о том, что переменные javascript создаются глобально и вызывают помехи или имена переменных с использованием ключевых слов, зарезервированных в IE, но, насколько я могу судить, ни один из них не имеет место. Javascript код facebook - это довольно типичный материал, взятый со страниц разработчиков в Facebook и надежных источников. Это может быть JQuery (с которым у меня мало опыта), однако, опять же, это снято с рабочих примеров, и если есть проблема, я ее не вижу.
Кто-нибудь может помочь?
2 ответа
РЕШИТЬ
Я не приму этот ответ, потому что, честно говоря, я не думаю, что вопрос был ответимым / разрешимым с предоставленной информацией, и чувствую, что это будет дурной тон. Но я хочу оставить это здесь для любого, кто может искать решение.
Причина ошибки
Проблема заключается в том, что Facebook скрывает приложение во время "обычных" действий в Facebook (в данном случае отображает приглашение к оплате) и вызовы внешнего интерфейса не работают в Internet Explorer, когда приложение скрыто / не видно.
Решение
Найдено по адресу http://flassari.is/2012/02/external-interface-error-object-expected/
Все эти шаги могут быть необязательными, но в итоге я сделал следующее:
Остановите приложение Facebook, скрывающее приложение, переопределив видимость с помощью
<style>
#[ ID OF THE FLASH OBJECT]
{
visibility: visible !important;
}
</style>
Добавление wmode = "opaque"; к параметрам swfobject
Использование необязательного flash_hide_callback путем добавления hideFlashCallback:"OnHideFlash" к параметрам FB.init в ActionScript для перемещения / скрытия приложения вместо этого, где OnHideFlash - функция javascript:
function OnHideFlash(params)
{
if (params.state == 'opened')
{
getSwf().style.top = '-10000px';
} else
{
getSwf().style.top = '';
}
}
Где getSwf() - ваш предпочтительный метод получения объекта флэш-приложения.
Надеюсь, это избавит некоторых людей от страданий, связанных с бесконечными "причинами, по которым XYXY не работает в вопросах и решениях IE", которые были моими последними днями.
Я предлагаю поместить ваш код с помощью инструмента JavaScript Lint и исправить все найденные ошибки. IE8 чрезвычайно требователен к тому, как кодируется JavaScript, в то время как Firefox и Chrome в порядке с небольшими ошибками Если ваш код не содержит ошибок (после линтинга), он должен работать правильно.