[JS]Działa w Operze 9.64, nie działa w 10.00

0

Skrypt

<HTML><HEAD></HEAD><BODY>
<SCRIPT>
function getScreenDimension() 
{
    alert("Screen Dimension\r\n  width:"+document.myApplet.getScreenWidth()+" height:" +document.myApplet.getScreenHeight());
}
</SCRIPT>
<FORM>
<INPUT type="button" value="call JAVA" onclick = "getScreenDimension()">
</FORM>
<APPLET CODE="InJava.class"
        NAME="myApplet"
        HEIGHT=0 WIDTH=0>
</APPLET>
</BODY></HTML>

działa w FF, IE oraz w Operze 9.64. Nie działa w Operze 10.00:

JavaScript - file://localhost/C:/kody%20źródłowe/java/applety/Test2.html
Event thread: click
Error:
name: TypeError
message: Statement on line 4: Type mismatch (usually non-object value supplied where object required)

Co jest źle?

0
bo napisał(a)

Co jest źle?
Według standardu może być kilka elementów o tym samym parametrze NAME, więc odwoływanie się po name nie powinno w ogóle działać.
Nie ma takiej funkcji jak getElementByName, jest za to getElementsByName zwracająca tablicę.
W dokumencie powinieneś odnajdywać swoje elementy po id, funkcją getElementById("myApplet"), a applet owi dać własności ID="myApplet"

0

Sprawdzałeś? Skrypt wygląda teraz tak:

<HTML><HEAD></HEAD><BODY>
<SCRIPT>
function getScreenDimension() 
{
    alert("Screen Dimension\r\n  width:"+document.getElementById("myApplet").getScreenWidth()+" height:" +document.getElementById("myApplet").getScreenHeight());
}
</SCRIPT>
<FORM>
<INPUT type="button" value="call JAVA" onclick = "getScreenDimension()">
</FORM>
<APPLET CODE="InJava"
        ID="myApplet"
        HEIGHT=0 WIDTH=0>
</APPLET>
</BODY></HTML>

Zachowanie przeglądarek nie zmieniło się.

0

a po grzyba .getScreenWidth() ?? nie ma takiej funkcji
.width .height i po sprawie

0

Wiem, że jest. Użyte metody są przykładowe. Pytanie nie brzmi: dlaczego nie działa ten konkretny skrypt, tylko dlaczego nie działa w Operze 10.00 (a działał w 9.64 i działa w FF i IE) jakikolwiek skrypt wywołujący metody apletu.

0

może daj pełny kod a nie wyrwany z całości

bo piszę na podstawie tylko tego kawałka

albo inaczej, zainstaluj sobie FireBuga w firefox i zobacz jaki błąd Ci się pojawia po wciśnięciu buttona

0

Może chodzi po prostu o brak DOCTYPE-a? Przeglądarka w trybie quirks może w zasadzie robić to co chce -- akceptować co chce i odrzucać co chce. To już wina autora, że nie zna HTML-a, a przeglądarka próbuje jedynie zastąpić jego mózg (co nie zawsze jej się udaje :P).

Ostrzegam, że jak dasz DOCTYPE XHTML-owy przy tagach pisanych wielkimi literami, to wsadzę ręce w monitor i Cię uduszę ;).

Aris napisał(a)

zainstaluj sobie FireBuga w firefox i zobacz jaki błąd Ci się pojawia po wciśnięciu buttona

Uhm, pewnie żaden. Autor pisał, że w Fx wszystko działa dobrze, więc błędu nie będzie.

bo napisał(a)

dlaczego nie działa w Operze 10.00 (a działał w 9.64 i działa w FF i IE) jakikolwiek skrypt wywołujący metody apletu

To mogą być np. kwestie bezpieczeństwa. Opera jest pod tym względem restrykcyjna i czasem ("świadomie") nie pozwala na rzeczy, na które pozwalają inne przeglądarki, a nawet wcześniejsze wersje Opery. Ta restrykcyjność może się objawiać m.in. w przypadku wszelkiej maści żądań ajaxowych, prób odwołań cross-domain, a także właśnie w przypadku apletów.

