在IE中从Javascript调用Silverlight代码

时间:2012-05-28 16:14:40

标签: javascript html silverlight

我在HTML页面中有一个Silverlight应用程序。 SL插件托管在“对象”HTML标记中。当用户关闭网页时,我想在Silverlight应用程序中调用一个函数。代码是这样的:

(简化)HTML代码:

<div id="silverlightControlHost">
    <object id="MyApp" data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
        <param name="source" value="ClientBin/MyApp.xap" />
        ...
        </object><iframe id="_sl_historyFrame"></iframe></div>

Javascript代码:

<script type="text/javascript">
    window.onbeforeunload = confirmExit;

    function confirmExit()
    {
        var control = document.getElementById("MyApp");
        var message = control.content.BrowserIntegration.MyAppFunction();

        if (message)
        {
            return message;
        }
    }
</script>

它曾经工作,它不再起作用,至少在Internet Explorer 8中.HTML对象的内容属性(control.content)是未定义的。奇怪。最近这个房产有变化吗?我很确定它在2个月前有效,并且在此之前它已经运行了很长时间。该网站是在我信任的网站,我没有在IE中找到我从那时起改变的设置(可能有一个或两个,但扫描列表,我还没有找到任何东西)。

当我使用HTML对象的“onLoad”事件进行测试时,内容已经未定义。

我不知道异常是否是它之前有效的事实,或者它现在不起作用。但如果有人能告诉我如何让它现在发挥作用,那将会成为我的一天。

3 个答案:

答案 0 :(得分:0)

我创建了一个从IE调用Silverlight代码的向导:

1)需要识别silverlight控件:添加“id”标签:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
            width="100%" height="100%" id="_sl_facebookapp">

2)需要来自silverlight代码的注册脚本对象:

HtmlPage.RegisterScriptableObject("FBSHandler", this);

3)Mark需要silverlight方法作为ScriptableMember:

[ScriptableMember]
        public void FBAuthorized(string authKey){}

4)您应该使用已注册的脚本化对象来调用Silverlight方法:

var silverlightCtrlId = '_sl_facebookapp';

function handleStatusResponse(response) {
    var control = document.getElementById(silverlightCtrlId);    
        var accessToken = response.authResponse.accessToken;
        if (control != null) {
            control.Content.FBSHandler.FBAuthorized(accessToken);
        }
    }
}

工作正常。希望它会对你有所帮助。

答案 1 :(得分:0)

这些操作无法解决我的问题:

  • 检测并清除病毒
  • 降低IE8中的安全级别
  • 重新安装Internet Explorer 8
  • 重新安装Silverlight组件

这就解决了我的问题:

  • 重新安装Silverlight Developer运行时

注意:我使用MS Visual Studio 2010进行.NET开发

答案 2 :(得分:0)

我认为这是一个时间问题。在完全加载Silverlight组件之前,可能正在执行访问Content元素的代码。

我有完全相同的问题并通过使用Javascript Timer解决它,直到元素完全加载。有趣的是,这个问题仅适用于IE而不是其他浏览器。