#php #jquery #recaptcha
#php #jquery #recaptcha
Вопрос:
У меня есть форма на странице, которая требует ввода captcha, если у пользователя установлен заблокированный атрибут в базе данных.
$("#expressform").submit(function() {
if($("#op").val() == "")
return false;
if($("#tagbar").val() == "")
return false;
$.post("getallowed.php", function(data) {
if(data == "true")
submitNormal();
else if(data == "false"){
displayCaptcha();
}
});
return false;
});
Если пользователь не разрешен, вызывается функция displayCaptcha вместо простой отправки формы.
function displayCaptcha(){
$.post("expresscaptcha.php", function(data) {
var string = data;
$("#expressformdiv").html(string);
Recaptcha.create("xxxxxxxxxxx", "captcha",
{
theme: "red",
callback: Recaptcha.focus_response_field
}
);
});
}
Эта функция отправляет сообщения в php-скрипт, который возвращает новый тип формы, который возвращает html для новой формы с идентификатором expressformcaptcha . Вот скрипт php.
<?php
echo <<<_END
<form id="expressformcaptcha">
//other form elements
<div id="captchadiv"><div id="captcha"></div></div>
</form>
_END;
?>
Все это работает нормально, отображается капча и т. Д. Однако предупреждение в следующем никогда не вызывается. Почему?
$("#expressformcaptcha").submit(function() {
alert("FORM SUBMITTED");
});
Имеет ли это какое-то отношение к наличию captcha, которая подключается к jquery? При отправке формы вместо предупреждения страница просто обновляется.
Ответ №1:
Вам нужно использовать live или delegate, expressformcaptcha
которые будут введены в DOM позже.
$("#expressformcaptcha").live('submit', function() {
alert("FORM SUBMITTED");
});
Комментарии:
1. Сработало! Спасибо! Если я могу спросить, почему я должен использовать live?
2. Это потому, что во время привязки события этот элемент отсутствует в DOM. Пожалуйста, отметьте как принято, когда у вас будет такая возможность, спасибо!
3. Вам не нужно использовать live; он упомянул делегирование в качестве другого варианта! В некоторых сценариях это не имеет большого значения, но в целом . delegate() НАМНОГО лучше (лучше обрабатывает распространение событий, работает лучше из-за прослушивания меньшего количества элементов); Я бы привык использовать . делегировать () в ситуациях, когда .live() также будет работать.