Первый код (рабочий код) ссылается на элемент по id: функция jQuery $
по сути является заменой document.getElementById
.
Во втором коде, когда вы пытаетесь сослаться на элемент, используя this
, область действия такова, что this
, скорее всего, будет ссылаться на объект запроса или window
. Решение, если вы хотите использовать объект this
с желаемой областью действия, это использовать метод proxy
для привязки функции-обработчика или захватить целевой элемент как переменную для использования в замыкании.
Из двух методов, использование proxy
наименее вероятно, приведет к циклической ссылке. Код, который вы здесь привели, безопасен, но вам действительно нужно следить за собой, когда вы используете ссылки на элементы в замыканиях, если целевой элемент будет удален из DOM в какой-то момент - тогда вы потенциально можете столкнуться с ситуацией, когда сборщик мусора в браузере не может освободить ресурсы, связанные с элементом, потому что замыкание удерживает открытым указатель ссылки.
Все, что proxy
делает, это создает замыкание с указанной областью, см. Документы здесь .
Для получения дополнительной информации по области, проверьте этот документ MDC и этот "шпаргалку" области охвата MDC
Закрытие:
$('#FonykerUsernameRegister').blur(function(){
var target = $(this);
if($(this).val().length > 2) {
$.ajax({
url: '<?php echo $html->url('/fonykers/validate_username',true); ?>' + '/' + $(this).val(),
dataType: 'json',
type: 'POST',
success: function(response) {
if(!response.ok) {
target.addClass('error');
error.html(response.msg);
error.fadeIn();
} else {
if(target.is('.error')) {
target.removeClass('error');
}
target.addClass('ok');
}
},
error:function (xhr, ajaxOptions, thrownError){
alert(xhr.statusText);
alert(thrownError);
alert(target);
}
});
} else {
error.html('Username must have at least 3 characters');
error.fadeIn();
$(this).addClass('error');
}
});
Proxy
$('#FonykerUsernameRegister').blur(function(){
if($(this).val().length > 2) {
$.ajax({
url: '<?php echo $html->url('/fonykers/validate_username',true); ?>' + '/' + $(this).val(),
dataType: 'json',
type: 'POST',
success: $.proxy(function(response) {
if(!response.ok) {
$(this).addClass('error');
error.html(response.msg);
error.fadeIn();
} else {
if($(this).is('.error')) {
this.removeClass('error');
}
$(this).addClass('ok');
}
}, this),
error:$.proxy(function (xhr, ajaxOptions, thrownError){
alert(xhr.statusText);
alert(thrownError);
alert(this);
}, this)
});
} else {
error.html('Username must have at least 3 characters');
error.fadeIn();
$(this).addClass('error');
}
});