On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

Вызов JavaScript из аплета

Только для Netscape

Вызов функции Javascript из аплета может быть осуществлен через метод showDocument. В URL в качестве протокола нужно вывести "javascript:".

[Java applet]
import java.applet.*;
import java.net.*;

public class inJava extends Applet{
  public void init(){
    String msg = "We will jump to an HTML tag";
    try {
      getAppletContext().showDocument
        (new URL("javascript:doAlert(\"" + msg +"\")"));
      getAppletContext().showDocument
        (new URL("javascript:jumpTo(\"#JUMP\")"));
      }
    catch (MalformedURLException me) { }
    } 
  }

[Javascript and HTML]
<HTML><HEAD></HEAD><BODY>
<SCRIPT>
function doAlert(s) {
   alert(s);
   }
function jumpTo(tag) {
   self.location=tag;
   }
</SCRIPT>
<APPLET CODE="inJava.class"  
        NAME="myApplet"  MAYSCRIPT
        HEIGHT=400 WIDTH=10>
</APPLET>
<P>
<A NAME="JUMP">jump here from Java via Javascript</A>
</BODY>
</HTML>

Для Netscape и Microsoft Internet Explorer v4 и более

С IE4, Microsoft включает в поставку паке от Netscape netscape.javascript.* для поддержки доступа из JAVA аплетов к объектам Javascript. Для компиляции такого аплета, необходимо добавить в CLASSPATH пакет Netscape java40.jar. Это примерно выглядит так:
set CLASSPATH=
 .;c:\windev\jdk1.1.3\lib\classes.zip;
  c:\Program Files\Netscape\Communicator\Program\Java\Classes\java40.jar;
Имейте ввиду, что именно Ваш CLASSPATH может выглядеть совершенно по другому.

Для компиляции с IE, сперва найтие директорию java\packages в директории Windows или WinNt. Там обычно лежат несколько zip файлов со странными именами. В моей инсталяции (IE5) файл Qk1r3vrp.zip как раз и содержит все необходимые 2 класса, JSObject.class и JSException.class. До компиляции, добавьте этот архив в classpath, или же распакуйте эти два класса и запакуйте в новый архив, но при этом не забудье про директории, а затем добавьте уже его. Однако если же Вы будете компилировать аплет при помощи компилятора от Microsoft, то эту операцию проделывать не нужно.

В следующем примере, Вам просто будет необходимо в текстовом поле вводить функцию Javascript и по нажатию кнопки она будет выполнена. К примеру, введите alert('Hello from JAVA'). Или же Вы можете выполнять функции находящиеся на самой странице, на которой находится и аплет. Тег Applet должен содержать параметр MAYSCRIPT для того, что у аплета был доступ к объекту JSObject.
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import netscape.javascript.*;

public class jsJAVA extends Applet implements
    ActionListener {
  Button b;
  TextField t;
  
  public void init() {
     t = new TextField(20);
     add(t);
     b = new Button("execute Javascript");
     add(b);
     b.addActionListener(this);
     }
  
  public void actionPerformed(ActionEvent ae) {
     if (ae.getSource() == b) {
       JSObject win = (JSObject) JSObject.getWindow(this);
       win.eval(t.getText());
       }
     }
  }
Другой путь заключается в использовании Reflection API. При этом, не нужно будет модифицировать CLASSPATH и импортировать пакет netscape.jsobject.
// posted by C Werner on the realhowto list
import java.lang.reflect.*;
...
// Somewhere in the applet class ...
...
String jscmd = "window.close()";  /* JavaScript command */
String jsresult = null;
boolean success = false;
try {
  Method getw = null, eval = null;
  Object jswin = null;
  Class c = 
    class.forName("netscape.javascript.JSObject"); /* does it in IE too */
  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];
      }
  }
  Object a[] = new Object[1];
  a[0] = this;               /* this is the applet */
  jswin = getw.invoke(c, a); /* this yields the JSObject */
  a[0] = jscmd;
  Object result = eval.invoke(jswin, a);
  if (result instanceof String) 
    jsresult = (String) result;
  else 
    jsresult = result.toString();
  success = true;
  } 
 
catch (InvocationTargetException ite) {
  jsresult = "" + ite.getTargetException();
  }
catch (Exception e) {
  jsresult = "" + e;
  }

if (success)
    System.out.println("eval succeeded, result is " + jsresult);
else 
    System.out.println("eval failed with error " + jsresult);



Литература по Javascript