代码之家  ›  专栏  ›  技术社区  ›  AwkwardCoder

SilverLight调用javascript问题?

  •  1
  • AwkwardCoder  · 技术社区  · 14 年前

    我使用html page.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 回复  |  直到 14 年前
        1
  •  1
  •   MK.    14 年前

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

    解决方法是将方法注册到窗口对象。为了简化这个过程,我创建了一个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助手,以便在对窗口对象调用时维护对代理实例的引用。