Internet Explorer i focus() endarrerit

Avui a la feina estava tocant un JavaScript i m’he adonat d’una cosa. L’IE no li feia ni cas a una de les instruccions. La cosa és la següent: hi ha una part de l’aplicació que es recarrega contínuament (cada 5 segons) mitjançant Ajax. Aquesta part conté un “input” el qual, si estàs escrivint mentre es refresca, perd el contingut. La idea del JavaScript era fer la petició Ajax i en rebre la resposta:

1. Copiar el valor de l’”input” en una variable temporal.
2. Substituir el contingut del “div” corresponent amb el de la resposta.
3. Assignar el valor de la variable al nou “input”.
4. Restaurar la posició del ratolí en cas que estigués seleccionat o tingués focus.

I en aquest últim cas és en el que fallava. Una de les instruccions era que, si anteriorment tenia focus, se li tornés a donar focus. Això ho fèiem així:

document.getElementById(”elementToFocus”).focus();

Misteriosament, no funcionava. En Firefox sí, però a l’IE no. El més curiós era que si fèiem això:

document.getElementById(”elementToFocus”).focus();
document.getElementById(”elementToFocus”).focus();

Sí que funcionava! És il·lògic, però investigant, sembla que l’Explorer fa alguna cosa en segon pla i no deixa prendre el focus fins passats uns quants mil·lisegons. Es pot solventar així:

setTimeout(”document.getElementById(”elementToFocus”).focus();”, 100);

D’altra banda, ens hem trobat un altre problema. El tema de conservar la selecció actual. En Firefox, hi ha els simplíssims selectionStart i selectionEnd, que et fan tota la feina, però en Explorer, no. La manera “oficial” de Microsoft és un autèntic nyap, i a Mishoo s’han currat una alternativa fent ús d’una funció no documentada que retorna una “cadena opaca”. Això és el que hem hagut de fer, quin remei.

Com sempre, les cerques sobre coses de JavaScript amb el senyor IE són d’allò més curioses…

4 comentaris

  1. Gravatar de Shinu

    Enviat per Shinu el 6 juliol 2008 a les 5:00

    Ah, quins records… tots aquells matins perduts per buscar “partxes” perquè les pàgines funcionessin amb l’IE… per cert, per què necessitaves recarregar una secció cada 5 segons? o.o No se m’acudeix res… com no sigui per anar emmagatzemant periòdicament la informació, però per això no cal recarregar res :S

    PD: aquest blog potser m’agradarà xD

  2. Gravatar de Ereza

    Enviat per Ereza el 6 juliol 2008 a les 21:57

    L’aplicació és una llista de serveis determinats, i es controla l’estat d’aquests serveis. Òbviament els estats poden canviar, i es poden eliminar, afegir o modificar serveis, i els clients que consulten l’aplicació volen que sigui tot en temps real. Per aquest motiu es refresca contínuament.

    PD: Més val que sí ò___ó

  3. Gravatar de ingiltere ogrenci vizesi

    Enviat per ingiltere ogrenci vizesi el 6 agost 2008 a les 0:36

    do you know any information about this in english?

  4. Gravatar de Ereza

    Enviat per Ereza el 6 agost 2008 a les 10:21

    Hi!

    You can get more info on the links I posted, but the main solution is to use a timeout for some milliseconds:

    setTimeout(”document.getElementById(”elementToFocus”).focus();”, 100);

    IE does something in the background and doesn’t let you focus an item until some time has passed.

    You can check an automatically translated version of this page here: http://traductor.gencat.net/url.do?translationDirection=CATALAN-ENGLISH&subjectArea=%28GV%29&url=http://blogmajus.catsub.net/2008/06/30/internet-explorer-i-focus-endarrerit/&MARK_UNKNOWNS=0&MARK_ALTERNATIVES=0&PPM_USE=1&submit=Tradueix

Deixa un comentari!