Как апплет может вызвать метод в другом фрейме (с того же сайта)? - PullRequest
1 голос
/ 13 сентября 2011

При наличии апплета в одном фрейме в многокадровом веб-приложении, где все фреймы загружаются с одного веб-сервера, как этот апплет может вызывать методы JavaScript в других фреймах?Я попытался что-то вроде этого:

jsobject.call("parent.otherFrame.methodToCall", new String[] {"argument"});

, и я получаю жалобу, что функция не существует.Однако, если я вызову это так:

jsobject.eval("parent.otherFrame.methodToCall('argument')");

, тогда это сработает.Я пытаюсь избежать использования eval.Вызывает ли код через call в другом фрейме от апплета то, что может иметь различное поведение в каждой комбинации браузера и JVM?* eval безопаснее, поскольку он оценивается в движке JavaScript, а не частично на стороне апплета?

Ответы [ 2 ]

2 голосов
/ 13 сентября 2011

Мой (ограниченный) опыт работы с комбинацией Java-апплетов, JavaScript и (страшных) фреймов заключается в том, что лучше всего:

  • Включить скрипт на странице / фрейме с апплетомв этом.Определите функцию, предназначенную для вызова с 0 или более аргументами (одним из которых может быть имя целевого фрейма).
  • Вызов функции из апплета.
  • Пусть JavaScript выполняеттяжелая работа по нахождению правильного кадра и выполнению любых необходимых действий.

Это имеет ряд преимуществ.

  • Отладку JS легче выполнить с помощью (дляпример) Консоль ошибок FF, чем при использовании консоли Java.
  • JS можно обновлять быстрее и проще.
  • Каждый язык кодирует то, что он умеет делать.Вы можете зайти в редактор Java, чтобы увидеть красиво отформатированное Java, и редактор JS, чтобы увидеть, что формат JS красиво отформатирован.В отличие от попытки прочитать «JS, написанный на Java», - это страшный опыт.
  • Когда вы просите помощи в том, чтобы заставить работать скрипт, у вас есть отличный пример, который гуру JS может легко прочитать!
1 голос
/ 13 сентября 2011

Эквивалентный код без eval, вероятно, выглядит примерно так:

jsobject = (JSObject)jsobject.getMember("parent");
jsobject = (JSObject)jsobject.getMember("otherFrame");
jsobject.call("methodToCall", new String[] {"hello!"});
...