我们有一个网络和移动应用程序,可以使用HTML生成动态问卷。这使我们可以创建各种各样的问题(文本框,下拉菜单,日期,单选按钮)。我们目前正在使用 Xamarin Forms 重新构建我们的应用程序,并希望重新使用生成此调查表的现有代码。另外,并非我们需要的所有控件都在 Xamarin 中实现。
到目前为止,我已经使用 WebView 在 Xamarin 中生成了问卷。这很完美。当用户提交问卷时,我可以从 WebView 中检索HTML。问题在于HTML不会显示用户对问题输入的任何答案。例如,如果用户在文本字段之一中键入响应,则在 WebView 控件返回的HTML中找不到该响应。
这是我创建HTML调查表的方式。
StringBuilder htmlString = new StringBuilder();
//build up my HTML string here
htmlString.Append("<div>.....");
var htmlWebView = new HtmlWebViewSource { Html = htmlString.ToString() };
WebView.Source = htmlWebView;
在提交按钮的click事件中,我正在这样从 WebView 控件中检索HTML。
var webViewSource = WebView.Source;
var htmlString = (string) WebViewSource.GetValue(HtmlWebViewSource.HtmlProperty);
我可以从 WebView 上传和检索HTML。但是,如何返回用户的回复?
更新
我可以将非常简单的Javascript函数添加到我的 WebView的 HTML中,如下所示。这只返回100。
private static string GetJavascriptFunction()
{
StringBuilder htmlString = new StringBuilder();
htmlString.Append("<html>");
htmlString.Append("<body>");
htmlString.Append("<script type=\"text/javascript\">");
htmlString.Append("function getValue() {");
htmlString.Append("return 100;");
htmlString.Append("}");
htmlString.Append("</script>");
return htmlString.ToString();
}
按如下所示正确调用该函数将返回100。
string result = await WebView.EvaluateJavaScriptAsync("getValue()");
但是,如果我希望Javascript执行任何形式的DOM操作,它始终只会返回null。
private static string GetJavascriptFunction()
{
StringBuilder htmlString = new StringBuilder();
htmlString.Append("<html>");
htmlString.Append("<body>");
htmlString.Append("<script type=\"text/javascript\">");
htmlString.Append("function getValue() {");
htmlString.Append("return document.body.innerHTML;");
htmlString.Append("}");
htmlString.Append("</script>");
return htmlString.ToString();
}
现在返回null。
是否可以使用Javascript在 WebView 控件中从HTML返回值?
答案 0 :(得分:0)
在几次失败的尝试之后,我设法使它起作用。这是我为从WebView检索用户的响应而添加的功能。
private async Task<string> GetValueFromTextbox(string controlId)
{
return await WebView.EvaluateJavaScriptAsync($"document.getElementById('{controlId}').value;");
}
private async Task<string> GetValueFromCheckbox(string controlId)
{
return await WebView.EvaluateJavaScriptAsync($"document.getElementById('{controlId}').checked;");
}
private async Task<string> GetValueFromRadioButton(string controlname)
{
return await WebView.EvaluateJavaScriptAsync($"document.querySelector(\'input[name=\"{controlname}\"]:checked\').value;");
}
private async Task<string> GetValueFromDropdownn(string controlId)
{
return await WebView.EvaluateJavaScriptAsync($"document.getElementById(\'{controlId}\').options[document.getElementById(\'{controlId}\').selectedIndex].text;");
}