Вызов JS из апплета работает в Firefox и Chrome, но не в Safari - PullRequest
2 голосов
/ 20 мая 2011

У меня есть следующий код в апплете для вызова некоторого Javascript (он немного запутан, потому что вызываемый fn получает объект из DOM, идентифицированного divId, и вызывает для него функцию).

@Override
public final void start() {
  System.err.println("start() method called");
  this.javascript = JSObject.getWindow(this);
  this.jsObjectDivId = getParameter("parent_div_id");
  this.initCallbackFnName = getParameter("init_callback");
  Object args[] = {this.jsObjectDivId, this.initCallbackFnName};
  System.out.print("Calling init_callback\n");
  this.javascript.call("callJS", args);
}

Функция callJS:

window.callJS = function(divId, functionName, jsonArgString) {
  var args, obj;
  obj = $(divId).data('neatObject');
  args = eval(jsonArgString);
  return obj[functionName](args);
};

В Firefox / Chrome аргументы divId и functionName содержат допустимые строки, и все работает отлично;требуемая функция вызывается для объекта, свисающего с указанных данных DIV.

В Safari оба аргумента divId и functionName сообщаются как JavaRuntimeObject со значениями true.

> divId
  JavaRuntimeObject
    true

Что дает?

Ответы [ 2 ]

4 голосов
/ 23 мая 2011

LiveConnect не полностью поддерживается во всех браузерах.В частности, Safari не преобразует строки Java в эквивалент JS для пробера при использовании call.В вашем случае вы можете просто использовать eval на стороне апплета вместо call и вставить строковый объект JSON с аргументами.Что-то вроде:

javascript.eval(callback + "({\"id\":\"" + id + "\",\" ... })")

По сути, вам необходимо знать кросс-браузерное совместимое подмножество LiveConnect, которое работает.Я написал сообщение в блоге, которое описывает подмножество: http://blog.aarhusworks.com/applets-missing-information-about-liveconnect-and-deployment/

Он поставляется с набором тестов LiveConnect, который запускается в браузере: http://www.jdams.org/live-connect-test

0 голосов
/ 01 декабря 2011

У меня была похожая проблема с вызовом метода в апплете в Safari. Он возвращал JavaRuntimeObject, который я вызвал исключение, когда позже он стал пользователем.

Как указал @edoloughlin, мне пришлось использовать (applet.getMethod () + ""), после чего была оценена правильная строка.

Комментарий сэкономил мне кучу времени, поэтому я счел полезным добавить сюда, поскольку я не могу комментировать выше.

...