Y bueno.. alguien se le ocurrió cambiar el nuevo GATC (Google Analytics Tracking Code)
El viejo urchin.js sera "ejecutado" dentro de 12 a 18 meses... así que hay tiempo para cambiarlo (Google compro Urchin en el 2005)
El nuevo código pasa la verificación W3c XHTML 1.0 Strict
Pero nadie se percató que todos los enlaces externos del sitio daban un error de script:
Line: xxx
Error: El Objeto no acepta esta propiedad o método
Y efectivamente era "cierto y verdadero" (como dice Les Luthiers) , no se encontraba este método
BLOCKED SCRIPT pageTracker._trackVisit(...
Parece que cuando cambiamos había que leer la implicancia de tal modificación, porque no te decían directamente sino aquí
(con el hermoso color amarillo "warning" pastel)
Testear... Que tipo de código de seguimiento tenemos?
Para los que no les gusta ver el código fuente de la pagina (no estarías leyendo este post de ser así) existe una web que lo verifica
www.sitescanga.com
Y ya que estamos en el tema, tips para los que todavía están en el lado oscuro
(NOTA: si tenemos una web y no sabemos quien entra o como llegó, estaremos seguramente malgastando el tiempo/dinero)
Para los que no lo usan todavía... es muy recomendado ya que por ejemplo los enlaces externos, y mas aun en sitios donde la publicidad es su fuente de sangre, se debe llevar una estadísticas de los enlaces externos, incluso de las descargas de archivos, ya que esto no es una pagina simple sino "mas bien una huida" de nuestro sitio, hasta incluso las transacciones de comercio electrónico
Ejemplo sencillo:
Con versiones (un poco antiguas) utilizábamos asi
<a href="/yoda.pdf"
onclick="urchinTracker('/yoda.pdf');">Yoda PDF</a>
{código viejo...}
Luego teníamos (que es como lo tenia actualmente)
<a href="yoda.pdf"
onclick="pageTracker._trackVisit('/yoda.pdf');">Yoda PDF</a>
{código viejo...}
<a href="yoda.pdf"
onclick="pageTracker._trackPageview('/yoda.pdf');">Yoda PDF</a>
Nos sirve para los enlaces externos por ejemplo para la publicidad
<a href="www.empresa.com"
target="_blank"
onclick="pageTracker._trackPageview('/publicidad/empresa');">Texto o Imagen de la publicidad</a>
y si lo queremos en Flash??, y bueno a codificar en AS (ActionScript)
on(release) {
getURL("BLOCKED SCRIPT pageTracker._trackPageview('/publicidad/empresa');");
getURL("http://www.empresa.com");
}
Y si lo quieres como función en VB.NET
Esta función la utilizo para armar las publicidades en modo imagen... es decir el enlace es una imagen
Public Shared Function PubliImagen(ByVal key As String, ByVal imagen As String, ByVal url As String, Optional ByVal alt As String = String.Empty) As String
Dim strPubli As New System.Text.StringBuilder
strPubli.Append("<a target=""_blank"" href=""")
strPubli.Append(url)
strPubli.Append(""" onClick=""BLOCKED SCRIPTpageTracker._trackPageview('/publicidad/")
strPubli.Append(key)
strPubli.Append("');""")
strPubli.Append(">" & vbCrLf)
strPubli.Append("<img src=""")
strPubli.Append(imagen)
strPubli.Append(""" border=""0""")
strPubli.Append("alt=""")
strPubli.Append(alt)
strPubli.Append("""/>" & vbCrLf)
strPubli.Append("</a>" & vbCrLf)
Return strPubli.ToString
End Function
{nota: seria conveniente eliminar el atributo border="0" y asignarlo por estilo CSS, pero bueno.. lo hago la semana entrante}
Enlaces
"Porque se visualiza diferente en IE7, que en IE6? Como será el IE8?"... son variadas las preguntas de esta naturaleza, y la respuesta son los estándares a los cuales "se desajusta" cada navegador, incluso el de la misma familia como lo son IEx, la respuesta bendita es realizar algunos css hack, pero como nos estamos cansando de este tipo de soluciones, ya era hora de que pongan todos de acuerdo.
El tema de los navegadores "y la parte estetica" ya es un tema que venimos accarreando desde que existieron dos browser de dos empresas diferentes. Pero porque esto es así es porque no se ponen de acuerdo y también la manera de interpretar "el estándar", que no es mas que simples guidelines (en este caso de W3C) cada versión nueva los browsers se aproximan (casi casi) pero siempre hay diferencias y es por eso POR COMO INTERPRENTAN EL HTML, CSS, DATOS, XML la pagina a mostrar.
Aquí una lista de los otros "problemas"
http://www.positioniseverything.net/ie-primer.html
- On Having Layout
- How To Attack An IE/Win Bug
- The Box Model Problem
- The Float Model Problem
- Float: The Bugs (The IE float model)
- The IE Three Pixel Text Jog
- The IE Expanding Boxes Problem
Existen "herramientas o tips" para contrarrestar esto, se las suele denominar "CSS HACK" (puedes googlear un poco..)
Un herramienta que nos provee IE, el seleccionador de versión mediante CSS condicionales
Por ejemplo:
<!--[if IE 6]>
Special instructions for IE 6 here
<![endif]-->
y por ejemplo lo del "hack"
http://www.positioniseverything.net/articles/ie7-dehacker.html
Probar navegadores, prueba ACID2
Casos de prueba famoso para este tipo de problemas tenemos el Acid2, que no es mas que un simple "test"/"caso de prueba" (investigando la prueba por dentro), implementando estándares HTML y CSS 2.0.
Es simple pero hasta hace mes no lo pasaba ni Firefox ni IE, recién en diciembre de 2007 lo pasaron ambos navegadores (con sus versiones FF3.0 y IE8)
- Internet Explorer 8 and Acid2: A Milestone
- Video: IE 8: On the Path to Web Standards Compliance - ACID 2 Test Pass Complete
NOTA ADJUNTA: Una acotación de los nombres que se manipulaban para la próxima versión
- IE 7+1
- IE VIII
- IE 1000 (think binary)
- IE Eight!
- iIE (jaa! me mato la iIE, creo que lo despidieron al que pronuncio esto)
- IE for Web 2.0 (Service Pack 2)
- IE Desktop Online Web Browser Live Professional Ultimate Edition for the Internet (the marketing team really pushed for this one ;-)
- Ie2.079 (we might still use this for the Math Major Edition)
El hola mundo de ACID2 de esta prueba es así:
Pero en los navegadores se visualiza de esta manera:
en IE6
en IE7
en FF 2.0
en la wikipedia teniamos los resultados
Enlaces
Cuando asignamos en el Gridview un comando de eliminación para que se encargue "automáticamente" de conversar con el proveedor de datos y enviarle el comando de Delete (o disparar el evento correcto) en ASP.NET agregamos una columna del tipo comando...
Al agregarlo nos queda algo así:
<asp:CommandField ShowDeleteButton="True" DeleteText="Eliminar 0"/>
Podemos modificarlo al tipo de "botón", sea enlace, imagen o "botón"
la pregunta es...
¿Como agregar un evento de JS para que confirme la eliminación?
El famoso:
Bueno si queremos seguir con la columna del tipo CommandField, tendremos que hacer algo incomodo para el programador... contar en que columna esta exactamente para poder ubicar este control, porque no podemos realizar una búsqueda con FindControl ya que no sabemos ni siquiera un ID (identificador), pero también tenemos otras soluciones.
OPCION 1: Utilizando CommandField
Con la columna que nos proporciona el wizard tedremos que ir al codebehind y encontrar el control que renderiza.
<asp:CommandField ShowDeleteButton="True" DeleteText="Eliminar 0"/>
Si sabemos que esta en la 7 columna (y como todo en .NET empieza de 0), y que solamente tenemos este control tendríamos que capturarlo
Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
Select Case e.Row.RowType
Case DataControlRowType.DataRow
Dim ctrlEliminar As LinkButton = CType(e.Row.Cells(6).Controls(0), LinkButton)
ctrlEliminar.OnClientClick = "return confirm('¿Esta seguro de eliminar este registro?');"
End Select
End Sub
y como sabiamos que era un LinkButton??, bueno porque es por defecto a lo que renderiza el CommandField, si queremos ser mas específicos tendríamos que colocar el tipo expresamente
<asp:CommandField ShowDeleteButton="True" DeleteText="Eliminar 0" ButtonType="Link"/>
Y si no me creen, pueden:
Dim ctrl As WebControl = CType(e.Row.Cells(6).Controls(0), WebControl)
ctrl.Attributes.Add("tipoControl", ctrl.GetType.ToString)
Podremos ver el el codigo renderizado el siguiente atributo "tipoControl":
<a tipoControl="System.Web.UI.WebControls.DataControlLinkButton"
href="BLOCKED SCRIPT__doPostBack('ctl00$contenidoCentral$GridView1','Delete$0')">Eliminar 1</a>
Particularmente colocar esta búsqueda "exacta" con numero de celda y posición del control dentro de la misma no es del todo "ortodoxa", ya que a la hora de modificar.. esto hay que "tocar aquí y allí", para eso la siguiente opción es mas "elegante" (y mucho mas fácil).
OPCION 2: Utilizando TemplateField con el control que queremos
Cuando quiero implementar algo similar utilizo una columna template... y allí podemos insertar un Button o un LinkButton que le asignas un comando... especial en el Gridview (y en la mayoría de los controles que se enlazan a datos) que es el comando delete, simplemente agregándole esta propiedad CommandName="Delete".
Es decir el Gridview disparará/provocará automáticamente los eventos RowDeleting y RowDeleted
<asp:TemplateField HeaderText="Ejemplo Eliminar">
<ItemTemplate>
<asp:Button ID="btnDelete" Text="Eliminar 1" runat="server"
OnClientClick="return confirm('¿Esta seguro de eliminar este registro?');"
CommandName="Delete" />
</ItemTemplate>
</asp:TemplateField>
y si queremos con LinkButton (idem):
<asp:LinkButton ID="linkEliminar" runat="server"
OnClientClick="return confirm('¿Esta seguro de eliminar este registro?');"
CommandName="Delete">Eliminar 2</asp:LinkButton>
(...)El control GridView también provoca otros eventos especializados al hacer click en ciertos botones (botones cuya propiedad CommandName presenta valores como "Delete", "Update" y "Page"). Al utilizar uno de estos botones, se debería considerar la posibilidad de controlar uno de los eventos especializados proporcionados por el control (como RowDeleted o RowDeleting).(...)
Enlaces: