System.Windows.Browser.HtmlPage的javascript Invoke在Safari下无法工作

为了让页面javascript订阅Silverlight控件的事件,会包装一个事件机制,最后内部通过调用HtmlPage的一些函数触发它,比如HtmlPage.Window.Eval、HtmlPage.Window.Invoke等。但是在Safari浏览器下这类交互无法成功,比如弹出一个消息框:

HtmlPage.Window.Eval("alert('test');");
HtmlPage.Window.Alert("test");
HtmlPage.Window.Invoke("alert", "test");

尝试添加一个按钮,并触发它的click事件去弹出消息框仍旧无法工作:

HtmlElement btnTest = HtmlPage.Document.GetElementById("btnTest");

if (btnTest != null)
    btnTest.Invoke("click");
<input type="button" id="btnTest" onclick="btnTest_click(this)" />
<script type="text/javascript">
    function btnTest_click(sender, e) {
        alert("test");
    }
</script>

要解决Safari上的这个限制,可以考虑通过由页面javascript轮询Silverlight控件机制。比如将需要执行的脚本存储到一个队列中,页面脚本获取到它并eval。

为Silverlight控件的object元素添加onload事件订阅,window.onload、document.ready时Silverlight的代理客户端对象并未生成:

<param name="onload" value="silverlight1_onload" />
function silverlight1_onload(sender, e) {
    var host = document.getElementById("silverlight1");
    var clientApi = host.Content.Api;

    setInterval(function () {
        var script = clientApi.GetWaitScripts();

        if (script.length > 0)
            eval(script);
    }, 5000);
}
原文地址:https://www.cnblogs.com/junchu25/p/2944466.html