/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
"Null" er null eller ikke et object
Fra : Leif Neland


Dato : 16-03-09 19:01

Jeg har noget ajax-halløj, der giver fejl for visse brugere.

Her er starten af funktionen, indtil den fejlgivende linie.


function sendRequest(action, ID, Opp)
{
var ready_state;
   var req = window.XMLHttpRequest ? new XMLHttpRequest()
         : new ActiveXObject("Microsoft.XMLHTTP");
   req.onreadystatechange = function()
   {
    ready_state=req.readyState; <- Her kommer fejlen:
            "Null" er null eller ikke et object

Er der andre metoder end
   new XMLHttpRequest()
og   new ActiveXObject("Microsoft.XMLHTTP")

der kan prøves?

Men burde man overhovedet kunne nå linien med req.readyState, hvis
var req = ... ikke giver et brugbart objekt?

Jeg skal nok lægge en linie ind med
if (req==null) {skriv("din browser er dum");exit;}

Leif


   

 
 
Lasse Reichstein Nie~ (16-03-2009)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 16-03-09 19:09

Leif Neland <leif@neland.dk> writes:

> Jeg har noget ajax-halløj, der giver fejl for visse brugere.

Men ikke alle? Har de noget til fælles? Fx hvilken browser de bruger?


> Her er starten af funktionen, indtil den fejlgivende linie.
>
>
> function sendRequest(action, ID, Opp)
> {
> var ready_state;
>    var req = window.XMLHttpRequest ? new XMLHttpRequest()
>          : new ActiveXObject("Microsoft.XMLHTTP");
>    req.onreadystatechange = function()
>    {
>     ready_state=req.readyState; <- Her kommer fejlen:
>             "Null" er null eller ikke et object
>
> Er der andre metoder end
>    new XMLHttpRequest()
> og   new ActiveXObject("Microsoft.XMLHTTP")

Ja. Den første virker i de fleste ikke-Microsoft-browsere. Microsoft
har flere ActiveX-objekter at prøve, fx (fra Wikipedia):

// Provide the XMLHttpRequest class for IE 5.x-6.x:
if( typeof XMLHttpRequest == "undefined" ) XMLHttpRequest = function() {
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
throw new Error( "This browser does not support XMLHttpRequest." )
};

> Men burde man overhovedet kunne nå linien med req.readyState, hvis
> var req = ... ikke giver et brugbart objekt?

Ja, den gav jo tydeligvis en værdi der er "Null" (som dog ikke lyder
som det samme som "null").

Min IE 7 giver et objekt tilbage for
new ActiveXObject("Microsoft.XMLHTTP")
(toString giver [object]), men jeg får fejl hvis jeg læser en egenskab
på objektet.

> Jeg skal nok lægge en linie ind med
> if (req==null) {skriv("din browser er dum");exit;}

Test lige om det virker, eller om det er et "Null" objekt :)

/L
--
Lasse Reichstein Holst Nielsen
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Birger Sørensen (16-03-2009)
Kommentar
Fra : Birger Sørensen


Dato : 16-03-09 19:39

Leif Neland tastede følgende:
> Jeg har noget ajax-halløj, der giver fejl for visse brugere.
>
> Her er starten af funktionen, indtil den fejlgivende linie.
>
>
> function sendRequest(action, ID, Opp)
> {
> var ready_state;
>    var req = window.XMLHttpRequest ? new XMLHttpRequest()
>          : new ActiveXObject("Microsoft.XMLHTTP");
>    req.onreadystatechange = function()
>    {
>     ready_state=req.readyState; <- Her kommer fejlen:
>             "Null" er null eller ikke et object
>
> Er der andre metoder end
>    new XMLHttpRequest()
> og   new ActiveXObject("Microsoft.XMLHTTP")
>
> der kan prøves?
>

Du kan teste ved at skrive din asignement i en if.
Eller opret objectet i en funktion for sig - der er mange muligheder -
se også Lasses svar.

Jeg bruger denne - og har ikke hørt om nogen hos hvem det ikke
virker...
(http://bbsorensen.dk?men=Software/AJAX/Teknik)
function MakeAjaxObj() {
try { oReq = new XMLHttpRequest(); }// Mozilla, Safari, IE7...
catch(e) {
try { oReq = new ActiveXObject("MSXML2.XMLHTTP.3.0"); }// ældre
IE
catch(e) {
try { oReq = new ActiveXObject("Microsoft.XMLHTTP"); } //
Andre
catch(e) { oReq = null; }
}
}
if ( oReq == null) { alert( 'Din browser kan ikke AJAXe'); }
return oReq;
}

Du kan så teste sådan :
function sendRequest(action, ID, Opp) {
var ready_state;
if ( req = MakeAjaxObj()) {
req.onreadystatechange = function() {
ready_state=req.readyState;
...
}
}
}

> Men burde man overhovedet kunne nå linien med req.readyState, hvis
> var req = ... ikke giver et brugbart objekt?

Jo da. En variabel kan godt være null - fejlen er at du forsøger at
læse nogen egenskaber null ikke har...

>
> Jeg skal nok lægge en linie ind med
> if (req==null) {skriv("din browser er dum");exit;}

Vil formentlig give en fejl : ukendt funktion "skriv()"... ;>)
Men noget i den retning, med en alert, kunne også bruges...
Er nu ikke sikker på at browseren er dum, fordi den ikke kan AJAXe.
Brugeren kan jo have slået brugen af ActiveX fra.

I øvrigt mener jeg at huske, at open() skal kaldes først - det er en
initialisering af objectet. Den funktion du tildeler onreadystatechange
vil blive resat/fjernet, når du senere kalder open(). Dette også
reflekteret af mulige værdier for readyState.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Stig Johansen (16-03-2009)
Kommentar
Fra : Stig Johansen


Dato : 16-03-09 22:25

Birger Sørensen wrote:

> I øvrigt mener jeg at huske, at open() skal kaldes først - det er en
> initialisering af objectet. Den funktion du tildeler onreadystatechange
> vil blive resat/fjernet, når du senere kalder open(). Dette også
> reflekteret af mulige værdier for readyState.

Du husker ikke helt rigtigt.
En open vil triggere en readystate med 1 (OPEN).

Det er også ifølge specs:
<http://www.w3.org/TR/XMLHttpRequest/>
Se under open, pkt 21:
.....
Switch the object to the OPENED state, set the send() flag to "false" and
then synchronously dispatch a readystatechange event on the object and
return the method call.
.....

Noget andet er, at det ikke virker ordentligt i alle browsere hvis man
specificerer onreadystate før open.

Jeg bøvlede med det engang, men kan ikke huske hvilke(n) browser det ikke
fungerede i, men det skal ikke undre mig at det var IE.

--
Med venlig hilsen
Stig Johansen

Birger Sørensen (17-03-2009)
Kommentar
Fra : Birger Sørensen


Dato : 17-03-09 09:51

Stig Johansen kom med denne ide:
> Birger Sørensen wrote:
>
>> I øvrigt mener jeg at huske, at open() skal kaldes først - det er en
>> initialisering af objectet. Den funktion du tildeler onreadystatechange
>> vil blive resat/fjernet, når du senere kalder open(). Dette også
>> reflekteret af mulige værdier for readyState.
>
> Du husker ikke helt rigtigt.
> En open vil triggere en readystate med 1 (OPEN).
>
> Det er også ifølge specs:
> <http://www.w3.org/TR/XMLHttpRequest/>
> Se under open, pkt 21:
> ....
> Switch the object to the OPENED state, set the send() flag to "false" and
> then synchronously dispatch a readystatechange event on the object and
> return the method call.
> ....
>
> Noget andet er, at det ikke virker ordentligt i alle browsere hvis man
> specificerer onreadystate før open.
>
> Jeg bøvlede med det engang, men kan ikke huske hvilke(n) browser det ikke
> fungerede i, men det skal ikke undre mig at det var IE.

W3C specs er kun draft.

http://msdn.microsoft.com/en-us/library/ms535874(VS.85).aspx#
i ekasemplerne, står det faktisk direkte :
"Calling the open method initializes the request object. If you have
set properties (such as onreadystatechange) it is reset to initial
default values (NULL). So, do all your initialization between OPEN and
the final call to SEND."

Det er så muligt, at det kun er i IE det sker. Men man er jo så nødt
til at gøre det, hvis man vil have tingene til at virke også i IE...

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Stig Johansen (17-03-2009)
Kommentar
Fra : Stig Johansen


Dato : 17-03-09 10:47

Birger Sørensen wrote:

> W3C specs er kun draft.

Jeg ved ikke rigtigt hvor vi skal henad.
Ja - W3C er kun et draft, og implementeringen, eller mangel på samme, er
browserafhængigt.

> http://msdn.microsoft.com/en-us/library/ms535874(VS.85).aspx#
> i ekasemplerne, står det faktisk direkte :
> "Calling the open method initializes the request object. If you have
> set properties (such as onreadystatechange) it is reset to initial
> default values (NULL). So, do all your initialization between OPEN and
> the final call to SEND."

Så du mener, at MS's tilgangsvinkel er 'den rigtige', eller 'the ever
lasting' truth'?

> Det er så muligt, at det kun er i IE det sker. Men man er jo så nødt
> til at gøre det, hvis man vil have tingene til at virke også i IE...

No comments.

--
Med venlig hilsen
Stig Johansen

Birger Sørensen (17-03-2009)
Kommentar
Fra : Birger Sørensen


Dato : 17-03-09 11:15

Stig Johansen formulerede tirsdag:
8X
> Jeg ved ikke rigtigt hvor vi skal henad.
> Ja - W3C er kun et draft, og implementeringen, eller mangel på samme, er
> browserafhængigt.

Fremad vel forhåbentlig. Hvad vej det så er... ;>)

8X
> Så du mener, at MS's tilgangsvinkel er 'den rigtige', eller 'the ever
> lasting' truth'?

Bestemt nej.
Jeg forholder mig til hvad der er nødvendigt, for at få tingene til at
fungere, så udbredt som muligt. Hvilket alt for ofte, sker "på trods"
af standarder.
Eftersom de implementeringer, der ikke også bruger open() som en
initialisering ud over at sætte parametre, ikke vil have problemer med
at open() kaldes før andre metoder, er det heller ikke noget problem at
kalde den først.
Selv hvis IE skulle give sig til at overholde den foreslåede standard,
vil det virke...
Som implementeringerne er nu, SKAL open() kaldes før andre metoder,
hvis det skal virke i IE.
At det er tåbeligt, inkonsekvent, imod alle forskrifter og lærebøger,
imod den foreslåede standard, og hvad man ellers kan finde på, ikke at
initialisere objectet i constructoren, er en anden sag. Det er nu
engang sådan M$ har implementeret det - og det må vi sno os udenom, som
vi bedst kan ;>)

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste