我在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”事件进行测试时,内容已经未定义。
我不知道异常是否是它之前有效的事实,或者它现在不起作用。但如果有人能告诉我如何让它现在发挥作用,那将会成为我的一天。
答案 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)
这些操作无法解决我的问题:
这就解决了我的问题:
注意:我使用MS Visual Studio 2010进行.NET开发
答案 2 :(得分:0)
我认为这是一个时间问题。在完全加载Silverlight组件之前,可能正在执行访问Content元素的代码。
我有完全相同的问题并通过使用Javascript Timer解决它,直到元素完全加载。有趣的是,这个问题仅适用于IE而不是其他浏览器。