2015-08-18 3 views
1

Это то, что мне нужно, чтобы узнать какое-то время, и мне интересно, могут ли какие-либо эксперты javascript указать мне в правильном направлении.Передача переменных на анонимные функции

Многие библиотеки, которые я использовал, кажется, принимают указатели на функции в качестве аргументов, например, крючок для успеха, терпят неудачу, и т.д. Вот простой пример этого в приложении, я работаю над:

$('.clock-btn').each(function(){ 
$(this).click(function(){ 
    $.ajax(
     { 
      url:'punch.php?task_id=' + $(this).data('task-id'), 
      success: function() { 
       reverseCSS($(this)); 
      }, 
      error: function() { 
       window.alert("Clocking time to this project is not allowed."); 
      } 
     } 
    ); 
}); 

});

Функция reverseCSS() - функция, которая изменяет кнопку на анимацию и заменяет слова «clock-in/clock-out» в зависимости от того, что было ранее.

Однако я не могу получить доступ к переменной $ (этой) в вызове $.ajax. Это ожидаемое поведение для меня, как я знаю в этом примере, $(this) будет $.ajax object, а не элементом, который мне нужен из html.

Итак, что было бы лучшим способом получить доступ к элементу $(this)?

Большое спасибо за помощь.

+2

Добавить переменную перед вашим вызовом ajax: var my this = $ (this) и передать мифы для функции – Zaki

+0

Кстати, вы все же можете оптимизировать свой код, заменив двойное закрытие на сингл с помощью '$ ('. clock-btn'). click (function() ... . – albanx

ответ

4

Это то, что bind() функция делает:

$('.clock-btn').each(function(){ 
$(this).click(function(){ 
    $.ajax(
     { 
      url:'punch.php?task_id=' + $(this).data('task-id'), 
      success: function() { 
       reverseCSS($(this)); 
      }.bind(this) 
     } 
    ); 
}); 

он просто возвращает функцию, которая всегда работает в контексте вы даете ему, в этом случае контекст this

+0

Это должен быть правильный ответ. – Jan

+0

А, метод связывания! Я видел это в разных местах, но никогда не предпринимал усилий, чтобы больше узнать об этом. Спасибо огромное! – dmcmulle

+0

приветствуется, в ES6 это будет еще проще с помощью так называемых функций стрелок, см., Например, здесь https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions – smnbbrv

0
$('.clock-btn').each(function(){ 
    $(this).click(function(){ 
     var that = this; // save it to another variable 
     $.ajax({ 
      url:'punch.php?task_id=' + $(this).data('task-id'), 
      success: function() { 
       reverseCSS($(that)); 
      }, 
      error: function() { 
       window.alert("Clocking time to this project is not allowed."); 
      } 
     }); 
    }); 
}); 
+0

Полезный ответ. Благодарю. – dmcmulle

1

Что-то вдоль линии:

$(this).click(function() { 
    var $self = $(this); 

    $.ajax({ 
    url:'punch.php?task_id=' + $(this).data('task-id'), 
     success: function() { 
     reverseCSS($self); 
     }, 

     // ... 
+0

Это полезный ответ, и я, вероятно, должен был сказать, что я пытаюсь выяснить, как получить к нему доступ, не создавая временных переменных. Надеюсь, это поможет кому-то еще! – dmcmulle