Pietro Toniolo

2007-07-26

Strano comportamento di IE7/javascript

Filed under: Software — ptoniolo @ 12:10:08

Su un’applicazione web su cui stiamo lavorando è capitato un errore che può forse far trasparire il meccanismo di funzionamento interno di ie7 nei confronti del codice javascript.

In pratica, una pagina asp.net generava codice html con alcuni blocchi di codice da eseguirsi client-side tra i tag <script>;</script>;. Uno di questi blocchi faceva riferimento ad un oggetto del DOM che nel frattempo era stato fatto sparire. La riga con l’errore diceva qualcosa come:

document.getElementById(“btnChiudi”).click()

e, malgrado quella riga fosse all’interno di un blocco try/catch, il risultato era una messagebox con il messaggio:

Microsoft JScript runtime error: Object doesn’t support this property or method

Il problema era proprio che il bottone btnChiudi era sparito dalla pagina. Ma io mi sarei aspettato che l’errore mandasse l’elaborazione nel ramo catch, invece che buttare fuori una messagebox. Questo è già strano di suo.

Un’altra cosa molto strana è che l’errore viene segnalato su quella pagina .aspx, ma la riga dell’errore era indicata come “42”. Il punto è che, alla riga 42 di quella pagina, anche andando a vedere il codice ricevuto proprio dal browser IE7, quindi andandolo a pescare dalla cache, non c’è nessun codice javascript. Ma… stranamente, se si prendono in considerazione le sole righe della pagina che si trovano tra i tag script, la riga incriminata è proprio la 42! Per questo motivo tra l’altro abbiamo fatto molta fatica a capire quale fosse esattamente l’errore che si presentava. La pagine infatti è modale, e IE non ha gli stessi strumenti di debugging di Firefox!

Apparentemente questo sembrerebbe indicare due cose:

  1. IE7, quando elabora una pagina web, trasferisce il codice javascript in uno “spazio” virtuale, una sorta di pagina code-behind, che contiene il solo codice. Il rendering grafico/html/css della pagina a questo punto viene fatto sul codice html originale, ma l’invocazione di codice dinamico client-side agisce su questa pagina virtuale. Sembra che i tecnici della Micro$oft si siano “dimenticati” di rimappare i numeri di riga per i messaggi di errore, come viene fatto dalle direttive di precompilazione #line del classico c-compiler.
  2. Sembra che alcuni errori siano prodotti in una fase di “compilazione” precedente all’esecuzione vera e propria. Il contesto in cui avviene questa compilazione non tiene conto di eventuali blocchi try/catch. In questo caso il metodo click() veniva evidentemente validato (fallendo) in questa fase di pre-compilazione, mentre avrebbe dovuto generare un errore a run-time, trappato dal successivo blocco catch.

Non posso essere sicuro che l’interpretazione dei fatti che ho esposto rappresenti veramente quello è che effettivamente successo “nella pancia” di IE7, ma gli indizi sembrerebbero portare proprio in quella direzione…

Advertisements

4 Comments »

  1. frmSchedule.document.getElementById(“btnChiudi”).click()

    è sufficiente scrivere : document.getElementById(“btnChiudi”).click()

    IE7 si comporta quasi come Firefox cioe’ secondo W3c e non esiste scrivere oggetto.qualche cosa

    Comment by Alessange — 2007-07-26 @ 14:13:06

  2. Il codice html era scorretto perché in ogni caso il bottone non si chiamava (più) così. Ma non è questo il punto, no? Non capisco bene il senso della tua precisazione… una volta corretto il “nome” del button, il codice ha funzionato correttamente, anche con il frmSchedule davanti, che quindi sarà pure pleonastico (serve un dizionario?) ma funziona. In altre parole, anche se quel costrutto è scorretto, comunque IE7 lo accetta, e in ogni caso non era quello l’errore. Il “method” segnalato dall’errore era il click(), insomma.

    In che senso comunque intendi quell’oggetto.qualcosa? Quale fosse l’errore era piuttosto chiaro… il punto è “dove” e “come” viene trappato l’errore, e l’argomento del mio post è proprio capire “quel” dove e “quel” come. Non mi sembra che si tratti di un problema di aderenza agli standard W3C, a te sì?

    Comment by ptoniolo — 2007-07-26 @ 16:08:11

  3. Ho parlato che Alessange, e ho capito che il commento riguardava solo la parte frmSchedule..

    Mi sa che il suo è probabilmente solo wishful thinking, dato che quel codice IE7 lo interpreta altroché, anche con il nome dell’oggetto davanti.

    Non è quindi vero che con IE7 non si possa scrivere oggetto.qualcosa, quella sintassi viene accettata!

    Che poi non sia secondo standard W3C, è un altro discorso, e comunque non era quello l’argomento del post. Ho comunque corretto nel post la riga incriminata.

    Comment by ptoniolo — 2007-07-27 @ 10:32:53

  4. In effetti, ie7 accetta. Mi pare strano che il W3C suggerisca di omnettere (vado sulla fiducia, non sono troppo informato), dato che si potrebbe avere più di un “padre”. O sono fuori strada?

    Try…Catch lato client: mi è piaciuta la tua idea su cosa ci stia dietro (non dico altro, altrimenti poi mi accusano di piaggeria!). Ma stiamo parlando di client web…possibile che abbiano fatto una rivoluzione così grande?

    En passant – lo so che lo sai già, ma tanto per dire:
    document.getElementById() clientside e quindi l’Id deve essere quello generato per il clientside, che lato server esiste solo da un certo momento in avanati (quando c’è anche l’UniqueId del suo contenitore), per cui se tenti di recuperarlo troppo presto per scrivere dinamicamente il nome dell’oggetto…te ne arriva uno parziale…

    Ciao, Pietro!

    Comment by Cimp — 2007-10-4 @ 14:34:24


RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.

%d bloggers like this: