为了让页面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); }