B4J Question B4J JavaFX Webview: JavaScript does not work

peacemaker

Expert
Licensed User
Longtime User
Hi, All

But why JS does not work by default, like "alert()" function ?

1738056283708.png


Such enabling does not help:
B4X:
Sub B4JWebViewSettings(wv1 As WebView, parameter As String, value As Object)
    wv1.As(JavaObject).RunMethodJO("getEngine", Null).RunMethod(parameter, Array(value))     'Webview1.As(JavaObject).RunMethodJO("getEngine", Null).RunMethod("executeScript", Array(js))
End Sub

B4JWebViewSettings(WebView1, "setJavaScriptEnabled", True)

Test project is attached, please, help to understand what is the trouble ?
 

Attachments

  • b4jWVtest_v1.zip
    2.6 KB · Views: 64
Last edited:

Daestrum

Expert
Licensed User
Longtime User
Webview doesn't supply a handler for an alert callback - you have to write it.

B4X:
    B4JWebViewSettings(WebView1, "setJavaScriptEnabled", True)
    Me.as(JavaObject).RunMethod("setAlertHandler",Array(WebView1))
    WebView1.LoadHtml("<script> alert('Hello B4J WebView!') </script>")

...

Sub myAlert(s As String)'ignore
    xui.MsgboxAsync(s,"Webview alert")
End Sub

...

#if java
import javafx.scene.web.*;
import javafx.event.*;

public void setAlertHandler(WebView wv) {

 wv.getEngine().setOnAlert(new EventHandler<WebEvent<String>>(){

            @Override
            public void handle(WebEvent<String> arg0) {            
               caller(arg0.getData());
            }

        });
}
public void caller(String s){
    try{
    _myalert(null, s);    // lazy way to call sub
    } catch (Exception e) {
    }
}
#End If
 
Upvote 0

peacemaker

Expert
Licensed User
Longtime User
Webview doesn't supply a handler for an alert callback
Ohhhhh ! Do you mean no normal universal work as a browser ?

For confirm() function is it also needed any Java code ?

OK, my foolish code is collected so:
B4X:
Sub B4XPage_Appear
    WebView1.LoadHtml("<h1>Just text, wait</h1>")
    Sleep(3000)
    B4JWebViewSettings(WebView1, "setJavaScriptEnabled", True)
    Me.as(JavaObject).RunMethod("setAlertHandler", Array(WebView1))
    Me.as(JavaObject).RunMethod("setConfHandler", Array(WebView1, "Sure ?"))
    WebView1.LoadHtml("<script> alert('Hello B4J WebView!') </script>")
    Sleep(3000)
    WebView1.LoadHtml("<script> confirm('Hello B4J WebView ?') </script>")
End Sub


Sub B4JWebViewSettings(wv1 As WebView, parameter As String, value As Boolean)
    wv1.As(JavaObject).RunMethodJO("getEngine", Null).RunMethod(parameter, Array(value))     'Webview1.As(JavaObject).RunMethodJO("getEngine", Null).RunMethod("executeScript", Array(js))
End Sub

Sub jsAlert(s As String)'ignore
    xui.MsgboxAsync(s, "Information:")
End Sub


#if java
import javafx.scene.web.*;
import javafx.event.*;
import javafx.util.Callback;
import javafx.scene.web.WebView;
import javafx.scene.web.WebEngine;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import java.util.Optional;
import javafx.scene.control.ButtonType;

public void setAlertHandler(WebView wv) {

 wv.getEngine().setOnAlert(new EventHandler<WebEvent<String>>(){

            @Override
            public void handle(WebEvent<String> arg0) {           
               callerAlert(arg0.getData());
            }
        });
}
public void callerAlert(String s){
    try{
    _jsalert(null, s);    // lazy way to call sub
    } catch (Exception e) {
    }
}
// set the handler
public static void setConfHandler(WebView wv, String msg){
    WebEngine we = wv.getEngine();
    we.setConfirmHandler(new Callback<String, Boolean>() {
       @Override public Boolean call(String msg) {
          Boolean confirmed = confirm(msg);
          return confirmed;
           }
      });
}
//show the dialog box
private static boolean confirm(String msg){
    Alert alert = new Alert(AlertType.CONFIRMATION);
    alert.setTitle("Are you sure ?");
    alert.setHeaderText(msg);

    Optional<ButtonType> result = alert.showAndWait();
    if (result.get() == ButtonType.OK){
       return true;
    } else {
       return false;
    }
}
#End If
 

Attachments

  • b4jWVtest_v2.zip
    3.4 KB · Views: 62
Last edited:
Upvote 0

Daestrum

Expert
Licensed User
Longtime User
Yes confirm needs similar.
 
Upvote 0

peacemaker

Expert
Licensed User
Longtime User
Maybe do we have fully-functionally usable WebView for B4J ? @Erel, could you suggest ?
Now, as i can understand, it's impossible to use WebView of B4J for normal web-site wrapping (like in B4A), if any JS is _somewhere_ used on web-site ?
 
Upvote 0
Top