0

mi firebug wywala, że nie ma takiej funkcji

fakt, takowa istnieje ale w samym API

0

@Aris, co mi da FireBug skoro skrypt działa w FF?
W FF i starej operze JavaScript może bezpośrednio (tzn. bez użycia apletów) wywoływać metody standardowych klas Javy. W tych przeglądarkach skrypt mógłby wyglądać tak:

<script type="text/javascript">
function getScreenDimension()
{
    alert("Screen Dimension\r\n  width:"+java.awt.Toolkit.getDefaultToolkit().getScreenSize().width+" height:" +java.awt.Toolkit.getDefaultToolkit().getScreenSize().height;
}
</script>

i żaden aplet na stronie nie byłby potrzebny. IE pozwala w JavaScripcie używać tylko metod klasy java.awt.Applet i klas potomnych. Dlatego użyłem apletu:

import java.awt.*;
import java.applet.*;

public class InJava extends Applet
{
    public int getScreenWidth() 
    {
        return Toolkit.getDefaultToolkit().getScreenSize().width;
    }
    public int getScreenHeight() 
    {
        return Toolkit.getDefaultToolkit().getScreenSize().height;
    }
}

@bswierczynski, szkielet strony ściągnąłem z internetu (sam zawsze piszę tagi małymi literami).
Obecna wersja strony wygląda tak:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=ISO-8859-2">
  <title>Test</title>
</head>
<body>
<script type="text/javascript">
function getScreenDimension()
{
    alert("Screen Dimension\r\n  width:"+document.getElementById("myApplet").getScreenWidth()+" height:" +document.getElementById("myApplet").getScreenHeight());
}
</script>
<form>
<input type="button" value="call JAVA" onclick = "getScreenDimension()">
</form>
<applet code="InJava"
        id="myApplet"
        height=0 width=0>
</applet>
</body>
</html>

i działa jak poprzednie (IE, FF, Opera 9.64).

0

Ja kiedyś trzy dni walczyłem z gównianością Opery, w której z wersji na wersję zmieniono sposób rzucania zdarzeń, konkretnie w nowszej wersji onmouseover był w pewnym przypadku samowolnie rzucany bez akcji użytkownika.
Może tutaj masz podobny problem i ta "przeglądarka" nie obsługuje prawidłowo zdarzenia?

0

@somekind:
No raczej nie jest to kwestia obsługi zdarzeń. Po pierwsze, nie przesadzajmy -- onclick w Operze działa dobrze (swoją drogą, nie spotkałem się jeszcze, by mouseover działał źle). Po drugie, autor po kliknięciu dostaje komunikat o błędzie. Więc funkcja obsługi zdarzenia jest wywoływana. W funkcji obsłudze zdarzenia nie korzysta ani z argumentów, ani z kontekstu (this), więc to, czy są one dobrze ustawiane przez przeglądarkę (a myślę, że są) nie ma tu znaczenia.

Dziwna sprawa, niestety nie mogę jej teraz na szybko dokładnie przeanalizować odpaliwszy skrypt i aplet u siebie. Nawet pogooglowałem minutę szukając problemów z wywoływaniem metod apletu w Operze, ale niczego konkretnego nie znalazłem. Znalazłem natomiast jakieś problemy z Javą jako taką pod Operą. Zobacz, co zwraca Ci document.getElementById("myApplet"). Może nie jest to w ogóle obiekt apletu?

0

W 9.64

InJava[panel0,0,0,0x0,layout=java.awt.FlowLayout]

W 10.00

[object HTMLAppletElement]

0

A czy działają komuś aplety w Operze >=10.00? Mam od godziny Operę 10.60, ona szuka Javy w katalogu

C:\Program Files\Java\jre6\bin\new_plugin
i nie można tego zmienić. Tzn. można wejść na stronę konfiguracji
opera:config#UserPrefs|PluginPath
wpisać poprawny katalog, zapisać zmiany, a Opera nadal szuka Javy we wspomnianym katalogu. To jednak gówniana przeglądarka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1