GWT JSNI вызывает метод апплета
Я хочу добавить Java-апплет на страницу GWT и вызвать некоторые методы апплета. Это возможно в javascript, выполнив:
document.applet_id.someAppletMethod("value");
Однако, когда я пытаюсь реализовать ту же идею, используя встроенную функцию JSNI в GWT, она терпит неудачу. По сути, он не может найти объект апплета. Вот код JSNI:
public native void callStringMethod(String methodName, String arg) /*-{
var temp = "document." + this.@com.my_project.AppletWrapper::appletName + "." + methodName + "(\"" + arg + "\");";
eval(temp); //<----- FAIL
//SOME TEST CODE
$doc.applet_id.someAppletMethod("test value") //<----- FAIL as well
alert(typeof $doc.applet_id); //Undefined
alert(typeof document.applet_id); //Undefined
alert(typeof $wnd.applet_id); //Undefined
}-*/;
Примечание 1: я знаю, что "документ" не является допустимым именем, которое будет использоваться в JSNI, вместо этого вы используете $doc ( пояснение). Я не совсем знаю, как закодировать это в выражении eval(), поэтому компилятор заменяет $doc правильной ссылкой, а также сгенерированный javascript содержит указанное пользователем имя метода и аргумент. Как вы, наверное, знаете, невозможно просто смешать входные переменные Java и Javascript ( объяснение)
Примечание 2: следующий JavaScript запускается из адресной строки веб-браузера
javascript:document.applet_id.someAppletMethod("asdf")
Таким образом, апплет находится на странице, под объектом документа, и я могу получить к нему доступ из Javascript. Это просто не совсем работает от JSNI.
Примечание 3: Я добавляю фактический тег апплета на панель, создавая подкласс класса GWT HTML. По линии:
public AppletWrapper(String appletName, String jarName, String className) {
StringBuilder applet = new StringBuilder();
applet.append("<applet archive=\"").append(jarName).append("\" ");
applet.append("code=\"").append(className).append("\" ");
applet.append("name=\"").append(appletName).append("\" ");
applet.append("id=\"").append(appletName).append("\" ");
applet.append("width=\"100%\" height=\"450\">");
applet.append("Browser doesn't support Java");
applet.append("</applet>");
this.setHTML(applet.toString());
}
Спасибо за любую помощь в получении этой работы.
1 ответ
- Попробуйте добавить
mayscript="mayscript"
к<applet>
тег. - Может быть, наивный - это
callStringMethod()
вызывается после добавления апплета на страницу? - Есть еще 2, как минимум, 2 других вопроса, таких как: GWT JSNI: вызывать методы апплета? и проблема GWT с вызовом методов Java из JSNI