Silverlight调用javascript问题?

时间:2010-02-18 16:52:50

标签: javascript silverlight function silverlight-3.0

我正在使用HtmlPage.Window.Invoke api从SL组件调用javascript,当我调用页面(html)中定义的javascript函数时,它按预期执行,例如。

HtmlPage.Window.Invoke("publishValue", topic, jsonObject);

但是当我将javascript函数放在* .js文件中时,即使将* .js文件加载到DOM中,它仍然无法执行该方法,因此以下操作因调用异常而失败。

HtmlPage.Window.Invoke("FrameworkEventBroker.publishFrameworkEvent", topic, jsonObject);

为什么会发生这种情况?

干杯

AWC

1 个答案:

答案 0 :(得分:1)

问题不在于(* .js),在调用没有直接附加到窗口实例的方法时会失败。

解决方法是将方法注册到window对象。为了简化这一点,我创建了一个JavaScript帮助程序,如下所示:

<script type="text/javascript">
function createDelegate(instance, method) {
    return function () {
        return method.apply(instance, arguments);
    }
}
function registerBroker(prefix, brokerInstance) {
    for (var prop in brokerInstance)
        //uncomment the IF statement to only include properties 
        //starting with upper case letter.
        //if (prop.charAt(0) >= 'A' && prop.charAt(0) <= 'Z') 
             eval("window."+prefix+"_" + prop + "= createDelegate(brokerInstance, brokerInstance[prop]);");
}
</script> 

然后您只需调用代理方法:

HtmlPage.Window.Invoke(
          string.Format("{0}_{1}", PREFIX, METHOD_NAME), Args);

就是这样。

示例:

<script type="text/javascript">
    var broker = new FrameworkEventBroker();
    registerBroker("FrameworkEventBroker",broker);
</script>

来自silverlight:

HtmlPage.Window.Invoke("FrameworkEventBroker_publishFrameworkEvent", topic, jsonObject);

更新

我添加了createDelegate助手,以便在窗口对象上调用时维护对代理实例的引用。