swfobject,FB.ui回调,AS3 ExternalInterface和IE无法正常工作

时间:2013-12-27 20:34:48

标签: javascript actionscript-3 facebook-graph-api

我使用swfobject加载了我的swf。在AS3内,我打电话给FB.ui来显示付费窗口。到目前为止一切正常。 付款完成后,FB.ui会调用应该回拨给AS3的回调。我得到了对swf对象的引用,但实际的方法调用失败,Object不支持属性或方法。

我一直在阅读有关此事的所有帖子,但找不到任何帮助。在我看来,getElementById没有返回正确的对象。

这只发生在IE中。 Chrome和FireFox工作正常。

var attributes = {};            
        attributes.id = "game";
        attributes.name = "game";
        attributes.align = "middle";
        swfobject.embedSWF(
            "game.swf", "flashContent",
            "800", "600",
            swfVersionStr, xiSwfUrlStr,
            flashvars, params, attributes);
        // JavaScript enabled so display the flashContent div in case it is not replaced with a swf object.
        swfobject.createCSS("#flashContent", "display:block;text-align:left;");

.....

FB.ui(obj, function(data) { 

          if(!data) {
        alert("There was an error processing your payment. Please try again!");              
        return;
          }

          //  alert('called back order');

          // IMPORTANT: You should pass the data object back to your server to validate
          // the contents, before fulfilling the order.
            var gameVar = document.getElementById("game");
            //alert(gameVar);
            //console.log(Object.prototype.toString.call(gameVar));
        //alert(gameVar.purchaseCallback);
          gameVar.purchaseCallback(data);
          //console.log("Payment verification complete");


        });

          //handle errors here
         //alert('some error');

         return false;
    }

如果我将以下内容添加到页面中,点击链接就可以了。              功能测试() {             var game = document.getElementById(“game”);             警报(game.purchaseCallback);         }          测试

1 个答案:

答案 0 :(得分:1)

事实证明问题在于可见性。由于FB.ui在显示FB.ui对话框时更改了对象的可见性,然后在对话框被丢弃时将其更改回来,因此Flash应用程序将丢失它的ExternalInteface。

为了纠正这个问题,我补充说:

<style>
    #game {
        visibility: visible !important;
    }
</style>

我应该补充一点。在IE 8中,这可能无法正常工作。我对瑞士法郎的参数进行了以下更改,现在似乎可以解决所有问题。

params.wmode = "opaque";