我一直在尝试从iOS上Xamarin表单的JS代码调用操作。一旦我点击代码js就不会被调用。这是我一直在测试的一个例子。一旦我点击了文本,但功能没有被触发,我不想在点击按钮后显示动作,而是在我点击文本后显示。请告诉我我做错了什么。
<StackLayout x:Name="slHybridView" > </StackLayout> public MainPage() { InitializeComponent(); BindingContext = new LearningPageViewModel(); ((LearningPageViewModel)BindingContext).TextChanged += TextChanged; hybridWebView = new HybridWebView() { HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand, Content = ((LearningPageViewModel)BindingContext).ArticleHtmlFormat, }; hybridWebView.RegisterAction(data => DisplayAlert("Alert", "Hello " + data, "OK")); slHybridView.Children.Clear(); slHybridView.Children.Add(hybridWebView); } public class HybridWebViewRenderer : WkWebViewRenderer, IWKScriptMessageHandler { const string JavaScriptFunction = "function invokeCSharpAction(data){window.webkit.messageHandlers.invokeAction.postMessage(data);}"; WKUserContentController userController; public HybridWebViewRenderer() { } public HybridWebViewRenderer(WKWebViewConfiguration config) : base(config) { userController = config.UserContentController; var script = new WKUserScript(new NSString(JavaScriptFunction), WKUserScriptInjectionTime.AtDocumentEnd, false); userController.AddUserScript(script); userController.AddScriptMessageHandler(this, "invokeAction"); } protected override void OnElementChanged(VisualElementChangedEventArgs e) { base.OnElementChanged(e); if (e.OldElement != null) { userController.RemoveAllUserScripts(); userController.RemoveScriptMessageHandler("invokeAction"); HybridWebView hybridWebView = e.OldElement as HybridWebView; hybridWebView.Cleanup(); } if (e.NewElement != null) { var html = string.Empty; var iOSHtmlWithScaling = html.Insert(0, "<meta name='viewport' content='width=device-width,initial-scale=1,maximum-scale=1' />"); var script = new WKUserScript(new NSString(JavaScriptFunction), WKUserScriptInjectionTime.AtDocumentEnd, false); Configuration.UserContentController.AddUserScript(script); Configuration.UserContentController.AddScriptMessageHandler(this, JavaScriptFunction); LoadData(((HybridWebView)Element).Content, iOSHtmlWithScaling, "utf-8", new NSUrl("")); } } public void DidReceiveScriptMessage(WKUserContentController userContentController, WKScriptMessage message) { ((HybridWebView)Element).InvokeAction(message.Body.ToString()); } protected override void Dispose(bool disposing) { if (disposing) { ((HybridWebView)Element).Cleanup(); } base.Dispose(disposing); } } public LearningPageViewModel() { articleHtmlFormat = ArticleHtml(); } public string ArticleHtml() { var articleHtml = @"<html> <head> <meta name='viewport' content='width=device-width,initial-scale=1,maximum-scale=1' /> </head> <body class='avat'> <style> .avat { font-family: sans-serif; font-size: 15px; text-align: justify; } .title { font-size: 16px; } .red { color: red; } .word { font-weight: bold; } .phrase { text-decoration: underline; } </style> <script type='text/javascript'> function invokeCSCode(data) { var els = document.getElementsByClassName('red'); while (els[0]) { els[0].classList.remove('red'); } invokeCSharpAction(data); var my_element = document.querySelector('[sentenceId=' + data + ']'); my_element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' }); var sentenceName = my_element.getAttribute('sentenceName'); if (data[0] === 's') { var x = document.querySelectorAll('[sentenceName=' + sentenceName + ']'); var i; for (i = 0; i < x.length; i++) { x[i].classList.add('red'); } } else { my_element.classList.add('red'); } } function scrollToPosition(data) { var els = document.getElementsByClassName('red'); while (els[0]) { els[0].classList.remove('red'); } var my_element = document.querySelector('[sentenceId=' + data + ']'); my_element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' }); var sentenceName = my_element.getAttribute('sentenceName'); if (data[0] === 's') { var x = document.querySelectorAll('[sentenceName=' + sentenceName + ']'); var i; for (i = 0; i < x.length; i++) { x[i].classList.add('red'); } } else { my_element.classList.add('red'); } } </script> "; var spans = FindAllClickableSpans(Article()).ToArray(); for (int i = 0; i < spans.Length; i++) { articleHtml += "<span "; articleHtml += " sentenceId='" + i + "' onclick='javascript: invokeCSCode(\"" + i + "\");' sentenceName='" + i + "'>" + spans[i] + "</span>"; } articleHtmlFormat = articleHtml; return articleHtmlFormat; } public string Article() { return @"Excuse me,” said a girl, “you look lost. Can I help you?”\“Yes, please. Thank you."; } private IEnumerable<string> FindAllClickableSpans(string article) { article = article.ToLower(); return article.Split('.'); }