跨域可编写脚本的Silverlight应用程序

时间:2010-10-29 15:04:39

标签: javascript silverlight browser silverlight-4.0 cross-domain

我遇到使用Silverlight进行跨域应用程序托管的问题。

我有一个托管在不同域上的应用程序,并在页面中包含以下HTML代码:

<script type="text/javascript">
function succ( sender, args ) {
    console.log("SUCCESS");
    console.log(sender);
    console.log(args);
}
function err( sender, args ) {
    console.log("FAILURE");
    console.log(sender);
    console.log(args);
}
</script>
<object width="400" height="20" id="app" type="application/x-silverlight-2" data="data:application/x-silverlight-2,">
    <param name="minruntimeversion" value="4.0.41108.0"/>
    <param name="autoupgrade" value="false"/>
    <param name="onerror" value="err"/>
    <param name="onload" value="succ"/>
    <param name="enablehtmlaccess" value="true"/>
    <param name="source" value="http://example.com/app.xap"/>
</object>

但如果app.xap应用程序托管在与此HTML代码不同的域上,则onLoad succ函数将在不带参数的情况下调用,因此它会记录以下行:

SUCCESS
undefined
undefined

如果我在同一个域上托管,它会记录正确的行:

SUCCESS
UserControl {}
undefined

所以在第一种情况下,我无法通过javascript访问[ScriptableMember]带注释的方法,因为我没有对该应用程序的任何引用。

AppManifest.xml文件中,我将HtmlPage.RegisterScriptableObject方法所需的属性包括在内:

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            ExternalCallersFromCrossDomain="ScriptableOnly"
>
    <Deployment.Parts>
    </Deployment.Parts>
</Deployment>

xap文件随application/x-silverlight-app Content-Type一起传输,所以这也不是问题。

我错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

让我们假设你已经注册了一个名为“Thingy”的外部对象。

您应该能够通过html对象元素的Content属性访问它。在对象标记上放置id="mySL"。现在尝试以下代码: -

function succ( sender, args ) { 
    console.log("SUCCESS"); 
    console.log(document.getElementById("mySL").Content.Thingy); 
    console.log(args); 
} 

请务必在代码的早期注册“Thingy”,就像在用作根视觉的类的构造函数中一样。

答案 1 :(得分:0)

同样的问题,并在他的评论

中描述的主题启动器解决了
  

我必须将所有可编写脚本的代码放到我的根视觉类