Inyectando xml con formato dentro de javascript
A veces estaria bien poder definir un xml en javascript de la siguiente manera:
1 2 3 4 | var html = <form> <input type="text"> </form>; |
Hasta que javascript soporte E4X en todos los navegadores, esto no va a ser podible…
Mientras llega E4X podemos simularlo utilizando los comentarios de javascript, para alli almacenar nuestras variables de una manera legible…
Definiriamos variables de la siguiente manera:
1 2 3 4 5 6 7 | /*! {"embed":{ "id":"form" } } <form> <input type="text" name="user"/> <input type="text" name="password"/> </form> */ |
La primera linea tiene que se un comienzo de comentario javascript /* , pero atencion con el simbolo ! justo detras, por lo que quedaria en /*!. Esto lo utilizamos para que algunos minimizadores de codigo no borren estos comentarios.
En la segunda linea es donde le especificamos al parser la variable que estamos definiendo, usando la propiedad id del objecto JSON descrito.
La ultimi linea tiene que ser un cierre de comentario */ en linea nueva…
Ejemplo completo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | var data = function() { /*! {"embed":{ "id":"form" } } <form> <input type="text" name="user"/> <input type="text" name="password"/> </form> */ /*! {"embed":{ "id":"button"} } <button value="Send"> */ } var parsedData = window.parseEmbeds(data); alert( parsedData.form ) alert( parsedData.button ); |
Libreria de parseo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | (function(window) { window.parseEmbeds = function( fn, opt ) { var dataObj = {} var regex_comments = /\*(.|[\r\n])*?\*/gi; var code = fn.toString().match( regex_comments ); var comment; var lines; var outputString; var trim11 =function(str){str = str.replace(/^\s+/, '');for (var i = str.length - 1; i >= 0; i--) {if (/\S/.test(str.charAt(i))) {str = str.substring(0, i + 1);break;}}return str;}; for( var i=0; i<code.length; i++ ) { comment = code[ i ]; if( comment.indexOf('{"embed":')!=-1 ) { lines = comment.split('\n'); outputString = ""; for( var e=2; e <lines.length-1; e++ ) { outputString+=trim11(lines[e]); } dataObj[ JSON.parse( lines[ 1 ] ).embed.id ] = outputString; } } return dataObj; } })(window); |


