在 Xamarin.Forms 的 WebView 中通过 Javascript onClick 事件调用 C# 函数
Calling a C# function through Javascript onClick event in WebView in Xamarin.Forms
我有一个 post 类型 WebView
,我设法将其与服务响应绑定为字符串,但我有一些 link 类似相关的 post 具有他们的身份证。单击那些 links 我希望用户转到该文章。我尝试了很多解决方案,但它看起来像 JavaScript 点击时不调用,它在加载时调用,因为我完整的 WebView被视为字符串,如果我连接它,它肯定不会保留为脚本。
这是我完整的WebView代码,附上的截图是link在WebView中制作的。
我设法通过在字符串中连接整个响应来使其工作。
下面是帮助我实现这一目标的代码
String getHtml()
{
var bodyStyle = "<!DOCTYPE html><html><head><style>body{height: 100%;}p{text-align:left;color:#191919;}filter{background-color:#191919;}a:link"
+ "{color:#2588B0; background-color:transparent}a:visited {color:#0099CC; background-color:transparent}"
+ "a:hover{color:#0099CC; background-color:transparent}a:ative{color:#0099CC; background-color:transparent}span{background-color: yellow;color: black}customRight{float: right}</style></head><body>";}
var refs = bodyStyle;
refs = refs + "<center><h4>" + response.Title + "<h4></center>";
if (response.Pc.Count > 0)
{
refs = refs + "<center><u>" + Pc +
"</a></u></center><br>";
}
if (string.IsNullOrWhiteSpace(response.Cn))
{
refs = refs + "<center>" + response.Cn + "</center><br>";
}
if (response.Judges.Count() > 0)
{
refs = refs + "<center> <strong>Coram:</strong> " + JudgesN + "</center><br>";
}
if (string.IsNullOrWhiteSpace(response.JGD.ToString()))
{
refs = refs + "<center> <strong>Decided On:</strong> " + response.JGD + "</center><br>";
}
if(string.IsNullOrWhiteSpace(response.AppealType) )
{
refs = refs + "<center> <strong>Appeal Type: </strong>" + response.AppealType + "</center><br>";
}
if (response.Appellants != null)
{
refs = refs + "<left><b>" + apeal + "</b></left>";
refs = refs + "<customRight>apeal</customRight><br>";
}
refs = refs + "<center>VERSUS</center>";
if (response.Respondants != null)
{
refs = refs + "<left><b>" + resp + "</b></left>";
refs = refs + "<customRight>resps</customRight><br><br>";
}
if (string.IsNullOrWhiteSpace(response.FinalVr))
{
refs = refs + "<center> <strong>Final:</strong> " + response.FinalVr + "</center><br>";
}
if (string.IsNullOrWhiteSpace(response.note))
{
refs = refs + "<p> <strong>Note:</strong><br/> " + response.Headnote.ToLowerInvariant() + "</p><br>";
}
if(response.Refs != null)
{
refs = refs + "<left><b>Refered Jdgmts: </b></left><br>";
foreach(var obj in response.Refs)
{
if(obj.Jid == null) {
refs = refs + "<p style='font-size:13px;'>"
+ obj.Title
+"</p>";
}
else
{
refs = refs + "<p style='font-size:13px;'>" + "<a href=\""
+ obj.Jid
+ "\" target=\"_blank\" onClick=\"(function(e){alert('e is here'); "+ loadJt(obj.Jid);+"return false;})(); return false;\">"
+ obj.Title
+ "</a>"
+ "</p>";
}
jdgmt = jdgmt.Replace("^^^", "<br/><br/>");
jdgmt = jdgmt.Replace("<SPARA>", "<p>");
jdgmt = jdgmt.Replace("</SPARA>", "</p>");
refs = refs + jdgmt;
refs = refs + "</body></html>";
return refs;
}
data.Source = new HtmlWebViewSource { Html = getHtml(), BaseUrl="http://url.com/", BindingContext = response };
这是我的 LoadJt 函数
string loadJt(string jjid)
{
loadJmt(jid);// invokes the constructor and updates my VM too.
return jid;
}
下面 link 的显示方式
不幸的是,当我们谈论移动端的 WebView 时。通过 JavaScript 调用 C# 函数是一种糟糕的方法。
由于 webview,这样做非常有限,并且您在每个平台上可能也会遇到很多问题
所以这里我们找到一个适合我的解决方案,我经常使用它
1) 您不需要实施 CustomRenderer,只需在您的 xamarin.forms 和 HTML
2) 这个解决方案适用于调用相机,以原生方式下载文件,以及任何你想要的,只需拦截导航事件
3) 在您的 HTML 代码中实现
"<a href=></a>"
像这样:
"<a href='..MyOnclickMethod?objId="+obj.Jid+"'>"
+ obj.Title+ "</a>"
4) 在您的 Xamarin WebView 上
...
webview.Navigating+=WebView_Navigating
...
private void WebView_Navigating(object sender, WebNavigatingEventArgs evt)
{
string url = evt.Url;
if (url.Contains("..MyOnclickMethod"))
{
//do your code here...
evt.Cancel = true;
}
}
确保您调用 evt.Cancel = true;
防止webview继续process requisition
如果id还没到:
您安装的字符串可能不正确
如果你确定这一点但它还没有工作,请尝试传入
"<a href>"
一个有效的 URL 和你的 id
"<a href='www.google.com/?objId='"+obj.Jid+">"
希望对你有所帮助
我有一个 post 类型 WebView
,我设法将其与服务响应绑定为字符串,但我有一些 link 类似相关的 post 具有他们的身份证。单击那些 links 我希望用户转到该文章。我尝试了很多解决方案,但它看起来像 JavaScript 点击时不调用,它在加载时调用,因为我完整的 WebView被视为字符串,如果我连接它,它肯定不会保留为脚本。
这是我完整的WebView代码,附上的截图是link在WebView中制作的。
我设法通过在字符串中连接整个响应来使其工作。 下面是帮助我实现这一目标的代码
String getHtml()
{
var bodyStyle = "<!DOCTYPE html><html><head><style>body{height: 100%;}p{text-align:left;color:#191919;}filter{background-color:#191919;}a:link"
+ "{color:#2588B0; background-color:transparent}a:visited {color:#0099CC; background-color:transparent}"
+ "a:hover{color:#0099CC; background-color:transparent}a:ative{color:#0099CC; background-color:transparent}span{background-color: yellow;color: black}customRight{float: right}</style></head><body>";}
var refs = bodyStyle;
refs = refs + "<center><h4>" + response.Title + "<h4></center>";
if (response.Pc.Count > 0)
{
refs = refs + "<center><u>" + Pc +
"</a></u></center><br>";
}
if (string.IsNullOrWhiteSpace(response.Cn))
{
refs = refs + "<center>" + response.Cn + "</center><br>";
}
if (response.Judges.Count() > 0)
{
refs = refs + "<center> <strong>Coram:</strong> " + JudgesN + "</center><br>";
}
if (string.IsNullOrWhiteSpace(response.JGD.ToString()))
{
refs = refs + "<center> <strong>Decided On:</strong> " + response.JGD + "</center><br>";
}
if(string.IsNullOrWhiteSpace(response.AppealType) )
{
refs = refs + "<center> <strong>Appeal Type: </strong>" + response.AppealType + "</center><br>";
}
if (response.Appellants != null)
{
refs = refs + "<left><b>" + apeal + "</b></left>";
refs = refs + "<customRight>apeal</customRight><br>";
}
refs = refs + "<center>VERSUS</center>";
if (response.Respondants != null)
{
refs = refs + "<left><b>" + resp + "</b></left>";
refs = refs + "<customRight>resps</customRight><br><br>";
}
if (string.IsNullOrWhiteSpace(response.FinalVr))
{
refs = refs + "<center> <strong>Final:</strong> " + response.FinalVr + "</center><br>";
}
if (string.IsNullOrWhiteSpace(response.note))
{
refs = refs + "<p> <strong>Note:</strong><br/> " + response.Headnote.ToLowerInvariant() + "</p><br>";
}
if(response.Refs != null)
{
refs = refs + "<left><b>Refered Jdgmts: </b></left><br>";
foreach(var obj in response.Refs)
{
if(obj.Jid == null) {
refs = refs + "<p style='font-size:13px;'>"
+ obj.Title
+"</p>";
}
else
{
refs = refs + "<p style='font-size:13px;'>" + "<a href=\""
+ obj.Jid
+ "\" target=\"_blank\" onClick=\"(function(e){alert('e is here'); "+ loadJt(obj.Jid);+"return false;})(); return false;\">"
+ obj.Title
+ "</a>"
+ "</p>";
}
jdgmt = jdgmt.Replace("^^^", "<br/><br/>");
jdgmt = jdgmt.Replace("<SPARA>", "<p>");
jdgmt = jdgmt.Replace("</SPARA>", "</p>");
refs = refs + jdgmt;
refs = refs + "</body></html>";
return refs;
}
data.Source = new HtmlWebViewSource { Html = getHtml(), BaseUrl="http://url.com/", BindingContext = response };
这是我的 LoadJt 函数
string loadJt(string jjid)
{
loadJmt(jid);// invokes the constructor and updates my VM too.
return jid;
}
下面 link 的显示方式
不幸的是,当我们谈论移动端的 WebView 时。通过 JavaScript 调用 C# 函数是一种糟糕的方法。 由于 webview,这样做非常有限,并且您在每个平台上可能也会遇到很多问题
所以这里我们找到一个适合我的解决方案,我经常使用它
1) 您不需要实施 CustomRenderer,只需在您的 xamarin.forms 和 HTML
2) 这个解决方案适用于调用相机,以原生方式下载文件,以及任何你想要的,只需拦截导航事件
3) 在您的 HTML 代码中实现
"<a href=></a>"
像这样:
"<a href='..MyOnclickMethod?objId="+obj.Jid+"'>"
+ obj.Title+ "</a>"
4) 在您的 Xamarin WebView 上
...
webview.Navigating+=WebView_Navigating
...
private void WebView_Navigating(object sender, WebNavigatingEventArgs evt)
{
string url = evt.Url;
if (url.Contains("..MyOnclickMethod"))
{
//do your code here...
evt.Cancel = true;
}
}
确保您调用 evt.Cancel = true; 防止webview继续process requisition
如果id还没到: 您安装的字符串可能不正确 如果你确定这一点但它还没有工作,请尝试传入
"<a href>"
一个有效的 URL 和你的 id
"<a href='www.google.com/?objId='"+obj.Jid+">"
希望对你有所帮助