martes, 8 de enero de 2008

XSLT-XML y AJAX

Esta vez veremos como crear un resultado html utilizando plantillas creadas en xls y que a raíz de la conversión con xml generar un archivo de resultados final. Esto ha sido mencionado en reiteradas ocaciones en los artículos que he publicado en diciembre del 2007, así que si quieren sacar el mayor provecho, les recomiendo que vean estos.

Antes de realizar cualquier ejemplo tenemos que entender un poco que es XSLT, así que veremos una pequeña descripción que acontinuación detallamos:

XSLT (XML Stylesheets Language for Transformation o en español, Lenguaje de Transformación Basado en hojas de estilo) es utilizado para realizar una transformación de documentos XML a otro tipo de documentos de estructura de XML o a documentos finales, como es el caso del artículo que detallaremos, ya que, la transformación que realizaremos será a código HTML (Documento Final).

Aunque, existe una similitud en algunas de las sentencias de programación a las cuales estamos acostumbrados a utilizar, el comportamiento funcional de estas sentencias, están definidas para trabajar con las estructuras de los archivos XML que entregamos a la plantilla definida en XSLT, la cual genera el resultado final esperado.

He querido que veamos este tipo de generación de páginas Web o de resultados de HTML, debido a que nos pueden facilitar la vida enormemente, aunque cuando se empieza con XSLT nos podemos complicar un poco. Pero, al final, cuando se entiende la filosofía, nos pueden ayudar en gran medida, sobretodo cuando queremos trabajar con la misma lógica en diferentes presentaciones (páginas o sitios enteros), ya que esto nos permite modificar las plantillas y mantener la lógica de programación generada, es decir, hasta la entrega del XML todo sigue igual.

Adicionalmente nos permite realizar llamadas asincrónicas sea con AJAX o AJAXPRO, en donde se nos retorna un resultado formateado, incluso con las imágenes definidas. Se debe destacar que con AjaxPro, si se está trabajando con estructuras de objetos, los retornos de información deben ser serializados, lo cual es más seguro al momento de transmitir información desde el servidor al cliente.

Si bien es cierto, existen muchos sitios en donde pueden encontrar información de cómo trabajar con XML y XSLT. A continuación, les voy a entregar unas URL muy buenas que a mi me sirvieron mucho, al momento de trabajar en un proyecto desarrollado con estas tecnologías.

Para los que recién parten con XSLT pueden ir a:
http://www.zvon.org/xxl/XSLTutorial/Output/example1_ch1-html Aquí podrán encontrar de forma simple, explicaciones de cómo definir archivos en XML y como deben ser tratados en XSLT para obtener el resultado final.

Para los que les gusta buscar en MSDN, también existen ayudas en línea. Aquí les entrego una URL que les permitirá realizar las transformaciones entre XML y XSLT:http://support.microsoft.com/kb/307494/es

Para los que tienen idea de XSLT, pueden dirigirse a:
http://xml.utilitas.org/xslt_mini_como_htmlç Aquí podrán encontrar con más detalle como poder utilizar las funciones y objetos que ofrece XSLT.

Antes de empezar con el ejemplo, me gustaría detallar que, el pasarle al servidor la carga de generación de código HTML en solicitud a un método definido en AJAX, que responda a esta solicitud, resulta mucho más optimo que retornar la información de datos y luego trabajar con JAVASCRIPT para desplegar la misma.


Ventajas.


Si se manejan bien con JavaScript, pueden retornar un HTML con paginación incluida, ya que pueden no solo retornar HTML puro y duro, sino que también en el, pueden incluir funciones de cliente.

Respuesta rápida a la generación de zonas que desea refrescar.


Desventajas


