2009-10-01 4 views
3

jQuery теперь позволяет использовать live для обработки пользовательских событий, что я использовал в своем последнем проекте и нашел очень удобным. Однако я столкнулся с ограничением/ошибкой, что я надеюсь, что кто-то сможет мне помочь.Могу ли я получить пригодные для использования данные в обработчике jQuery live для пользовательского события?

Когда вы вызываете событие, вы можете передать дополнительный массив данных тоже, как это:

$(this).trigger('custom', ['foo', 'bar' ]); 

Если вы используете только bind, вы можете абсолютно получить доступ к этим переменным. Однако, если вы используете живое, выясняется, что у вас нет доступа к данным , насколько я могу судить. Я ошибаюсь? Есть ли другой способ?

Вот некоторые демо-код для иллюстрации:

$().ready(function() { 

    $('button').click(function(){ 
     $('<li>Totally new one</li>').appendTo('ul'); 
    }); 

    $('li').bind('custom', function(e, data) { 
     // this one works fine for old elements, but not for new ones 
     $('#output1').text('Bind custom from #' + e.target.id + '; ' + data); 
    }).live('custom', function(e, data) { 
     // this one triggers for old and new elements, but data is useless 
     $('#output2').text('Live custom from #' + e.target.id + '; ' + data); 
    }).live('click', function(){ 
     $('div').text(''); 
     // just using click count to illustrate passing data in the trigger 
     var clicks = $(this).data('clicks'); 
     if(typeof clicks == 'undefined') clicks = 1; 
     $(this).trigger('custom', ['Times clicked: ' + clicks ]).data('clicks', clicks + 1); 
    }); 
}); 

И соответствующий HTML:

<button>Add</button> 
<ul> 
    <li id="one">First Item</li> 
    <li id="two">Second Item</li> 
    <li id="three">Third Item</li> 
</ul> 
<div id="output1">Result 1</div> 
<div id="output2">Result 2</div> 

ответ

2

Похоже, самый простой подход может быть использовать формат, описанный в последнем «альтернативный» пример: http://docs.jquery.com/Events/trigger#eventdata. В примере используется литерал объекта для указания объекта события, в котором вы можете создавать пользовательские свойства. Я также попробовал описанный выше подход безрезультатно, но альтернативный формат работает для меня. Таким образом, вместо вызова

$(this).trigger('custom', ['Times clicked: ' + clicks ]) 

попробовать

$(this).trigger({type:'custom', clicks: clicks}); 

и затем ссылаться на него в обработчик событий вашего "обычай" событие через:

"Times clicked: " + e.clicks; 

Надежда, что помогает!

+0

Это потрясающе, это работает как шарм. Большое спасибо! –

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

  • Нет связанных вопросов^_^