jquery $(«#form»).submit() не вызывается

#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() также будет работать.