var mysite = {
    'url': "http://www.ajaxweb20.net",
    'author': "Giuseppe Raso",
    'xhtmlValid': true,
    'cssValid': true
}
Home > Blog

Bug di IE nella gestione di array contenenti elementi XML.

Aprile 26th, 2008

Faccio veramente fatica a capire il bug che vi sto per illustrare, e qualcosa mi dice che per voi non sarà diverso :D

Supponiamo di avere una funzione che carica un documento xml; in Internet Explorer siamo costretti a usare un ActiveX: scomodo, ma almeno fin qui funziona tutto.

var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("myfile.xml")

Bene, ora supponiamo di voler creare un array contenente alcuni degli elementi che abbiamo ottenuto:

var arr = [];
arr[0]= xml.documentElement;
arr[1] = xml.childNodes[1]

Qual’è il bug?
Stranamente, una volta inserito uno o più elementi xml nell’array, i metodi toString e join di quest’ultimo non funzioneranno più.
In altre parole:

arr.toString() //Restituisce "[object]", una stringa assolutamente inutile
arr.join(",") //dà addirittura errore!

Onestamente non riesco proprio a capire come ciò possa accadere. Non posso fare altro che complimentarmi col team di IE: una “funzionalità” che io ho difficolta anche a concepire loro sono riusciti a realizzarla non volendo!

Spam politico.

Aprile 25th, 2008

Quanti di voi durante le ultime elezioni sono stati infastiditi dai cartelloni abusivi posti in ogni angolo della strada?

Se la risposta è si allora sappiate che non siete i soli :D

Candidamente pensavo che questa disgrazia sarebbe smessa dopo la fine delle elezioni, ma evidentemente mi sbagliavo; guardate che bel messaggio ho ricevuto oggi nel mio blog:

L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
L’isola dei famosi ANTONELLO DE PIERRO L’isola dei famosi ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Un posto al sole ANTONELLO DE PIERRO Un posto al sole ANTONELLO DE PIERRO
Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO Amici di Maria De Filippi ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
La talpa ANTONELLO DE PIERRO La talpa ANTONELLO DE PIERRO
Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO Striscia la notizia ANTONELLO DE PIERRO
Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO
Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO
Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO
Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO
Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO Zelig ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO
Grande Fratello ANTONELLO DE PIERRO Grande Fratello ANTONELLO DE PIERRO

Come vedete è un messaggio piuttosto grande contenente varie keywords.
Vi chiederete a questo punto chi sia Antonello di Pierro. Detto fatto: facendo una ricerca su Google si scopre che è un candidato del partito di DI Pietro per il comune di Roma di queste ultime elezioni.

Io onestamente non so se sia un’iniziativa scellerata lanciata dallo stesso politico, uno scherzo o addirittura un tentativo di sabotaggio dell’immagine di De Pierro.

Solo di una cosa sono sicuro, che chiunque sia non deve più venire a rompermi i coglioni con questi messaggi :)

Messaggi subliminali nel logo di Google?

Aprile 13th, 2008

Spesso e volentieri capita che Google cambi logo per celebrare un evento, una ricorrenza o anche i grandi uomini del passato. E’ il caso di quello che è successo oggi con un logo dedicato a Meucci, il celebre italiano inventore del telefono.

Ma se vi fate caso in questo logo c’è qualcosa se non va, a dirla tutta è anche piuttosto evidente…

In altre parole c’è un messaggio subliminale e a un occhio attento non dovrebbe essere molto difficile scovarlo :D
Ecco l’immagine:

Che ne dite? E’ o non è un messaggio subliminale? :D

Super Mario in 14 kb di Javascript.

Aprile 9th, 2008

Recentemente Jacob Seidelin è riuscito a ricreare il gioco di Super Mario in soli 14 kb. Si tratta più che altro di un esperimento visto che è presente solo il primo livello.
Ciò che è interessante e mette in luce le potenzialità di Javascript è il fatto che per realizzarlo non sono state usate ne immagini ne file audio.

