div.main {margin-left: 20pt; margin-right: 20pt}Вызов 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:windevjdk1.1.3libclasses.zip;
c:Program FilesNetscapeCommunicatorProgramJavaClassesjava40.jar; | Имейте
ввиду, что именно Ваш CLASSPATH может выглядеть совершенно по
другому.
Для компиляции с IE, сперва найтие директорию javapackages в
директории 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);
|
|