2015-03-25 5 views
1

У меня есть объект, где я создаю html и хочу привязать тег div к onclick, но, похоже, не может найти правильный способ сделать это.Как ссылаться на функцию объекта javascript из строки onclick

function person(obj){ 
    this.init(obj); 
} 

person.prototype = { 
    init: function(){ 
     var html = ''; 
     for(i = 0; i < obj.length; i++){ 
     html += '<div onclick="myFunction()">'+obj[i].name+'</div>'; 
     } 

     $(html).appendTo('.people'); 

     function: myFunction(){ 
      console.log('hello'); 
     } 
} 

Каков наилучший способ привязать myFunction() и заставить его работать? Я попытался вложить функцию в init(), и я попытался установить ее на том же уровне, что и функция init. Я понимаю, что div еще не в Доме, поэтому он не регистрируется, но я хотел бы найти лучший способ сделать это.

+0

'$ ($ html)' что это за селектор? – tymeJV

+0

К сожалению, это было $ (html) – bstras21

+0

Просто не используйте атрибуты onclick, используйте обработчики событий! Или, как вы, кажется, используете jQuery, http://api.jquery.com/click/ – Bergi

ответ

0

Если вы создаете элементы вместо HTML-кода, вы можете связать обработчик событий напрямую, вместо атрибута onclick, который требует, чтобы функция была глобальной. Связываясь непосредственно вы можете поместить функцию в любом месте, что связывание код может достигать даже локально внутри init функции:

function person(obj){ 
    this.init(obj); 
} 

person.prototype = { 
    init: function(obj){ // <- note the parameter 

    function myFunction(){ 
     // ... 
    } 

    $('.people').append(
     $.map(obj, function(o){ 
     return $('<div>').text(o.name).click(myFunction); 
     }) 
    ); 
    } 
} 
+0

Я попробую. Я попытался использовать обработчики кликов, но когда я создаю другой объект, он добавляет другой обработчик кликов. Вот почему, хотя лучше всего использовать onClick – bstras21

+0

@ bstras21: похоже, что вы добавили элемент, а затем попытались добавить обработчик события, используя селектор, чтобы найти элемент. Это также обнаружит все предыдущие элементы, которые вы добавили таким же образом, и добавьте к ним другой обработчик. Связывая обработчик события непосредственно с элементом, который вы привязываете только к этому элементу. – Guffa

0

Поскольку у вас есть JQuery, вы можете использовать его, чтобы связать обработчик .people элементов, которые будут срабатывать когда один из их потомков дивы щелкают:

$('.people').on('click', 'div', myFunction); 

вы все равно получите индивидуальный DIV в качестве цели события, но ограничить количество обработчиков на странице. Это также больше не зависит от наличия div на странице при привязке события; пока элемент people существует, когда вы связываетесь и остаетесь там, вы можете перетасовать детей, не переписывая события.

+0

Проблема в том, что при создании другого объекта он создает другой обработчик кликов, поэтому теперь, когда я нажимаю на него, он срабатывает дважды. – bstras21

+0

Да, вы хотите сделать это за пределами 'init', чтобы он не вызывался для каждого объекта. –

+0

В качестве альтернативы вы могли привязать только соответствующий' .people' при создании объекта вместо сканирования всего документа на каждом 'init'. Изменить: на самом деле, похоже, что существует, вероятно, один «.people», поэтому локальный поиск не решает проблему –

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