0

我正在尝试创建一个基于 MVVM Caliburn 的 WinRT 8.1 应用程序(我知道 CM 在 2.0 版发布之前不会与 8.1 完美兼容,但错误似乎并不相关,因为它也会在处理程序放在视图代码后面)。它的一个视图包含一个WebView控件,其内容是通过NavigateToString设置的(HTML 内容来自应用程序安装的资产)。加载到此控件中的 HTML 包括几个超链接,其中大多数表示对其他基于资产的 HTML 内容的交叉引用。因此,当用户单击我想要覆盖标准导航操作的链接时,通知我的视图模型,并让它从应用程序资产中加载另一个 HTML 内容。

这是我在 WebView (WinRT) 中在外部浏览器中打开链接后所做的:

  1. 在 XAML 代码中,我向 WebView 控件添加了一个用于将 ScriptNotify 事件附加到我的 VM 的属性:(cal:Message.Attach="[Event ScriptNotify] = [Action GetFromLink($eventArgs)]"请参阅https://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions)。

  2. 在我的虚拟机中,方法签名是public void GetFromLink(NotifyEventArgs e).

  3. 每当我的 VM 将一些 HTML 加载到 WebView 中时,它首先会在 HTML 头中注入一个脚本,该脚本替换代表交叉引用的每个锚点的单击处理程序(所有这些锚点都由一个class="xref"属性标记)。该脚本在我的虚拟机中保持不变:

private const string SCRIPT = "for (var i = 0; i < document.links.length; i++) {" + "var className = document.links[i].getAttribute(\"class\");" + "if (className && className === \"xfer\") {" + "document.links[i].onclick = function() {" + "window.external.notify('url:' + this.href);" + "return false;" + "}}}";

现在,当我启动应用程序时,加载一个包含这些外部参照之一的项目并单击它,我得到一个未处理的异常,告诉我"navCancelInit is undefined"。我想这个错误是从 JS 代码中浮现出来的,但是我看不到应该在哪里以及如何定义这个函数。

根据http://msdn.microsoft.com/library/windows/apps/br227713 ,当通过NavigateToString加载 HTML 时,我不需要任何额外的ScriptNotify步骤。有人可以提出解决方案吗?

4

2 回答 2

0

如果您收听此事件:http: //msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.domcontentloaded.aspx WebView.DOMContentLoaded 事件,所有的脚本应该在 WebView 中加载并且您应该能够访问和执行,如果您尝试在不加载脚本之前执行此操作。

于 2013-12-04T03:43:15.090 回答
0

我从一个 MS 专家那里得到了关于这个的答案,所以这个答案不是我的功劳:这是一个时间问题。在运行更改 DOM 的脚本之前,我必须确保页面已完全加载;很简单,如果你想的话。只需将脚本移动到页面末尾,或者将其包装在 onload 处理程序中,就可以解决问题。希望这可以为其他人节省一些头发!

于 2013-11-18T18:07:42.173 回答