Come è possibile?
Per le figure è stato usato il tag canvas, e per simularlo in IE sono stati utilizzati dei div.
La musica invece è stata codificata in base64, anche se ciò non è simulabile in alcun modo su IE.

Postazioni di lavoro che definire “geek” è riduttivo.

Aprile 4th, 2008

Se pensate di stare troppo tempo davanti al computer potete consolarvi del fatto che c’è chi sta peggio di voi. Per accorgervene basta dare un rapido sguardo a questa serie di immagini :D








Se vi sono piaciute ( o se vi hanno fatto sentire meglio :) ) potete trovarne altre qui.

Scoperto un nuovo bug di sicurezza di Firefox. La vulnerabilità permetterebbe di inserire del codice maligno per rubare i dati della cronologia.

Aprile 1st, 2008

Una nuova vulnerabilità scoperta recentemente in Firefox permetterebbe agli hacker di inserire del codice di maligno attraverso il quale è possibile entrare nella cronologia dell’utente e leggerne gli url presenti.

Poi gli hacker potevano attraverso una semplice chiamata ajax conservare i dati in un database e venderli alle aziende interessate, o nel peggiore dei casi ricattare le vittime.

Il bug è stato corretto con la versione 2.0.0.14 uscita oggi, che può essere scaricata ovviamente andando in “?/Correggi vulnerabilità” nel menu di Firefox.

Una dimostrazione di questo bug è disponibile qui: lo script carica uno dopo l’altro i vari link presenti nella vostra cronologia e poi li stampa a schermo… Io sono rimasto scioccato :)

Javascript: Usare apply per passare vari argomenti a un costruttore.

Marzo 31st, 2008

Apply come già sicuramente saprete permette di passare degli argomenti ad una funzione sotto forma di array; tra l’altro lo stesso apply permette di specificare l’oggetto contesto della funzione, in altra parole l’oggetto che si potrà richiamare mediante l’operatore this.

function fn() {
  for(var i = 0, l = arguments.length; i!=l; i++) {
    this[i] = arguments[i] + "xyz";
  }
}

fn.apply([], ["a", "b", "c"]);

Qualcuno si sarà chiesto se sia possibile usare apply con i costruttori, qualcuno magari avrà provato anche a scrivere il seguente codice ricevendo in cambio l’errore “xxx is not a constructor”:

function miaClasse() {
  this.method = function() {
  }
  this.str = arguments[0] || ;
}

new miaClasse.apply(null, ["str"]) //Attenzione, questo codice NON funziona!!!

Fortunatamente non è molto difficile arrivare a una prima soluzione:

miaClasse.apply(new miaClasse, ["a"]); //Questo invece funziona!!!

Resta ancora un problema: il codice all’interno della classe miaClasse viene eseguito inutilmente due volte, e tra l’altro a causa dell’assenza di argomenti non è detto che non possa causare un errore.

La soluzione è quella di creare un’altra classe che erediti le proprietà dalla classe originaria e usare l’oggetto creato con questa classe:

function klass() {
  miaClasse.apply(new this, arguments)
}

function intermediate() {
}

intermediate.prototype = miaClasse.prototype;

klass.prototype = new intermediate;

//Esempio

klass.apply(null, [/*arguments…*/])

Notare che la proprietà constructor non viene corretta ( solitamente lo si fa in ogni ereditarietà ) proprio perchè potrebbe essere utile considerare l’oggetto restituito da miaClasse come se fosse un’istanza di miaClasse invece che di klass.

Infine come buona norma astrattizziamo il codice e trasformiamolo in funzione, anzi, visto che ci siamo che ne dite di un prototipo con un bel lazy pattern? :D

Function.prototype.instance = function(args) {

  var this_ = this;
  function klass() {
    this_.apply(new this, arguments[0])
  }

  function intermediate() {
  }

  intermediate.prototype = miaClasse.prototype;

  klass.prototype = new intermediate;

  this_.instance = klass;

  this_.instance(args);

}

