Porque nadie me aviso? _trackVisit cambió a _trackPageview. Google Analytics y estadísticas de enlaces externos

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)

image

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

image

Y efectivamente era "cierto y verdadero" (como dice Les Luthiers) , no se encontraba este método

javascript: pageTracker._trackVisit(...

image

 

Parece que cuando cambiamos había que leer la implicancia de tal modificación, porque no te decían directamente sino aquí

image

(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

image 

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("javascript: 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=""javascript:pageTracker._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

 

IE8 y FF3.0, ACID2 compatible!

"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í:

image

Pero en los navegadores se visualiza de esta manera:

en IE6
image

en IE7

image

en FF 2.0

image

 

 

en la wikipedia teniamos los resultados

image

 

Enlaces

Gridview: Confirmación en el botón/enlace/imagen de eliminar

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…

image

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"

image

 
la pregunta es…

¿Como agregar un evento de JS para que confirme la eliminación?

El famoso:

image
 
Necesitamos asignarle un script del lado del cliente (es decir javascript), pero no tenemos disponible la propiedad OnClientScript que nos sirve para los botones

(lean este articulo Evitar el postback al pulsar un botón en ASP.NET – de José M. Aguilar)

 
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="javascript:__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: