【发布时间】:2011-12-01 21:24:26
【问题描述】:
我可以通过这个链接在 C# windows 窗体中的 WebBrowser 控件中注入 JavaScript
How to inject JavaScript in WebBrowser control?
但我在 WP7 中无法做到这一点,请帮助我。
【问题讨论】:
标签: c# javascript silverlight windows-phone-7
我可以通过这个链接在 C# windows 窗体中的 WebBrowser 控件中注入 JavaScript
How to inject JavaScript in WebBrowser control?
但我在 WP7 中无法做到这一点,请帮助我。
【问题讨论】:
标签: c# javascript silverlight windows-phone-7
很遗憾,WebBrowser.Document 在 WP7 上不可用。但是您可以使用 InvokeScript 创建和调用 JavaScript 函数。看看over here 我描述的方法。
简而言之:您不使用.Document 和C#,而是创建一段JavaScript。然后,您使用此脚本作为参数调用eval 来调用它。像这样:
webBrowser1.InvokeScript("eval", " ...code goes here... ");
【讨论】:
<body></body>?有了这个,eval 肯定 not 与桌面 WebBrowser 一起工作,至少需要一个 <script> 标记。你认为 Windows Phone 不需要它吗?
对于桌面版WebBrowser (WinForms/WPF),网页上必须至少存在一个<script> 标签,InvokeScript("eval", ...) 才能工作。即,如果页面不包含任何 JavaScript(例如 <body></body>),eval 将无法正常工作。
我没有安装 Windows Phone SDK/模拟器来验证 Windows Phone WebBrowser 是否也是这种情况。
不过,以下内容适用于 Windows 应用商店应用。诀窍是先使用this.webBrowser.InvokeScript("setTimeout", ...) 注入一些JavaScript。我正在使用它而不是 execScript,它自 IE11 以来已被弃用。
async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
// load a blank page
var tcsLoad = new TaskCompletionSource<object>();
this.webBrowser.NavigationCompleted += (s, eArgs) =>
tcsLoad.TrySetResult(Type.Missing);
this.webBrowser.NavigateToString("<body></body>");
await tcsLoad.Task;
// first add a script via "setTimeout", JavaScript gets initialized
var tcsInit = new TaskCompletionSource<object>();
this.webBrowser.ScriptNotify += (s, eArgs) =>
{
if (eArgs.Value == "initialized")
tcsInit.TrySetResult(Type.Missing);
};
this.webBrowser.InvokeScript("setTimeout",
new string[] { "window.external.notify('initialized')", "0" });
await tcsInit.Task;
// then use "eval"
this.webBrowser.InvokeScript("eval",
new string[] { "document.body.style.backgroundColor = 'yellow'" });
}
如果有人能确认这是否适用于 WP WebBrowser,我将不胜感激。 LoadCompleted 应该用于 WP 而不是上面代码中的NavigationCompleted,并且WebBrowser.IsScriptEnabled 必须设置为true。
【讨论】:
setTimeout 技巧,但我没有测试 Windows Phone,这就是这个问题的意义所在。