El Historial se pierde, no queda registrado, pero si tienen paciencia y siguen el ejemplo hasta el final veremos como hacer un truquito para manejar el historial para AJAX y AJAXPRO sin necesidad de utilizar algún tipo de herramienta, ya que solo en AJAX existe un control History en el Framework de Ajax de Futures, pero esto nos obliga a manejar muy bien los eventos y generalmente a utilizar controles de AJAX prediseñados, pero si deseáramos generar nuestras propias funciones tendríamos que tener muchas consideraciones para incluir el control History.

Ejemplo

Como ya sabemos, debemos crear una solución y a esta asociar una referencia a la librería de AJAX que utilizaremos, en este caso Ajax.dll (Recomiendo crear el directorio bin en el proyecto y copiar la dll en este).

Como siguiente paso, agregaremos en el WEB.CONFIG, dentro del nodo system.web, las siguientes líneas, las cuales nos permitirán realizar la referencia a la dll de AJAX que hemos referenciado.

<httpHandlers>
<add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax"/>
</httpHandlers>


A continuación, Crearemos un nuevo archivo .aspx que llamaremos AjaxXslt.aspx, definiendo el código html de la siguiente forma:


<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Manejo de XSLT con Ajax </title>
&lt/head>
<body>
<form id="frm" runat="server">
<div id="divSeleccion" >

</div>
</form>
</body>
</html>


Agregaremos un nuevo archivo del tipo XSLT al proyecto, que llamaremos despliegue.xslt. Como ven, se genera automáticamente un archivo con un cuerpo de HTML.


Como nosotros solo vamos a trabajar con un archivo, podemos definir un template de despliegue y según una opción podremos llamar a este template o a otro, en este caso crearemos un template que llamaremos empleados y que despues lo referenciaremos desde el cuerpo del template match, como se muestra a continuación:


<?xml version="1.0" encoding="ISO-8859-15>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<xsl:if test="root/parametro/opcion=1">
<xsl:call-template name="empleado"/>
</xsl:if>

</xsl:template>

<xsl:template name="empleado">
<select id="sltEmpleado" >
<xsl:for-each select="root/empleado">
<option>
<xsl:attribute name="id">
<xsl:value-of select="id"/>
</xsl:attribute>
<xsl:value-of select="apellido"/>
</option>
</xsl:for-each>
</select>
</xsl:template>
</xsl:stylesheet>


Comentemos el código generado:


El cuerpo principal de un archivo XSLT está encerrado en el match, nunca se puede generar un archivo xslt sin tener definida la directiva match, es desde aquí donde se inicia la generación del archivo de resultado.

Aunque es posible realizar llamadas a archivos xslt fuera del la directiva macth, los template que estén contenidos en estas plantillas solo podrán ser ejecutadas dentro de dicha directiva, el ejemplo más claro es el de nuestro template empleado que lo hemos agregado fuera de la directiva match, pero que se llama su ejecución dentro de este.

Ahora si bien es cierto podemos ver que dentro del cuerpo del match existe un if, este testea un valor de un nodo del xml que se debe entregar, por lo cual en el xml que entreguemos debemos considerar que existan estos nodos.

Si observan, en el template empleado existe un select que se cargará mediante un for-each, este se ejecuatrá mientras existan registros en el nodo root/empleado, es decir, si existen 10 nodos empleado, el for-each se ejecutará 10 veces.

Por otra parte, cuando cargamos los datos, vemos que agregamos los atributos al nodo del select (opcion) utilizando la opcion de xslt attribute. Esta opción puede ser utilizada para todos los tipos de atributo que existen en los controles HTML.

La información que se agrega a estos atributos se entrega desde el archivo xml, ahora ustedes se preguntarán de doonde sale este archivo xml, bueno ahora vamos a generarlo y esto se hará desde el ajaxmetodo de la siguiente forma.

Primero debemos instanciar los espacios de nombre:
using System.Data;
using System.Data.SqlClient;
using System.Xml;

Luego, en el método que atiende el evento load de la página que hemos creado agregaremos la siguiente línea de código:

protected void Page_Load(object sender, EventArgs e){
Ajax.Utility.RegisterTypeForAjax(typeof(AjaxXslt));
}

