有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JS/javawebview:netscape。javascript。JSException:ReferenceError:找不到变量:L

我想通过Webview在JavaFX应用程序中嵌入传单地图。传单地图在浏览器中运行良好。然而,在执行代码时,我得到了这个Stacktrace:

Exception in thread "JavaFX Application Thread" netscape.javascript.JSException: ReferenceError: Can't find variable: L
    at javafx.web/com.sun.webkit.dom.JSObject.fwkMakeException(JSObject.java:157)
    at javafx.web/com.sun.webkit.WebPage.twkExecuteScript(Native Method)
    at javafx.web/com.sun.webkit.WebPage.executeScript(WebPage.java:1513)
    at javafx.web/javafx.scene.web.WebEngine.executeScript(WebEngine.java:972)
    at WebviewTest$1.changed(WebviewTest.java:34)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(ExpressionHelper.java:181)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
    at javafx.base/javafx.beans.property.ReadOnlyObjectPropertyBase.fireValueChangedEvent(ReadOnlyObjectPropertyBase.java:74)
    at javafx.base/javafx.beans.property.ReadOnlyObjectWrapper.fireValueChangedEvent(ReadOnlyObjectWrapper.java:102)
    at javafx.base/javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:113)
    at javafx.base/javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:147)
    at javafx.web/javafx.scene.web.WebEngine$LoadWorker.updateState(WebEngine.java:1251)
    at javafx.web/javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1366)
    at javafx.web/javafx.scene.web.WebEngine$LoadWorker.access$1200(WebEngine.java:1244)
    at javafx.web/javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:1231)
    at javafx.web/com.sun.webkit.WebPage.fireLoadEvent(WebPage.java:2513)
    at javafx.web/com.sun.webkit.WebPage.fwkFireLoadEvent(WebPage.java:2358)
    at javafx.web/com.sun.webkit.network.URLLoader.twkDidFinishLoading(Native Method)
    at javafx.web/com.sun.webkit.network.URLLoader.notifyDidFinishLoading(URLLoader.java:871)
    at javafx.web/com.sun.webkit.network.URLLoader.lambda$didFinishLoading$5(URLLoader.java:862)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:834)

我的Java代码如下:

public void start(Stage primaryStage) {
        primaryStage.setTitle("JavaFX WebView Example");

        WebView webView = new WebView();
        WebEngine webEngine = webView.getEngine();
        File f = new File("pathToHTMLFile");
        webEngine.load(f.toURI().toString());

       webEngine.getLoadWorker().stateProperty().addListener(
        new ChangeListener() {
                    @Override
                    public void changed(ObservableValue observable, Object oldValue, Object newValue) {
                        if (newValue == Worker.State.SUCCEEDED) {
                            //document finished loading
                            webEngine.executeScript("testFunk()");
                        }
                    }
                }
        );

        VBox vBox = new VBox(webView);
        Scene scene = new Scene(vBox, 960, 600);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

我的JS/HTML代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8"/>
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css"
    integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ=="
    crossorigin=""/>

   <script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"
   integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew=="
   crossorigin=""></script>

    <style>
        html { height: 100% }
        body { height: 100%; margin: 0; padding: 0 }
        #mapId { height: 100% }
    </style>

    <script>

        //Works on webbrowser
        //window.onload = testFunk;

        function testFunk(){
            document.getElementById("test").innerHTML = "This function runs";

            var mymap = L.map('mapId').setView([51.505, -0.09], 13);

            L.tileLayer('https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}', {
                attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
                maxZoom: 18,
                id: 'mapbox/streets-v11',
                tileSize: 512,
                zoomOffset: -1,
                accessToken: 'my.mapbox.access.token'
            }).addTo(mymap);

        }


    </script>
  </head>
  <body>
        <p id="test">test</p>
        <div id="mapId"></div>
  </body>
</html>

HTML文件在浏览器中运行良好。我已经测试过从Java文件执行js函数来更改HTML文档的innerHTML,效果很好。我使用的是JavaFX11和Java11。问题可能是外部脚本文件尚未完全加载,但我不知道。提前谢谢

PS:如果问题出在JavaScript上,我想要一个纯JS的答案:)

编辑: 我通过下载传单的源代码并直接引用来解决这个问题


共 (0) 个答案