Appunti AJAX

Gestire eventi su HTML dinamico

Non so quale possa essere il modo migliore per gestire gli eventi sull’ HTML ricevuto tramite XMLHttpRequest, nel senso che ci sono tanti modi diversi per farlo, ma non trovo la soluzione migliore.
Forse jQuery permette una soluzione “semplice”, ma io vorrei usare solo JavaScript con PrototypeJS.

Primo caso

Ricevo HTML con una richiesta gestita da Ajax.Updater, e la risposta contiene javascript inline:

new Ajax.Updater('div_id', '/path/to/get_smtg.php', {
// notare evalScripts
  parameters: { param1: 'value1', evalScripts: true) }
});

ogni blocco <script> viene “valutato” da javascript.
Questo può essere un buon metodo, ma ha 2 difetti:

  • non c’è separazione del codice, dato che javascript e PHP risultano mescolati
  • ogni volta che viene chiamato Ajax.Updater deve essere valutato ogni script ricevuto (ad esempio gli event listeners vengono rimossi e ricollegati)

Un pregio è quello di centralizzare la logica che gestisce l’ HTML ricevuto dinamicamente.

Secondo caso

Per ovviare ai precedenti difetti si può pensare alla delegazione degli eventi:
invece di aggiungere i listener all’ HTML ricevuto, si pone un listener sul suo contenitore.
Non sono pienamente convinto di queso metodo: non mi piace che ci siano degli script attivi su un contenuto che non esiste e che potrebbe non essere raggiunto con AJAX.
Si può mitigare questo comportamento registrando i listener con la classe Event.Handler di prototypeJS:
il costruttore istanzia un oggetto “handler” che però non osserva gli eventi finchè non viene chiamato il metodo start

var handler = new Event.Handler(element, eventName[, selector], callback);
handler.start();
...
handler.stop();

Terzo caso

Dovrei vedere come realizzare un widget in cui fondere HTML e JavaScript.
http://www.amazon.com/Developing-Widget-HTML-JSON-AJAX/dp/1450502288
http://developingwebwidgets.blogspot.it

Restituire HTML e JavaScript da PHP

Per restituire JS inline al codice HTML bisogna costruire la stringa della risposta.

heredoc e nowdoc

PHP permette di assegnare testo multilinea ad una variabile stringa tramite gli heredoc e, dalla versione 5.3.0, anche tramite i nowdoc:
la differenza fra i due è che heredoc subisce il parsing di PHP, mentre nowdoc no.

// heredoc:
$name = 'MyName';
$variable = "text";
echo <<<EOT
My name is "$name". I am printing some $variable.
This should print a capital 'A': \x41
EOT; // notare il punto-e-virgola

Output:

My name is “MyName”. I am printing some text.
Now, I am printing some Bar2.
This should print a capital ‘A’: A

Invece con nowdoc:

// nowdoc:
$name = 'MyName';
$variable = "text";
// notare il single-quote
echo <<<'EOT'
My name is "$name". I am printing some $variable.
This should not print a capital 'A': \x41
EOT;

Output:

My name is “$name”. I am printing some $variable.
This should not print a capital ‘A’: \x41

Includere un file esterno

Il comando include di PHP legge un file e lo riporta nel file attuale.
Ci sono però varie problematiche da tenere presente:

  • una è include_path
  • poi c’è il comportamento del return per assegnare l’ output ad una variabile
  • infine si può usare l’ output buffering per ricevere l’ output di include

Vedere il manuale di include.

Oppure bisogna leggere un file con fopen(), e restituire il suo contenuto.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...