2012-02-06 5 views
16

Я не совсем уверен, не использую ли я это в правильной области или что, но у меня есть сценарий, который в основном захватывает ссылку и вызывает увязку страницы, прежде чем перейти на связанную страницу. Однако, если ссылка представляет собой JavaScript onclick, скрипт не работает.jQuery: this.attr() не является функцией?

Вот мой код:

<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> 


Как вы можете видеть, что я пытаюсь сделать проверку, чтобы увидеть, если ссылка имеет OnClick атрибут, а затем вызвать функцию OnClick если он существует. Как я могу это достичь?

ответ

4

Хотя Diodeus правильно, что вам нужно обернуть this в коллекции JQuery перед использованием attr() (это метод коллекции JQuery, а не из HTMLElement), вы можете точно так же пропустить 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); 
    } 
}); 

Обратите внимание, что я использовал свойство (когда загружает HTML документа, атрибуты, как правило, предварительно в свойства, с on_______ атрибутов быть предварительно загружены в качестве методов. Кроме того, обратите внимание, что я использовал this.onclick.call(), а не eval(), установку правильного this для onclick и обеспечить доступ к объекту события в качестве аргумента.

+0

Awesome. Работает как шарм. Я понимаю, что call() wo uld быть более безопасным в использовании, чем eval(), также, правильно? – chaoskreator

55

Использование: $(this).attr вместо this.attr

Это заставляет его в контексте JQuery.

+1

Я бы подумал, что это сработает, однако, я получаю '$ (this) .attr (" onclick "). Val не является функцией' используя это. – chaoskreator

+0

В этом случае вам не нужен .val(). –

Смежные вопросы