Antes de continuar, debemos detenernos a ver que vamos a hacer el despliegue. En este caso debemos realizar una consulta a la base de datos y retornar un archivo con el esquema xml, para ello utilizaremos la sentencia de sql for xml explicit, que me permitirá devolver un esquema en xml, luego el resultado debemos cargarlo en una variable de tipo string, que nos permitirá concatenar las otras opciones del xml, estas acciones se muestran a continuación:

[Ajax.AjaxMethod()]
public String getEmpleado() {
String strResultado = "";
try{
XmlDocument xml = new XmlDocument();

System.Text.StringBuilder strTxt = new System.Text.StringBuilder();

strTxt.Append("<root>");
strTxt.Append("<parametro>");
strTxt.Append("<opcion>1</opcion>");
strTxt.Append("</parametro>
");
strTxt.Append("</root>
");

xml.LoadXml(strTxt.ToString());
String strCnx = "Data Source=(local);Initial Catalog=Northwind;Integrated Security=True";

String strSql = "select 1 as tag, null as parent, EmployeeID as [empleado!1!id!element], " +
"LastName as [empleado!1!apellido!element] " +
"from Employees for xml explicit";

SqlConnection cnx = new SqlConnection(strCnx);
cnx.Open();
SqlCommand cmd = new SqlCommand(strSql, cnx);
SqlDataReader rdr = cmd.ExecuteReader();

String strDato = "";
while (rdr.Read()){
strDato += rdr[0].ToString();
}

xml.LastChild.InnerXml = xml.LastChild.InnerXml + strDato;

System.IO.StringWriter swHtml = new System.IO.StringWriter();
System.Xml.Xsl.XslCompiledTransform xsl = new System.Xml.Xsl.XslCompiledTransform();

xsl.Load(HttpContext.Current.Server.MapPath("~") + "\\despliegue.xsl");

xsl.Transform(xml, null, swHtml);
strResultado = swHtml.ToString();

swHtml.Close();
cnx.Close();
}
catch (Exception ex){
throw ex;
}
return strResultado;
}


Comentemos el código creado.


Como vemos en el código desplegado, ahora no devolvemos un Dataset sino que devolvemos un resultado entre el XML que generamos y el archivo XSLT que creamos con anterioridad, el cual entrega directamente el select de html con la información.

Para ello primero creamos una variable de tipo xml y vamos agregando a esta los nodos que vamos creando. Se debe tener cuidado cuando se realiza un InnerXml ya que este tipo de opciones si no se suma, reemplaza a los nodos ya creados.

El siguiente paso, una vez construido el archivo XML, es crear una variable para realizar la transformación a la cual le entergaremos el path en donde se encuentra el archivo xsl que utilizaremos para generar el código, por ultimo, utilizando el método Transform cargamos a una variable de tipo StringWriter el resultado entre el cruce de los archivos.

Ahora lo que nos queda es realizar la llamada desde el cliente, para ello crearemos las siguientes funciones en javascript en la zona de script que definiremos, de la siguiente forma:

<script language="javascript">
function getEmpleado(){
AjaxXslt.getEmpleado(getEmpleado_callback,
document.getElementById("divSeleccion"));
}

function getEmpleado_callback(res) {
if (res.error!=null){
alert(res.error);
}else{
res.context.innerHTML = res.value;
}
}

</script>

Como se observa, hemos creado ahora en el cliente dos funciones, que no muestran ningún tipo de lógica de negocio, solo el despliegue de datos del resultado entregado, es aquí en donde pasamos la carga de generación al servidor, pudiendo incluso, como comente anteriormente, realizar paginación. Esto, dependiendo del tiempo que tenga, podríamos verlo en futuros artículos.

Por ultimo, nos falta realizar la llamada inicial, para ello, en el body agregaremos en la sentencia onload, la siguiente llamada a la función definida en javascript.

<body onload="javascript:getEmpleado();">


Resumen

Como se ha observado, este tipo de transferencia de datos es más complejo y representa un mejor resultado al momento de realizar un despliegue en el cliente, debido a que el resultado es generado en el servidor y solo en el cliente se despliega el resultado. El problema de esto es que como son controles de html los que se generan al realizar un cambio de dato en el combo desplegado, no queda refrescada esa acción en el history del navegador ya que no se realiza una solicitud al servidor direcatmente. Una forma de poder manejar las solicitudes del history la veremos más adelante en el artículo de manejo del historial.


volver

XSLT-XML y AJAXPRO


Cuando estemos trabajando con XSLT y AjaxPro, aunque podríamos decir que es igual que Ajax, presenta un número mayor de posibilidades en cuanto a métodos y procedimientos que esta dll nos ofrece, adicionalmente, en el caso de que estemos devolviendo esquemas de estructuras de clases u objetos como dataset tipados o datatables, nos exige que estos se encuentren serializados, definiendo una transmisión de datos más segura.

En este artículo veremos como la misma funcionalidad definida en el artículo de XSLT-XML y Ajax se comporta en AjaxPro, lo bueno de todo, es que el mismo código que definimos en el servidor, nos sirve, a excepción de la dll de Ajax, ya que utilizaremos la de AjaxPro.dll.

Ahora si desean tener un detalle de XSLT y XML, pueden ir al articulo XSLT-XML y AJAX, en donde defino un resumen de lo que es XSLT y pongo a dispocición url's de ayuda, para los principiantes.
NOTA. Se debe considerar que en este ejercicio se está utilizando un archivo XSLT el cual se define en el artículo XSLT-XML y AJAX, si han ido paso a paso, no les faltará este archivo en la solución.

Ejemplo

En el siguiente ejercicio veremos como, la funcionalidad definida en Ajax, funciona en AjaxPro, con la salvedad de que en el servidor y en el cliente AjaxPro nos ofrece la posibilidad de un número mayor de propiedades y métodos, que no se encuentran en la dll de Ajax que he utilizado para los ejemplos planteados. Adicionalmente se debe hablar de la serialización que se puede utilizar en la transmición de datos entre el cliente y el servidor, que la dll de Ajax utilizada no contempla.

No se si microsoft a mejorado la dll de Ajax para desarrolladores en este aspecto, creo que en los controles si, pero que pasa con los que nos gusta picar código???.

Ahora nos falta ver como se comporta esto en AjaxPro, lo bueno de todo, es que el mismo código que definimos en el servidor, nos sirve, a excepción de la dll de Ajax, ya que utilizaremos la de AjaxPro.dll.

En el cliente tendremos que hacer algunos cambios, que en realidad serán muy pocos, pero que permitirán ver las diferencias de despliegue que se tornan ineteresantes y, que la versión de la dll de Ajax que estoy utilizando no considera.

Antes de continuar con el ejercicio me gustaría destacar que la plantilla xsl que hemos definido ya puede ser modificada para mostrar la información de otra forma, lo cual demuestra que sin modificar el código que genera y entrega el archivo xml podemos modificar la forma de desplegar la información, lo cual nos permite definir muchas plantillas xsl para el manejo de la misma información.

En el caso de este ejercicio, seguiremos utilizando la misma plantilla que ya definimos para el despliegue con Ajax, pero deberemos considerar y seguir los siguientes pasos:

Copiaremos en el directorio bin del proyecto la dll AjaxPro.dll. De más esta decir que al copiar una dll en este directorio, automáticamente queda definido como una referencia, si no me creen realicen el ejercicio y luego vean el propiedades del proyecto las referencias que se han agregado.
El siguiente paso será crear un nuevo archivo aspx, el cual llamaremos AjaxProXslt.aspx, luego iremos al archivo web.config y agregaremos la siguiente línea de código en el nodo httpHandlers, como se muestra a continuación.

<add verb="POST,GET" path="ajaxpro/*.ashx"
type="AjaxPro.AjaxHandlerFactory, AjaxPro"/>

Si se observa, la única diferencia entre la línea de referencia de Ajax y AjaxPro está dada en la llamada de la dll a Ajax o a AjaxPro y la llamada al HandlerFactory.

En el ejercicio que publicaremos estoy dejando las dos líneas para que tengan el punto de comparación, así como las dos dll’s y los dos archivos que consumen el mismo archivo xsl. Ahora, en el método que atiende el evento load de la página que hemos creado agregaremos la siguiente línea de código:

protected void Page_Load(object sender, EventArgs e){
AjaxPro.Utility.RegisterTypeForAjax(typeof(AjaxProXslt));
}

Al momento de definir la línea de registro de tipo de nombre de clase, se puede observar que el Inteliggence despliega muchos más métodos y propiedades que el de la dll de Ajax. Con esto se puede observar, que esta dll está más orientada al desarrollo que la de Ajax, ya que Microsoft se ha centrado mucho más en la utilización de controles y ha dejado de lado la definición de funciones y procedimientos que el usuario pueda tener a medida en sus organizaciones, ya que si bien, existe un espectro muy grande de controles, no pueden existir controles para todos los requisitos de todas las organizaciones, por esto, es necesario conocer y saber Ajax y/o AjaxPro, lo cual permitirá construir controles propios. Bajo esta perspectiva es que nuevamente recalco que es muy importante el conocer y manejar de forma avanzada JavaScript.

El siguiente paso será crear el método que será solicitado desde el cliente, en realidad, el método será el mismo que creamos en el ejercicio anterior con Ajax, pero la diferencia estará en la forma de definir el método, ya que en esta ocasión lo firmaremos con la declaración de AjaxPro, pondremos el código completo para ver como queda:

[AjaxPro.AjaxMethod()]
public String getEmpleado()
{
String strResultado = "";
try
{
XmlDocument xml = new XmlDocument();

System.Text.StringBuilder strTxt = new System.Text.StringBuilder();

strTxt.Append("<root>");
strTxt.Append("<parametro>");
strTxt.Append("<opcion>1</opcion>");
strTxt.Append("</parametro>");
strTxt.Append("</root>");

xml.LoadXml(strTxt.ToString());
String strCnx = "Data Source=(local);Initial Catalog=Northwind;Integrated Security=True";

String strSql = "select 1 as tag, null as parent, " +
"EmployeeID as [empleado!1!id!element], LastName as" +
" [empleado!1!apellido!element] from Employees " +
"for xml explicit";

SqlConnection cnx = new SqlConnection(strCnx);
cnx.Open();
SqlCommand cmd = new SqlCommand(strSql, cnx);
SqlDataReader rdr = cmd.ExecuteReader();

String strDato = "";
While (rdr.Read())
{
strDato = rdr[0].ToString();
}

xml.LastChild.InnerXml = xml.LastChild.InnerXml + strDato;

System.IO.StringWriter swHtml = new System.IO.StringWriter();
System.Xml.Xsl.XslCompiledTransform xsl = new System.Xml.Xsl.XslCompiledTransform();

xsl.Load(HttpContext.Current.Server.MapPath("~") + "\\despliegue.xsl");

xsl.Transform(xml, null, swHtml);
strResultado = swHtml.ToString();

swHtml.Close();
cnx.Close();
}
catch (Exception ex)
{
throw ex;
}
return strResultado;
}

No debemos de olvidar de realizar la importación de los espacios de nombre que utilizamos para crear los controles de conexión a Base de Datos o como los de creación de xml. Si no se acuerdan, aquí se los escribo nuevamente.

using System.Data;
using System.Data.SqlClient;
using System.Xml;

El ultimo paso es definir la llamada desde el cliente, para ello crearemos las líneas de código en JavaScript, pero antes definiremos el cuerpo del HTML, con las siguientes líneas.

<body>
<form id="frm" runat="server">
<div id="divSeleccion">

</div>
</form>
</body>

Ahora definiremos las funciones en JavaScript que permitirán conectarnos al AjaxPro Method, o método de de AjaxPro.

<script language="javascript">
function getEmpleado(){
AjaxProXslt.getEmpleado(getEmpleado_callback,
document.getElementById("divSeleccion"));
}

function getEmpleado_callback(res) {
if (res.error!=null){
alert(res.error.Message);
}else{
res.context.innerHTML = res.value;
}
}

</script>

Como se observa, la forma de realizar la llamada y la carga es muy similar a la definida en Ajax, pero se observa que el manejo de errores está más trabajado, ya que en este existe un método Message, que solo retorna el texto del mensaje de error. Esto nos permite personalizar los mensajes que se envían a los usuarios que operan en la página.

Por ultimo, nos falta realizar la llamada inicial, para ello, en el body agregaremos en la sentencia onload, la misma llamada que definimos en la ejercicio anterior, es decir:

<body onload="javascript:getEmpleado();">


Resumen

Con XSLT y AjaxPro, aunque a primera instancia podríamos decir que es igual que Ajax, presenta un número mayor de posibilidades en cuanto a propiedades, métodos y procedimientos que esta dll nos ofrece. Adicionalmente, en el caso de que estemos devolviendo esquemas de estructuras de clases u objetos como dataset tipados o datatables, nos exige que estos se encuentren serializados, definiendo una transmisión de datos más segura.

volver

Manejo de Historial para Ajax


Antes de empezar con el ejemplo debemos considerar que, para realizar este ejercicio, utilizaremos como prerequisito haber realizado el ejercicio de
javascript y ajax descrito en diciembre del 2007.

También pueden definir un combobox de html fijo, definido por ustedes mismos con options puestos en duro (Hard code), en el caso que no deseen realizar el ejercicio de javascript y ajax

Entonces, considerando lo antes expuesto empecemos con los truquitos:

Si en una organización se encuentra institucionalizado el navegador de Mozilla (Firefox), es posible sobrescribir el has de la tabla.

Este truco no funciona para Internet Explorer 6.0 pero para el 7.0 sí, ya que este no permite sobre escribir el Hash. Para Internet Explorer 6.0 veremos como hacer un truquito con un iframe para dejar una huella de donde pasamos para que el historial se sobrescriba, claro esta, que si refrescamos la página, el historial del navegador se perderá, ya que estamos navegando dentro del iframe de la página y no dentro de páginas.


¡Ahora a lo suyo!

Sobrescribiendo el Hash para otros navegadores que no son Internet Explorer 6.0.



Para ello trabajaremos con la página que creamos en javascript y ajax , esta es inicio.aspx.

Antes que todo, para que la información se despliegue en Firefox deberemos modificar la función getEmpleado_callback(), la cual quedará de la siguiente forma:

function getEmpleado_callback(res) {
if (res.error!=null){
alert(res.error);
}else{
for( i=0; i<res.value.Tables[0].Rows.length; i++) {
var opcion = document.createElement("OPTION");
document.frm.sltEmpleado.options.add(opcion);

opcion.id = res.value.Tables[0].Rows[i].EmployeeID;
opcion.innerText = res.value.Tables[0].Rows[i].LastName;
opcion.innerHTML = res.value.Tables[0].Rows[i].LastName;
}
}
}

Aquí se observa por que debemos saber JavaScript, ya que para acomodar el código para los distintos navegadores debemos saber que código agregar, de lo contrario, si no hubiéramos agregado la ultima línea (opcion.innerHTML) la información en Firefox no se nos habría desplegado, aunque los id’s si.


Dentro de la definición de código de JavaScript agregaremos dos funciones, las cuales detallamos a continuación:

function funEscribirHush(newHash){
window.location.hash = newHash
}

function funNuevoHash(){
var oFrame = document.forms[0];
var oSelect = oFrame.sltEmpleado;

return oSelect.options[oSelect.selectedIndex].id;
}

Ahora, para que funcione el manejo de history del navegador de FireFox, agregaremos en el select de html la siguiente llamada, en el evento onChange:

<select id="sltEmpleado" onchange="return funEscribirHush(funNuevoHash());">
</select>

Ahora si ejecutamos la página y seleccionamos cualquiera de las opciones, veremos que se ha escrito el History en el navegador de Firefox y en Internet Explorer 7.0.

Si ejecutamos este código en Internet Explorer 6.0, veremos que no nos funciona, por lo cual haremos otro manejo de History, que nos funcionará tanto para Mozilla Firefox, como para Internet Explorer, esto está amarrado a la creación de un IFrame y de una página, que llamaremos página fantasma, ya que estará en blanco y será una página html.


Manejo de Historial con IFRAME


Dejando la llamada de la función FunEscribirHush en el evento onChange del select de html, realizaremos los siguientes cambios:

Primero agregaremos un archivo .html que llamaremos inicio.html.

A continuación agregaremos un iFrame dentro del body del html, a continuación del select definido, el cual instanciará a la página html que hemos creado, esto se realizará de la siguiente forma:

<iframe id="ifrNavegar" style="display:none;" src="inicio.html"/>

Si ejecutamos la página podremos ver que esta se despliega como siempre, lo que hemos hecho es ocultar el iframe ahunque este será utilizado.

El siguiente paso será crear en un JavaScript la función que actualizará la llamada del src del iframe, para esto concatenaremos en la url el valor de la selección realizada. La función se debe definir de la siguiente forma:

function funIFrameActualizar(){
var oFrame = document.forms[0];
var oSelect = oFrame.sltEmpleado;

var opcion = oSelect.options[oSelect.selectedIndex].id;

document.getElementById("ifrNavegar").setAttribute("src", "inicio.html?opcion=" + opcion);
}

Con esto el navegador deja una huella que debe seguir mientras se esta posicionado en la página.

Lo que nos falta es actualizar la llamada a esta función en el evento onchange del control de html Select, quedando de la siguiente forma:

<select id="sltEmpleado" onchange="javascript:funIFrameActualizar();">

Probaremos el ejercicio y veremos su comportamiento.


Administrar parámetros entre las páginas que actuan en el manejo del iFrame


En el caso de que queramos guardar un valor en la página inicio.html y luego utilizarlo una vez que se ha actualizado la información, se puede rescatar en la página referenciada del iframe y luego enviarla a la página padre, esto se hace de la siguiente forma:

En la página inicio.html agregaremo la siguiente funcione en JavaScript, que se ejecutará al cargarse la página, esta función rescatará un parámetro en específico de la cadena entregada en la url y retornará el valor al padre.

function init(){
var dato = parametroRescatar('opcion');

perent.funDatoRescatar(dato);
}

function parametroRescatar(parametro){
var strParametro = window.location.search.split(parametro + '=')[1];
var strDato = strParametro.split('&')[0];

return strDato;
}

La primera función se ejecuta cuando la página es cargada, ya que en el evento onload del body del html, se realiza la llamada a la función init(), luego rescata el dato deseado y llama a la función del padre, para pasarle el parámetro. Esta función debe estar definida en el padre para que recate el dato.

<body onload="javascript:init();">

En el padre se creará una función que capturará este valor y que para nuestro entender lo desplegará en la interfaz, pero que podría actualizar un control de html para ser utilizado en la página.

function funDatoRescatar(opcion){
alert(opcion);
}

Bueno amigos, para los que ayan seguido el artículo hasta el final les comunico que este era más que un simple artículo de AJAX y AJAXPRO, ya que aparecieron en este varios trucitos que no aparecen en los foros comunes y que no se encuentran en cualquier parte, esta información ha sido acumulada por la participación que he tenido en proyectos de este tipo como he mencionado.

Espero que les gustara este artículo.