【发布时间】:2021-12-17 16:57:45
【问题描述】:
我在 xamarin 中使用 webview,我遵循了许多教程来处理导航,并且一切正常。 我的问题是:当一个锚标签有一个 target="_blank" 时,导航事件永远不会被触发。
我看到周围有人给出了一个 javascript 解决方案,该解决方案删除了 target=_blank 并将其附加在 href 链接的末尾。
这真的是正确的方法吗?看有线..
谢谢
这是 xamarin.android 渲染器中的初始化
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
global::Android.Webkit.WebView.SetWebContentsDebuggingEnabled(true);
if (e.OldElement != null)
{
Control.RemoveJavascriptInterface("jsBridge");
((HybridWebView)Element).Cleanup();
}
if (e.NewElement != null)
{
Control.Settings.JavaScriptEnabled = true;
Control.Settings.DomStorageEnabled = true;
Control.Settings.JavaScriptCanOpenWindowsAutomatically = true;
Control.Settings.SetSupportMultipleWindows(true);
Control.Settings.AllowFileAccessFromFileURLs = true;
Control.Settings.AllowUniversalAccessFromFileURLs = true;
Control.Settings.UserAgentString = Control.Settings.UserAgentString + " crmvw";
Android.Webkit.WebChromeClient xCC = new CustChromeWebViewClient(_context);
Control.SetWebChromeClient(xCC);
Control.SetWebViewClient(new CrmWebViewClient(this, $"javascript: {JavascriptFunction}"));
Control.AddJavascriptInterface(new JSBridge(this), "jsBridge");
Control.LoadUrl(((HybridWebView)Element).Uri);
}
}
这是我的导航事件,当锚点有 target=_blank 时从未触发
private void webv_Navigating(object sender, WebNavigatingEventArgs e)
{
if (IsFirstLoad) {
IsBusy = true;
IsFirstLoad = false;
}
if (e.Url.ToLower().StartsWith("tel:") || e.Url.ToString().StartsWith("wtai:") || e.Url.ToLower().StartsWith("sms:") || e.Url.ToLower().StartsWith("mailto:"))
{
e.Cancel = true;
}
}
这里是我的自定义 WEBView 中 URL 的覆盖函数
public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, Android.Webkit.IWebResourceRequest request)
{
Android.Net.Uri url = request.Url;
if (url.ToString().StartsWith("tel:") || url.ToString().StartsWith("wtai:"))
{
Xamarin.Essentials.PhoneDialer.Open(UtilityXam.Contact.GetPhoneFromHTML(url.ToString()));
return true;
}else if (url.ToString().StartsWith("mailto:"))
{
UtilityXam.Contact xE = new UtilityXam.Contact();
string xEmail = UtilityXam.Contact.GetEmailFromHTML( url.ToString());
var xTask = xE.SendEmail("","",new System.Collections.Generic.List<string>(){ xEmail });
return true;
}
else if (url.ToString().StartsWith("sms:"))
{
UtilityXam.Contact xE = new UtilityXam.Contact();
string xPh = UtilityXam.Contact.GetPhoneFromHTML(url.ToString());
var xTask = xE.SendSMS("", "", new System.Collections.Generic.List<string>() { xPh });
}
else
{
view.LoadUrl(url.ToString());
}
view.SetDownloadListener(new CrmDownloadListener(_context));
return true;
}
【问题讨论】:
-
这solution 是否回答了您的问题。检测url并检查是否有target=blank。
-
我已经找到并且我已经尝试过这个解决方案,但它对我不起作用。我在导航事件中添加了 JS 函数并通过 webview 对其进行评估。当我单击目标 _blank 锚时,不会触发事件导航。我的问题是,为什么事件没有被触发?
-
您使用的是 Xamarin.forms 还是 Xamarin.Android?
-
点击其他 url 而不是目标 _blank 锚点时是否触发事件。
-
是的,另一个 URL 非目标 _blank 被触发,并且导航事件在 Xamarin.Forms 中。我在 Xamarin.Android 中也有一个渲染器,我在 Element changed 事件中初始化了 webview,我启用了对多个窗口的支持,我还添加了一个自定义 chromeclient 和一个自定义 webview,以便添加 javascript 函数来调用 c#。
标签: android xamarin.forms webview