2016-05-24 3 views
3

Я видел несколько разных примеров доступа к $ (this) - это обратный вызов успеха ajax, но никто не дает мне ответа, который я хочу - все они получают доступ к $ (this) это) в функции ajax, я хочу передать $ (this) в отдельную функцию.

Так что, если есть 2 Textboxes, которые должны быть проверены

$("#tb1").focusout(function(){ 
    $.ajax({ 
     type:'POST', 
     url: 'validURL', 
     data: {various_parameters}, 
     contentType: 'application/json; charset=utf-8', 
     dataType:'json', 
     success: function(data){ 
      validInput(data, $(this)); 
     }, 
     error: error 
    }); 
} 

$("#tb2").focusout(function(){ 
    $.ajax({ 
     type:'POST', 
     url: 'validURL', 
     data: {various_parameters}, 
     contentType: 'application/json; charset=utf-8', 
     dataType:'json', 
     success: function(data){ 
      validInput(data, $(this)); 
     }, 
     error: error 
    }); 
} 

function validInput(response, obj){ 
    console.log(response.d); 
    console.log(obj.val()); 
}; 

Когда я запускаю код, я получаю правильное значение для response.d но ошибки: JQuery-1.11.1.min.js: 4 Uncaught TypeError: Невозможно прочитать свойство 'toLowerCase' неопределенного для obj.val().

Я что-то не так?

Спасибо за любую помощь. См .: Dos/Run

ответ

12

$(this) является относительно внутренней, наиболее функции, и в этом случае вам нужно присвоить $(this) переменной перед запросом AJAX, и использовать эту переменную в успехе вместо этого.

$("#tb1").focusout(function(){ 
    var elem = $(this); 
    $.ajax({ 
     type:'POST', 
     url: 'validURL', 
     data: {various_parameters}, 
     contentType: 'application/json; charset=utf-8', 
     dataType:'json', 
     success: function(data){ 
      validInput(data, elem); 
     }, 
     error: error 
    }); 
} 
+0

Спасибо за вашу помощь @Hazonko - это вопрос с $ (это) является «относительная» проблема только при использовании ajax или это когда-нибудь $ (this) передано? – SeeDosRun

+1

Если у вас есть вложенные функции, это будет относиться к самой внутренней функции – madalinivascu

4

Ну, это потому, что контекст элемента фокуса теряется при вызове ajax.

Вы можете установить context параметр в AJAX для ведения объекта DOM для установки контекста в Аякса контексте элемента:

$("#tb2").focusout(function(){ 
    $.ajax({ 
    type:'POST', 
    url: 'validURL', 
    context : this, 
    data: {various_parameters}, 
    contentType: 'application/json; charset=utf-8', 
    dataType:'json', 
    success: function(data){ 
     validInput(data, $(this)); 
    }, 
    error: error 
    }); 
}); 
2

Альтернативный способ вы можете добиться этого с помощью ссылки его в первую очередь.

$("#tb2").focusout(function(){ 
    var $this = $(this); 
    $.ajax({ 
     type:'POST', 
     url: 'validURL', 
     data: {various_parameters}, 
     contentType: 'application/json; charset=utf-8', 
     dataType:'json', 
     success: function(data){ 
      validInput(data, $this); 
     }, 
     error: error 
    }); 
} 
0

«это» ключевое слово в вашей функции успеха, это другой «это», который существует до вашего вызова Ajax, это другая "сфера.

Сделать новую переменным для начального «это», так что вы можете использовать его в обратном вызове, например, так:

$("#tb1").focusout(function(){ 
    var $this = $(this); 
    $.ajax({ 
     type:'POST', 
     url: 'validURL', 
     data: {various_parameters}, 
     contentType: 'application/json; charset=utf-8', 
     dataType:'json', 
     success: function(data){ 
      // Here we use the $this variable, initialised before the $.ajax call. 
      validInput(data, $this); 
     }, 
     error: error 
    }); 
} 
Смежные вопросы