我在 web 中解聚 JavaFX 应用程序时遇到了问题,我只遇到了 IE10 或 IE9 的问题,更准确地说,当 Document Mode 为 9 时,问题是浏览器无法识别将由 JavaFx 定义的对象“app”加载。这个对象“app”用参数调用函数“tellme”。我希望在浏览器控制台上看到日志:“____a OK maher”,但我得到的是一条错误消息:
SCRIPT438: Object doesn't support property or method 'tellme'
其他信息:
- 启动 Java 后会提示发布者、权限,请参见 Image#1
接受并继续。
- 网站请求访问和控制 JavaFx 应用程序(有 JS <==> JavaFX ),因此有一个安全警告并请求用户允许。见图片#2
在这里我注意到,在文档模式 IE9 中,我在第一个之后立即收到此警告..但在其他浏览器(包括 DM IE8、DM IE7)上,它出现在按下 clicl 之后,这意味着在通过 app.tellme 从 JS 调用 JavaFx 之后
再次仅在 IE 上出现问题,在其他浏览器上正常(Chrome、Opera、FF、.. 等)对于早期版本的 IE 7 和 8 也没有问题;简而言之,只有当 IE 文档模式设置为 IE9 时,我才会遇到问题
这与签名无关..我有一个有效的签名代码证书..当然我在清单上设置了正确的权限(代码库,权限,......等)但实际上这与这个问题无关..只有第二个警告消失但问题仍然存在。
模拟问题:
1-使用 IE9 或 IE10 打开 main.html(代码如下),按 F12 将文档模式设置为 IE 9。
2-按开始,然后接受以运行该应用程序,然后接受以下提示以允许通过 JS 访问 JavaFx。
3-按 clicl,在浏览器控制台上,您将看到错误消息.. 我希望解决此问题以查看输出:“____a OK maher”
代码:
main.java(JavaFX 应用程序):更新
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.im.oor;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import netscape.javascript.JSObject;
/**
*
* @author maher
*/
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Say 'Hello World'");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
StackPane root = new StackPane();
root.getChildren().add(btn);
Scene scene = new Scene(root, 300, 250);
publishServices();
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
private static JSObject jsWin;
private void publishServices() {
try {
JSObject jsWins = getHostServices().getWebContext();
jsWins.setMember("app", new JavaAplicationCallBack());
} catch (Exception e) {
System.err.println("error with JSObject : "+e.getMessage());
}
}
public class JavaAplicationCallBack {
public String tellme(String uu) {
return "OK " + uu;
}
}
/**
* The main() method is ignored in correctly deployed JavaFX application.
* main() serves only as fallback in case the application can not be
* launched through deployment artifacts, e.g., in IDEs with limited FX
* support. NetBeans ignores main().
*
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
}
main.html(网页):更新
<!DOCTYPE html>
<html>
<head>
<!--<meta http-equiv="X-UA-Compatible" content="IE=8">-->
<script src="web-files/dtjava.js" type="text/javascript" ></script>
<script src="jfx.js" type="text/javascript" ></script>
<script src="http://code.jquery.com/jquery-1.7.min.js">
</script>
<script>
$(document).ready(function() {
$("a.ll").live("click", function(event) {
callit('hi ');
});
});
</script>
</head>
<body>
<a href="#" onclick="launchit();" >start</a>
<a class='ll' href="#" >clicl</a>
<!-- Applet will be inserted here -->
<div id='javafx-app-placeholder'></div>
</body>
</html>
jfx.js(在 main.html 上使用的 javascript):更新
function javafxEmbed() {
dtjava.embed(
{
url : 'TestIdleCallJavaFx.jnlp',
//url: 'Testjfx.jnlp',
placeholder: 'javafx-app-placeholder',
width: 300,
height: 100,
jnlp_content: 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxqbmxwIHNwZWM9IjEuMCIgeG1sbnM6amZ4PSJodHRwOi8vamF2YWZ4LmNvbSIgaHJlZj0iVGVzdElkbGVDYWxsSmF2YUZ4LmpubHAiPg0KICA8aW5mb3JtYXRpb24+DQogICAgPHRpdGxlPlRlc3RJZGxlQ2FsbEphdmFGeDwvdGl0bGU+DQogICAgPHZlbmRvcj5NYWhlcjwvdmVuZG9yPg0KICAgIDxkZXNjcmlwdGlvbj5TYW1wbGUgSmF2YUZYIDIuMCBhcHBsaWNhdGlvbi48L2Rlc2NyaXB0aW9uPg0KICAgIDxvZmZsaW5lLWFsbG93ZWQvPg0KICA8L2luZm9ybWF0aW9uPg0KICA8cmVzb3VyY2VzPg0KICAgIDxqZng6amF2YWZ4LXJ1bnRpbWUgdmVyc2lvbj0iMi4yKyIgaHJlZj0iaHR0cDovL2phdmFkbC5zdW4uY29tL3dlYmFwcHMvZG93bmxvYWQvR2V0RmlsZS9qYXZhZngtbGF0ZXN0L3dpbmRvd3MtaTU4Ni9qYXZhZngyLmpubHAiLz4NCiAgPC9yZXNvdXJjZXM+DQogIDxyZXNvdXJjZXM+DQogICAgPGoyc2UgdmVyc2lvbj0iMS42KyIgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9hdXRvZGwvajJzZSIvPg0KICAgIDxqYXIgaHJlZj0iVGVzdElkbGVDYWxsSmF2YUZ4LmphciIgc2l6ZT0iMjE3MTkiIGRvd25sb2FkPSJlYWdlciIgLz4NCiAgPC9yZXNvdXJjZXM+DQo8c2VjdXJpdHk+DQogIDxhbGwtcGVybWlzc2lvbnMvPg0KPC9zZWN1cml0eT4NCiAgPGFwcGxldC1kZXNjICB3aWR0aD0iODAwIiBoZWlnaHQ9IjYwMCIgbWFpbi1jbGFzcz0iY29tLmphdmFmeC5tYWluLk5vSmF2YUZYRmFsbGJhY2siICBuYW1lPSJUZXN0SWRsZUNhbGxKYXZhRngiID4NCiAgICA8cGFyYW0gbmFtZT0icmVxdWlyZWRGWFZlcnNpb24iIHZhbHVlPSIyLjIrIi8+DQogIDwvYXBwbGV0LWRlc2M+DQogIDxqZng6amF2YWZ4LWRlc2MgIHdpZHRoPSI4MDAiIGhlaWdodD0iNjAwIiBtYWluLWNsYXNzPSJvcmcuaW0ub29yLk1haW4iICBuYW1lPSJUZXN0SWRsZUNhbGxKYXZhRngiIC8+DQogIDx1cGRhdGUgY2hlY2s9ImFsd2F5cyIvPg0KPC9qbmxwPg0K'
//jnlp_content: 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxqbmxwIHNwZWM9IjEuMCIgeG1sbnM6amZ4PSJodHRwOi8vamF2YWZ4LmNvbSIgaHJlZj0iVGVzdGpmeC5qbmxwIj4NCiAgPGluZm9ybWF0aW9uPg0KICAgIDx0aXRsZT5UZXN0amZ4PC90aXRsZT4NCiAgICA8dmVuZG9yPm1haGVyPC92ZW5kb3I+DQogICAgPGRlc2NyaXB0aW9uPlNhbXBsZSBKYXZhRlggMi4wIGFwcGxpY2F0aW9uLjwvZGVzY3JpcHRpb24+DQogICAgPG9mZmxpbmUtYWxsb3dlZC8+DQogIDwvaW5mb3JtYXRpb24+DQogIDxyZXNvdXJjZXM+DQogICAgPGpmeDpqYXZhZngtcnVudGltZSB2ZXJzaW9uPSIyLjIrIiBocmVmPSJodHRwOi8vamF2YWRsLnN1bi5jb20vd2ViYXBwcy9kb3dubG9hZC9HZXRGaWxlL2phdmFmeC1sYXRlc3Qvd2luZG93cy1pNTg2L2phdmFmeDIuam5scCIvPg0KICA8L3Jlc291cmNlcz4NCiAgPHJlc291cmNlcz4NCiAgICA8ajJzZSB2ZXJzaW9uPSIxLjYrIiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2F1dG9kbC9qMnNlIi8+DQogICAgPGphciBocmVmPSJUZXN0amZ4LmphciIgc2l6ZT0iMjAyODkiIGRvd25sb2FkPSJlYWdlciIgLz4NCiAgPC9yZXNvdXJjZXM+DQo8c2VjdXJpdHk+DQogIDxhbGwtcGVybWlzc2lvbnMvPg0KPC9zZWN1cml0eT4NCiAgPGFwcGxldC1kZXNjICB3aWR0aD0iMzAwIiBoZWlnaHQ9IjEwMCIgbWFpbi1jbGFzcz0iY29tLmphdmFmeC5tYWluLk5vSmF2YUZYRmFsbGJhY2siICBuYW1lPSJUZXN0amZ4IiA+DQogICAgPHBhcmFtIG5hbWU9InJlcXVpcmVkRlhWZXJzaW9uIiB2YWx1ZT0iMi4yKyIvPg0KICA8L2FwcGxldC1kZXNjPg0KICA8amZ4OmphdmFmeC1kZXNjICB3aWR0aD0iMzAwIiBoZWlnaHQ9IjEwMCIgbWFpbi1jbGFzcz0idGVzdGpmeC5UZXN0amZ4IiAgbmFtZT0iVGVzdGpmeCIgLz4NCiAgPHVwZGF0ZSBjaGVjaz0iYWx3YXlzIi8+DQo8L2pubHA+DQo='
},
{
javafx: '2.2+'
},
{}
);
}
function launchit(){
dtjava.addOnloadCallback(javafxEmbed);
}
function callit(aa){
alert(aa);
console.log("____ "+aa);
var ttt=app.tellme("maher ");
console.log("____a "+ttt);
}
- 请注意,如果您构建代码,它可能会生成与我所拥有的不同的 jnlp_content。所以只需更新它。
* 我将所有文件压缩到http://ulozto.cz/xV2vrQTd/javafx-dm-ie9-zip
* 源代码在这里:http: //247workers.com/JFX_src/TestIdleCallJavaFx.zip
以下是如何成功使其工作的一些步骤:
1-我正在使用最新版本的 JDK/JRE 7u45
2- 使用菜单文件 ==> 导入 ==> 从 zip 导入
3-清洁和建造
4-将项目中 dist 下的所有内容复制到目录 work 中,如果那里已经有东西,则覆盖任何东西。
5-通过控制面板部署时最好显示Java控制台==> Java ==>高级==>在Java控制台下,选择显示控制台。
- 关于使用
<meta http-equiv="X-UA-Compatible" content="IE=8">
强制使用较旧的渲染引擎,但这不会被我们正在从事的企业项目所接受。
我希望我能在这里得到帮助......对不起,很长的帖子,但我想非常具体并提供所有必要的信息。