java - How to run javascript code in JavaFx.WebView after the page is loaded? -
i used code
public webmap() { webview = new webview(); final webengine webengine = webview.getengine(); string url = getclass().getresource("map.html").toexternalform(); webengine.load(url); final deferred d = new deferred(); webengine.getloadworker().stateproperty().addlistener( new changelistener<state>() { @override public void changed(observablevalue ov, state oldstate, state newstate) { if (newstate == state.succeeded) { d.resolve(webengine); } } } ); readywebengine = d.promise(); } i don't phone call webengine.executescript straight use
readywebengine.then(new promisefunc() { @override public promise apply(object owebengine) { webengine webengine = (webengine)owebengine; webengine.executescript(script); // <============================= // homecoming value doesn't matter homecoming (new deferred()).promise(); } }); so script string isn't evaluated until promise resolved (fulfilled) phone call d.resolve()
let's assume promise library correct
the code works me, colleague of mine gets error frustrating
netscape.javascript.jsexception: referenceerror: can't find variable: gotolatlng [com.sun.webpane.platform.webpage.twkexecutescript(native method), com.sun.webpane.platform.webpage.executescript(webpage.java:1438), javafx.scene.web.webengine.executescript(webengine.java:811), packagename.webmap.webmap$1.apply(webmap.java:36), packagename.webmap.promise.deferred$1$1.apply(deferred.java:23), packagename.webmap.promise.deferred.resolve(deferred.java:40), packagename.webmap.webmap$2.changed(webmap.java:57), packagename.webmap.webmap$2.changed(webmap.java:52), com.sun.javafx.binding.expressionhelper$singlechange.firevaluechangedevent(expressionhelper.java:196), com.sun.javafx.binding.expressionhelper.firevaluechangedevent(expressionhelper.java:100), javafx.beans.property.readonlyobjectwrapper$readonlypropertyimpl.firevaluechangedevent(readonlyobjectwrapper.java:195), javafx.beans.property.readonlyobjectwrapper.firevaluechangedevent(readonlyobjectwrapper.java:161), javafx.beans.property.objectpropertybase.markinvalid(objectpropertybase.java:130), javafx.beans.property.objectpropertybase.set(objectpropertybase.java:163), javafx.scene.web.webengine$loadworker.updatestate(webengine.java:975), javafx.scene.web.webengine$loadworker.dispatchloadevent(webengine.java:1086), javafx.scene.web.webengine$loadworker.access$600(webengine.java:968), javafx.scene.web.webengine$pageloadlistener.dispatchloadevent(webengine.java:955), com.sun.webpane.platform.webpage.fireloadevent(webpage.java:2356), com.sun.webpane.platform.webpage.fwkfireloadevent(webpage.java:2204), com.sun.webpane.webkit.network.urlloader.twkdidfinishloading(native method), com.sun.webpane.webkit.network.urlloader.access$1300(urlloader.java:44), com.sun.webpane.webkit.network.urlloader$6.run(urlloader.java:691), com.sun.glass.ui.invokelaterdispatcher$future.run(invokelaterdispatcher.java:76), com.sun.glass.ui.win.winapplication._runloop(native method), com.sun.glass.ui.win.winapplication.access$100(winapplication.java:17), com.sun.glass.ui.win.winapplication$3$1.run(winapplication.java:67), java.lang.thread.run(thread.java:744)] the html page containing javascript code tested. let's assume there no javascript errors there
the error netscape.javascript.jsexception: referenceerror: can't find variable: gotolatlng doesn't occure me because javascript code executed after loadworker's newstate == state.succeeded.
the probleme in stack trace of coworker's programme , can see webengine.executescript(webengine.java:811) called
packagename.webmap.promise.deferred.resolve(deferred.java:40), packagename.webmap.webmap$2.changed(webmap.java:57), packagename.webmap.webmap$2.changed(webmap.java:52), com.sun.javafx.binding.expressionhelper$singlechange.firevaluechangedevent(expressionhelper.java:196), com.sun.javafx.binding.expressionhelper.firevaluechangedevent(expressionhelper.java:100), so, executescript called listener of load changed event when newstate == state.succeeded means page loaded , javascript within s loaded (variables should defined).
sorry because don't have access coworker's code, it's based on mine. not sure whether code executes javascript code @ right moment
webengine.getloadworker().stateproperty().addlistener( new changelistener<state>() { @override public void changed(observablevalue ov, state oldstate, state newstate) { if (newstate == state.succeeded) { webengine.executescript(script); } } } ); any help?
how about
$(function(){ alert("command:ready"); }); and then
engine.onalert = new eventhandler<webevent<string>>() { @override void handle(webevent<string> event) { if("command:ready".equals(event.getdata())){ //todo: initialize } } } (seen here http://habrahabr.ru/company/codeorchestra/blog/198776/)
java javascript javafx
No comments:
Post a Comment