Enjoy :)

Workaround per usare __defineGetter__ e __defineSetter__ su elementi HTML

Marzo 28th, 2008

defineGetter e defineSetter sono due metodi dannatamente utili supportati al momento da Firefox, Opera 9.5, Safari 3 e Konqueror. Essi permettono di manipolare le proprietà dichiarando un setter ( una funzione che viene eseguita opgni volta che settiamo una proprietà ) o un getter ( una funzione che viene usata ogni volta che prendiamo una proprietà in modo da manipolare il valore ritornato ).

Teoricamente potremmo usarlo per simulare innerText su Firefox:

HTMLElement.prototype.__defineSetter__("innerText", function(value) { this.textContent = value; })

Purtroppo in Firefox 2 ( con la versione 3 il problema non sussiste ) non è possibile definire ne getter ne setter sugli elementi HTML :(
Si tratta di uno strano bug che fortunatamente ha un workaround molto semplice, ovvero quello di applicare il getter/setter alla classe Node:

Node.prototype.__defineSetter__("innerText", function(value) { this.textContent = value; })

L’unico svantaggio è che così facendo stiamo applicando il setter a tutti i tipi di nodi, compresi nodi testo, commento e persino documento!

Ma anche in questo caso la soluzione è alquanto semplice:

Node.prototype.__defineSetter__("innerText", function(value) {
  if(this.nodeType == 1)
    this.textContent = value;
  else
    this.innerText = value;
})

Semplicemente controlliamo che il nodo sia veramente un elemento HTML ( con nodeType uguale a 1 ): se è vero settiamo la proprietà textContent ( il rispettivo di innerText in IE ) altrimenti ci comportiamo come se il setter non esistesse, ovvero settando la proprietà innerText manualmente.

Volendo possiamo “standardizzare” questa operazione tramite una funzione ( Ah che belle le closures :D ):

HTMLElement.$defineSetter = function(prop, fn) {
  Node.prototype.__defineSetter__(prop, function(value) {
    this.nodeType == 1
      ? fn.call(this, value)
      : this[prop] = value;
  })
}

Con poche modifiche possiamo creare una funzione che crea un getter:

HTMLElement.$defineGetter = function(prop, fn) {
  Node.prototype.__defineGetter__(prop, function() {
    retun this.nodeType == 1)
      ? fn.call(this, value)
      : this[prop];
  })
}

Per altri snippet stay tuned!

Una guida completa sull’erediterietà in Javascript.

Marzo 26th, 2008

Per chi sta iniziando adesso ad addentrarsi nei meandri di questo potente linguaggio di scripting, ma anche ai più esperti ( non si smette mai di imparare :) ) consiglio caldamente la lettura di questa guida ( in inglese ) sull’ereditarietà in Javascript.

Tra le guide inerenti l’argomento che abbia mai letto questa è senza ombra di dubbio la più completa, e tra l’altro riassume gli studi fatti recentemente dallo stesso Giammarchi e da altri javascripter di fama internazionale.

L’unico neo rilevante della guida è che forse la lettura potrebbe apparire alquanto oscura a chi ha poca o nulla dimestichezza con l’argomento…
Nel caso vi riconosciate in questa categoria vi consiglio caldamente di leggere anche questo vecchio post.

Le novità di Safari 3.1

Marzo 21st, 2008

La versione 3.1 di Safari porta con se delle grosse novità visionabili in questa pagina.

Tra le più importanti vi sono:

Sono davvero delle grosse novità, di certo però non faranno gola a molti visto il carente supporto da parte degli altri browser di queste caratteristiche… :(

Tra l’altro non è detto che queste nuove feature debbano essere necessariamente un punto a favore di Safari, già mi immagino form come questo… Provate a compilarlo :D

Via : Edit