2012-02-06 12 views
16

No estoy muy seguro de si no estoy usando esto en el ámbito correcto o qué, pero tengo un script que básicamente captura un enlace hace clic y hace que la página se desvanezca antes de ir a la página vinculada. Sin embargo, si el enlace es JavaScript onclick, la secuencia de comandos falla.jQuery: this.attr() ¿no es una función?

Aquí está mi código:

<script type="text/javascript"> 

    pageObj = { 
     init: function(){ 
      $("body").fadeTo("slow", 1); 
     }, 
     redirectPage: function(redirect){ 
      window.location = redirect; 
     }, 
     linkLoad: function(location){ 
      $("body").fadeOut(1000, this.redirectPage(location)); 
     } 
    }; 

    $(document).ready(function() { 
     pageObj.init(); 

     $("a").click(function(e){ 
      e.preventDefault(); 
      if (this.attr('onclick') !== undefined) { 
       eval(this.attr('onclick').val()); 
      } else { 
       var location = this.href; 
       pageObj.linkLoad(location); 
      } 
     }); 
    }); 

</script> 


Como se puede ver, yo estoy tratando de hacer una comprobación para ver si el enlace tiene la onclick atributo, y luego llamar a la función onclick si existiera. ¿Cómo puedo conseguir esto?

Respuesta

4

Mientras Diodeus es correcto que se necesita para envolver this en una colección de jQuery antes de usar attr() (es un método de una colección de jQuery, no de un HTMLElement), puede saltar tan bien attr().

$("a").click(function(e){ 
    var location; 
    e.preventDefault(); 
    if ($.isFunction(this.onclick)) { 
     this.onclick.call(this, e); 
    } else { 
     location = this.href; 
     pageObj.linkLoad(location); 
    } 
}); 

Nota que he utilizado la propiedad (cuando un montón de documentos HTML, atributos suelen ser precargados en propiedades, con on_______ atributos están precargados como métodos. También tenga en cuenta que he usado this.onclick.call() en lugar de eval(), el establecimiento de la correcta this de onclick métodos, y asegurando el acceso al objeto de evento como un argumento

+0

Impresionante. Funciona como un encanto. Entiendo que llame() wo ¿Debería ser más seguro de usar que eval(), también, correcto? – chaoskreator

55

Uso: $(this).attr en lugar de this.attr

Esto obliga a que en el contexto de jQuery.

+1

Hubiera pensado que esto también funcionaría, sin embargo, obtengo '$ (this) .attr (" onclick "). Val no es una función' usándolo. – chaoskreator

+0

No necesita .val() en este caso –