jQuery in origine aveva una sintassi la cui struttura era quasi del tutto identica a quella di XPath. Si voleva così sottolineare come questa libreria fosse universale, ossia adatta sia all'HTML che all'XML. Per esempio, prendiamo un frammento XML di questo tipo:
<book xmlns:xdc="http://www.xml.com/books"> <xdc:bookreview> <xdc:title>XML: A Primer</xdc:title> <xdc:author>Simon St. Laurent</xdc:author> <xdc:price>31.98</xdc:price> <xdc:pages>352</xdc:pages> <xdc:date>1998/01</xdc:date> </xdc:bookreview> </book>
Il problema principale è che non è possibile utilizzare i normali selettori CSS di jQuery per operare una distinzione in base al tipo di elemento, poiché abbiamo sei elementi che vivono all'interno del namespace principale. Se si prova ad utilizzare una sintassi del tipo $('xdc:bookreview')
si ottiene un errore, in quanto i browser pensano che si stia utilizzando un nuovo tipo di selettore (questo è normale se si pensa che jQuery utilizza una sintassi CSS-like).
Occorre quindi procedere in modo diverso. Innanzitutto occorre isolare il namespace dal resto e poi utilizzare le proprietà DOM namespaceURI
e localName
per distinguere gli elementi. Ecco un esempio di base:
$(document).ready(function(){ var NS = 'http://www.xml.com/books'; var contents = []; $('book').find('*').each(function() { if($(this).get(0).namespaceURI == NS) { var local = $(this).get(0).localName; var content = $(this).text(); var domBit = local + ': ' + content; contents.push(domBit); } }); $('<ul></ul>').appendTo('body'); for(var i= 0; len = contents.length, i<len; i++) { var part = contents[i]; $('<li></li>').text(part).appendTo('ul'); } });
Dato che per il mio test ho usato un documento XHTML 1.1 servito come application/xhtml+xml
si sono rese necessarie alcune precauzioni, come per esempio l'uso di proprietà e metodi di inserimento che non prevedano l'uso della proprietà innerHTML
. Non ho testato questo esempio con AJAX, quindi lascio a voi, se siete curiosi, il compito di approfondire l'argomento. Un ultima cosa: IE6 e 7 non supportano le proprietà standard del DOM sopra elencate, quindi... nulla. Come al solito, sono sempre i peggiori browser che ci rallentano.