2010-06-04 3 views
2
var objs = new Array(); 

function Foo(a) { 
    this.a = a 
    $("#test").append($("<button></button>").html("click").click(this.bar)); 
} 

Foo.prototype.bar = function() { 
    alert(this.a); 
} 

$(document).ready(function() { 
    for (var i = 0; i < 5; i++) { 
     objs.push(new Foo(i)); 
    } 
}); 

можно ли сделать так, чтобы при нажатии на кнопку,вызов функции события jquery с oop?

он возвращает соответствующее значение foo.a (от Foo OBJ, создавшего кнопки)?

+0

пожалуйста, посетите http://stackoverflow.com/faq Добро пожаловать на SO ... – Reigel

ответ

3

ответ @Khnle «s близко, но с таким подходом вам нужна анонимная функция, чтобы использовать self ссылки:

function Foo(a) { 
    this.a = a; 
    var self = this; 
    $("#test").append($("<button></button>").html("click").click(function() { 
    self.bar(); // correct `this` value inside `bar` 
    })); 
} 

Вы можете также использовать метод $.proxy, чтобы сохранить контекст объекта:

function Foo(a) { 
    this.a = a 
    $("#test").append($("<button></button>") 
      .html("click") 
      .click($.proxy(this.bar, this))); 
} 

Проверьте приведенный выше пример here.

1

Внутри вашего обработчика ссылок это больше не относится к объекту Foo, но элемент, в котором происходит клик, который является элементом кнопки в этом случае. Таким образом, один из способов исправить это выглядят следующим образом:

function Foo(a) { 
    this.a = a; 
    var self = this; 
    $("#test").append($("<button></button>").html("click").click(self.bar)); 
} 
+0

пытался, но не работает .. alert() в Foo.bar только даст мне «undefined», где он должен показать Foo.a число создателя кнопки obj – andrew

+0

Это не работает, потому что метод '.click' получает только ссылку на 'self.bar' в качестве аргумента, и он будет выполнен с использованием значения' this', указывающего на элемент что вызвало событие. – CMS

0

Вот не более JQuery стилей (никаких глобальных OBJS или Foos)

(function ($) { 

     $.fn.aghragbumgh = function (settings) { 
      var config = { 'a': 0 }; 

      if (settings) $.extend(config, settings); 

      var bar = function() { 
       alert(config.a); 
      } 

      this.each(function() { 
       $(this).append($("<button></button>").html("click").click(bar)); 
      }); 

      return this; 

     }; 

    })(jQuery); 

    $(document).ready(function() { 
     for (var i = 0; i < 5; i++) { 
      $('#test').aghragbumgh({ 'a': i }); 
     }; 
    });  

Html:

<div id="test"></div> 
Смежные вопросы