Jquery в реальном времени и прокси с контекстом

#jquery #proxy #live

#jquery #прокси #ЖИВЫЕ КОНЦЕРТЫ

Вопрос:

Я хотел бы установить контекст для функции, чтобы ограничить ее выполнение только ее внутренними элементами.

 $('#btn').live('click',function(){
    $.proxy(test(),$(this).closest('div'));
});

function test(){
     //doSomething
}
  

но контекст в функции test() — это не ближайший DIV, содержащий мою кнопку #btn, а вся страница.
Не могли бы вы мне помочь?

Ответ №1:

$.proxy возвращает функцию.

 var mytest = function(){
// do something with `this` bound to the jquery collection to be 
// created in the future sometime 
}
$('#btn').live('click',function(){
  // reassign mytest to a new function proxying the context through 
  // a relative jquery collection
  mytest = $.proxy(mytest,$(this).closest('div'));
});
  

Это немного странно и неуклюже, но это должно делать то, о чем вы думаете. Есть большая вероятность столкнуться с проблемами асинхронности, потому что прокси запускается по щелчку. Не зная специфики вашей проблемы, я не знаю, нужно ли вам использовать прокси.

Ответ №2:

Изменение test() на test , похоже, ничего не меняет, странно, что это не работает — но после прочтения комментариев на странице jQuery для .proxy — кажется, что он страдает от проблем и несоответствий. Я бы использовал что-то в этом роде:

HTML

 <div>hello</div>
  

jQuery

 function test()
{
  alert($(this).html()); // Will alert hello
}

$(document).ready(function() {
    test.call($('div').get(0)); // I use .get() so only the DOM object is passed.
                                // That makes it more consistent with how jQuery 
                               // passes objects to .each, etc.
})
  

Скрипка: http://jsfiddle.net/u8x22 /

Комментарии:

1. Объяснит ли даунвотер их причины? [Поощряя людей объяснять голоса, проголосовавшие против]( meta.stackexchange.com/questions/135 /… )

2. Downvoter, вероятно, не согласился (справедливо) с утверждением, что .proxy страдает от проблем и несоответствий. Лично у меня с этим проблем не было.