Можно ли зарегистрировать событие JavaScript, которое срабатывает, когда Java-апплет полностью загружен? - PullRequest
3 голосов
/ 10 декабря 2010

У меня есть веб-приложение, которое использует Java-апплет, определенный в теге <applet>.Можно ли добавить событие JavaScript, которое запускается после полной загрузки апплета?Это некоторый javascript для инициализации, который зависит от того, что апплет полностью загружен и допустим.

Ответы [ 6 ]

5 голосов
/ 10 декабря 2010

вызов javascript довольно прост:

Ваш метод init () может включать объявление jsObject и вызов javascript:

@Override
public void init() {
// some code
  JSObject jsObject = JSObject.getWindow(this);
  jsObject.eval("your javascript");

}
3 голосов
/ 22 августа 2011

Если у вас нет контроля исходного кода над апплетом, вы можете запросить загрузку апплета перед вызовом методов для него.Вот полезная функция, которую я написал, которая делает именно это:

/* Attempt to load the applet up to "X" times with a delay. If it succeeds, then execute the callback function. */
function WaitForAppletLoad(applet_id, attempts, delay, onSuccessCallback, onFailCallback) {
    //Test
    var to = typeof (document.getElementById(applet_id));
    if (to == 'function' || to == 'object') {
        onSuccessCallback(); //Go do it.
        return true;
    } else {
        if (attempts == 0) {
            onFailCallback();
            return false;
        } else {
            //Put it back in the hopper.
            setTimeout(function () {
                WaitForAppletLoad(applet_id, --attempts, delay, onSuccessCallback, onFailCallback);
            }, delay);
        }
    }
}

Назовите это так:

WaitForAppletLoad("fileapplet", 10, 2000, function () {
        BuildTree("c:/");
    }, function () {
        alert("Sorry, unable to load the local file browser.");
    });
2 голосов
/ 13 мая 2011

Вы можете использовать тег param для передачи имени функции JS в ваш апплет:

<applet id="myapplet" code="JavaApplet.class" codebase="/foo"
        archive="Applet.jar" MAYSCRIPT>
  <param name="applet_ready_callback" value="myJSfunction"/>
</applet>

В вашем апплете получите значение параметра и вызовите функцию, когда будете готовы:

@Override
public void init() {
  String jsCallbackName = getParameter("applet_ready_callback");
  JSObject jsObject = JSObject.getWindow(this);
  jsObject.eval(jsCallbackName + "()");
}
2 голосов
/ 10 декабря 2010

У вас есть функция инициализатора (я думаю, что она запущена) в Java-апплете. Оттуда вы можете вызвать javascript на веб-странице после инициализации. Для работы вы должны добавить атрибут MAYSCRIPT к определению вашего апплета

<applet id="someId" code="JavaApplet.class" codebase="/foo" archive="Applet.jar" MAYSCRIPT>
</applet>

Пример кода для вызова JavaScript:

public String invokeJavaScript(Object caller, String cmd) throws TiNT4Exception {
    printDebug(2, "Start JavaScript >>" + cmd + "<<");
    try {
      // declare variables
      Method getw = null;
      Method eval = null;
      Object jswin = null;

      // create new instance of class netscape.javascript.JSObject
      Class c = Class.forName("netscape.javascript.JSObject"); // , true, this.getClass().getClassLoader()); // does it in IE too

      // evaluate methods
      Method ms[] = c.getMethods();
      for (int i = 0; i < ms.length; i ++) {
        if (ms[i].getName().compareTo("getWindow") == 0) { getw = ms[i]; }
        else if (ms[i].getName().compareTo("eval") == 0) { eval = ms[i]; }
      } // for every method

      printDebug(3, "start invokings");
      Object a[] = new Object[1];
      a[0] = caller;
      jswin = getw.invoke(c, a);
      a[0] = cmd;
      Object result = eval.invoke(jswin, a);

      if (result == null) {
        printDebug(3, "no return value from invokeJavaScript");
        return "";
      }

      if (result instanceof String) {
        return (String)result;
      } else {
        return result.toString();
      }
    } catch (InvocationTargetException ite) {
      throw new TiNT4Exception(ite.getTargetException() + "");
    } catch (Exception e) {
      throw new TiNT4Exception(e + "");
    }
  } // invokeJavaScript
0 голосов
/ 01 июня 2016

Это возможно с Java 7 SE.Вы можете зарегистрировать событие onLoad() или просто опросить status, см. Обработка состояния инициализации с помощью обработчиков событий , например.

Чтобы использовать эту функцию, вы должны развернуть апплет сjava_status_events параметр установлен в true.

Статья Состояние апплета и обработчики событий описывает состояние и события:

Состояние

  • LOADING = 1 - Апплет загружается
  • READY = 2 - Апплет полностью загружен и готов к приему вызовов JavaScript
  • ERROR = 3 - Ошибка призагрузка апплета

События

  • onLoad: Происходит, когда статус апплета READY.Апплет завершил загрузку и готов к приему вызовов JavaScript.
  • onStop: происходит после остановки апплета.
  • onError:Происходит, когда статус апплета ERROR.Произошла ошибка при загрузке апплета.

Вы можете зарегистрировать или определить обработчик событий в коде JavaScript веб-страницы, как показано в следующих фрагментах кода.

// use an anonymous function
applet.onLoad(function() {
  //event handler for ready state
}

// use a regular function
function onLoadHandler() {
  // event handler for ready state
}

// Use method form
applet.onLoad(onLoadHandler);

// Use attribute form
applet.onLoad = onLoadHandler;
0 голосов
/ 05 октября 2012

Я использовал другой способ вызова функции JavaScript из апплета.

try {
    getAppletContext().showDocument(new URL("javascript:appletLoaded()"));
} catch (MalformedURLException e) {
    System.err.println("Failed to call JavaScript function appletLoaded()");
}

... должен вызываться в классе апплета, который расширяет Applet или JApplet.Я вызвал функцию JavaScript в конце моего метода start ().

...