Jump to content
kriskastro

Adicionar action de URL em formulário Ajax com Javascript

Recommended Posts

Oi, pessoal. Preciso de uma ajuda de vocês. 

Tenho esse código de formulário de contato em um dos sites que gerencio e preciso colocar um redirecionamento de URL ao submeter o envio do formulário com sucesso. Atualmente ele só exibe "Mensagem enviada com sucesso!". Já tentei injetar essa função direto pelo javascript, porém as tentativas que fiz foram todas sem sucesso. Podem me ajudar com isso?

 

A ideia seria enviar as pessoas para uma página de resposta que já desenvolvi.

<form class="avia_ajax_form av-form-labels-visible avia-builder-el-123 el_after_av_hr avia-builder-el-last av-custom-form-color av-light-form" method="post" name="formhouse">
<fieldset>
<p id="element_avia_1_1" class=" first_form form_element form_element_third"><label for="avia_1_1">Nome <abbr class="required" title="required">*</abbr></label>
<input id="avia_1_1" class="text_input is_empty" name="nome" type="text" value="" /></p>
<p id="element_avia_2_1" class=" form_element form_element_third"><label for="avia_2_1">E-Mail <abbr class="required" title="required">*</abbr></label>
<input id="avia_2_1" class="text_input is_empty" name="email" type="text" value="" /></p>
<p id="element_avia_3_1" class=" form_element form_element_third"><label for="avia_3_1">Telefone <abbr class="required" title="required">*</abbr></label>
<input id="avia_3_1" class="text_input is_phone" name="telefone" type="text" value="" /></p>
<p id="element_avia_4_1" class=" first_form form_element form_fullwidth av-last-visible-form-element"><label class="textare_label hidden textare_label_avia_4_1" for="avia_4_1">Mensagem <abbr class="required" title="required">*</abbr></label>
<textarea id="avia_4_1" class="text_area is_empty" cols="40" name="mensagem" rows="7"></textarea></p>
<p class="hidden"><input id="avia_5_1" class="hidden " name="avia_5_1" type="text" value="" /></p>

<center id="msgErroHouse" style="color: red; display: none;">Erro ao enviar a mensagem, preencha todos os campos para continuar</center>&nbsp;

<center id="msgShowHouse" style="display: none;">Mensagem enviada com sucesso!</center>
<p class="form_element "><input name="avia_generated_form1" type="hidden" value="1" />
<input id="clica-botao-house" class="button" type="button" value="Enviar" /></p>
</fieldset>
</form>

<script language="javascript">

function chama(){
    var ret = hc_envia_mensagem(2923, document.formhouse.nome.value, document.formhouse.email.value, '', document.formhouse.telefone.value, document.formhouse.mensagem.value);

    if(document.formhouse.email.value.trim() != '' && document.formhouse.nome.value.trim() != ''){
        jQuery('#msgErroHouse').hide();
        jQuery('#msgShowHouse').show();
        document.formhouse.nome.value = ''; 
        document.formhouse.email.value = ''; 
        document.formhouse.ddd.value = '';
        document.formhouse.telefone.value = ''; 
        document.formhouse.mensagem.value = '';
    }else{
        jQuery('#msgShowHouse').hide();
        jQuery('#msgErroHouse').show();
    }
    
}

setTimeout(function(){
    jQuery('#clica-botao-house').on('click', function(){chama ()});
    jQuery('[data-avia-form-id]').hide();   
    
},100)

</script>

 

Share this post


Link to post
Share on other sites

@kriskastro Bom amigo não deu para entender seu código ele está meio bagunçado.

 

Algo muito estralho, é que você utilizar setTimeout para inserir o evento de click no botão. Se você quer espera a página carregar para inserir esses eventos e evitar erros, você pode utilizar o evento onload ou o método Ready Event Jquery.

 

Exemplo: 

window.omload = function()
{
	jQuery('#clica-botao-house').on('click', function(){chama ()});
	jQuery('[data-avia-form-id]').hide(); 
}

/* Método Jquery */

$(document).ready(function(){
	jQuery('#clica-botao-house').on('click', function(){chama ()});
	jQuery('[data-avia-form-id]').hide(); 
});

/* Método ainda mais curto Jquery */

$(function(){
	jQuery('#clica-botao-house').on('click', function(){chama ()});
	jQuery('[data-avia-form-id]').hide(); 
});

 

Para adicionar um código de redirecionamento caso ocorra uma requisição bem sucedida, eu precisos saber aonde acontece a requisição e como funciona o retorno dela. Você passa os dados do formulário para uma função chamada hc_envia_mensagemm e depois salva o retorno dela em uma variável, porem você não utiliza o retorno da função nem mesmo verifica o retorno.

 

Vou deixa um exemplo do formulário com algumas modificações que eu fiz, com ele você pode modifica e adiciona o redirecionamento que você deseja.

 

        <div>
            <form onsubmit="return false;" class="avia_ajax_form av-form-labels-visible avia-builder-el-123 el_after_av_hr avia-builder-el-last av-custom-form-color av-light-form" method="post" name="formhouse">
                <fieldset>
                    <p id="element_avia_1_1" class=" first_form form_element form_element_third">
                        <label for="avia_1_1">Nome <abbr class="required" title="required">*</abbr></label>
                        <input id="avia_1_1" class="text_input is_empty" name="nome" type="text" value="" placeholder="Nome" required>
                    </p>
                    <p id="element_avia_2_1" class=" form_element form_element_third">
                        <label for="avia_2_1">E-Mail <abbr class="required" title="required">*</abbr></label>
                        <input id="avia_2_1" class="text_input is_empty" name="email" type="text" value="" placeholder="E-mail" required>
                    </p>
                    <p id="element_avia_3_1" class=" form_element form_element_third">
                        <label for="avia_3_1">Telefone <abbr class="required" title="required">*</abbr></label>
                        <input id="avia_3_1" class="text_input is_phone" name="telefone" type="text" value="" placeholder="DDD + Telefone" required>
                    </p>
                    <p id="element_avia_4_1" class=" first_form form_element form_fullwidth av-last-visible-form-element">
                        <label class="textare_label hidden textare_label_avia_4_1" for="avia_4_1">Mensagem <abbr class="required" title="required">*</abbr></label><br>
                        <textarea id="avia_4_1" class="text_area is_empty" cols="40" name="mensagem" rows="7" required></textarea>
                    </p>
                    <input id="avia_5_1" name="avia_5_1" type="hidden" value="">
                    <input name="avia_generated_form1" type="hidden" value="1">
                    <input id="clica-botao-house" class="button" type="submit" value="Enviar">
                </fieldset>
            </form>
        </div>
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
        <script>

            $(function(){
                
                $("[name=formhouse]").on("submit", function(event){
                    
                    let 
                        formulario = $(this),
                        dados = formulario.serializeArray();

                    /* Filtros */

                    /* Verificar Nome */
                    dados[0]["value"] = dados[0]["value"].trim();
                    if (dados[0]["value"] == "")
                    {
                        alert("O campo nome é obrigatório.");
                        return false;
                    }

                    /* Verificar e-mail */
                    dados[1]["value"] = dados[1]["value"].trim();
                    if (!validacaoEmail(dados[1]["value"]))
                    {
                        alert("E-mail invalido.");
                        return false;
                    }

                    /* Verificar Telefone */
                    dados[2]["value"] =  dados[2]["value"].replace(/[^0-9]/g, "");
                    if(!validatePhone( dados[2]["value"]))
                    {
                        alert("Numero de telefone é invalido.");
                        return false;
                    }

                    /* Verificar Messagem */
                    dados[3]["value"] = dados[3]["value"].trim();
                    if (dados[3]["value"] == "")
                    {
                        alert("O campo mensagem está em branco.");
                        return false;
                    }

                    /* Ajax */

                    $.ajax({
                        url : "URL",
                        method  : "POST",
                        data : dados,
                        success : function(){
                            window.location.href = "URL DE SUCESSO";
                        },
                        error : function(){
                            alert("Ocorreu um erro. Tente novamente mais tarde.");
                        }
                    });

                    event.preventDefault();
                    return false;
                });

                $("[data-avia-form-id]").hide();  
            });


            /* Função de verificação de e-mail. Fonte: https://www.devmedia.com.br/validando-e-mail-em-inputs-html-com-javascript/26427*/
            function validacaoEmail(field)
            {
                usuario = field.substring(0, field.indexOf("@"));
                dominio = field.substring(field.indexOf("@") + 1, field.length);

                if  (
                        (usuario.length >= 1) &&
                        (dominio.length >= 3) && 
                        (usuario.search("@") == -1) && 
                        (dominio.search("@") == -1) &&
                        (usuario.search(" ") == -1) && 
                        (dominio.search(" ") == -1) &&
                        (dominio.search(".") != -1) &&      
                        (dominio.indexOf(".") >= 1)&& 
                        (dominio.lastIndexOf(".") < dominio.length - 1)
                    )
                {
                    return true;
                }

                return false;
            }

            /* Função de verificação de telefone. Fonte: https://pt.stackoverflow.com/questions/293950/valida%C3%A7%C3%A3o-campo-telefone */
            function validatePhone (phone)
            {
                var regex = new RegExp('^((1[1-9])|([2-9][0-9]))((3[0-9]{3}[0-9]{4})|(9[0-9]{3}[0-9]{5}))$'); 
                return regex.test(phone);
            }

        </script>

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By quimera
      O problema seria simples se o script da página permitisse o autopreenchimento usando javascript, masssssssssssss...
      O site em questão não permite que o campo seja preenchido dinamicamente ou seja usando script (ele identifica a digitação do teclado para impedir isso)
      Eles devem usar algo como: onkeypress ou onkeyup e acumular os valores digitados numa variável para dispor isso no post/get
      Por que nesse caso, se foi simplesmente colado ou preenchido via script não vai aceitar já que provavelmente é acumulativo e não verificado se o campo foi preenchido.
      Então como preencher dinamicamente o campo usando javascript nesse caso?
    • By AndersonWS
      Boa tarde, já tentei muitas formas mas não consigo retirar o atributo required.
      O resultado que eu preciso é, quando retiro o required de um (name="posicao") o outro fica com required e vice-versa e também um aparece e outro some.
       
      Segue o código HTML.
      <select name="posicao" class="form-control option_escolhida" style="display:none" id="2" required="" disabled> <option value="" selected>Selecione</option> <option value="1">Espaco</option> <option value="2">Cursos</option> </select> <select name="posicao" class="form-control option_escolhida" style="display:none" id="4" required="" disabled> <option value="" selected>Selecione</option> <option value="4">Políticas de privacidade</option> </select> <div class="sem_option"><code>Sem posição definida</code></div> <div class="ini_option"><code>Posição inicial</code></div> <div class="main_option" style="display:none"> <input name="apelido" class="form-control apelido" placeholder="Nome do grupo" type="text" required="" disabled> </div> Segue o código javascrpt:
      $('.select_escolhida').on({change: listChildren}).trigger('change'); function listChildren() { if ( $(this).val() != '' ) { children = $('option').val(); $(".ini_option").show(); $(".option_escolhida").hide(); $(".option_escolhida").attr("disabled", true); $("#" + $(this).val() ).show(); $("#" + $(this).val() ).removeAttr("disabled"); $(".sem_option").hide(); if( ($(this).val() == '1')||($(this).val() == '3') ){ $(".main_option").show(); $(".apelido").removeAttr("disabled"); } else { $(".main_option").hide(); $(".apelido").attr("disabled", true); $(".ini_option").hide(); } } else { $(".sem_option").show(); $(".ini_option").hide(); $(".apelido").hide(); } }  
    • By dmelo
      Eu tenho um script   $('.btn').click();   mas ele só funciona se eu deixar o mouse em cima do elemento.
      Como fazer pra ele funcionar ignorando a posião do mouse?
      Agradeço muito quem puder me ajudar pois já procurei em vários fóruns mas não achei a solução.
    • By mamotinho
      Olá, estou com problemas, minha data está atualizando porém eu clico em um produto ele exibe o tempo sem atualizar . quando eu mudo de produto ele mostra os dois valores exemplo
      Produto 1: tem duraçao de: 1 dia e 13:023 PM
      Produto 2: tem duraçao de: 0 dia e 23:023 PM

      Quando eu clico no produto 1 ele exibe normalmente, porém quando mudo para o produto 2 ele fica atualizando o valor do dia do produto 1 e do produto 2 sempre mudando.
      segue abaixo como está o codigo

      JavaSCRIPT
       
      function anooo(mes,dia,h,m){ var mess = mes; var dias = dia; var hss = h; var mss = m; // Set the date we're counting down to var countDownDate = new Date(""+mess+" "+dias+", 2020 "+hss+":"+mss+":00").getTime(); // Update the count down every 1 second var x = setInterval(function() { // Get today's date and time var now = new Date().getTime(); // Find the distance between now and the count down date var distance = countDownDate - now; // Time calculations for days, hours, minutes and seconds var dayss = Math.floor(distance / (1000 * 60 * 60 * 24)); var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); var seconds = Math.floor((distance % (1000 * 60)) / 1000); document.getElementById("days").innerHTML = dayss; document.getElementById("hrs").innerHTML = hours; document.getElementById("minus").innerHTML = minutes; document.getElementById("secs").innerHTML = seconds; this.remove(countDownDate); // If the count down is over, write some text if (distance < 0) { clearInterval(x); } }, 1000); } AQUI É O CHAMADO:
       
      <? if($result->Discount>=1){ $Month = date('M', strtotime($result->DateDiscount)); $Days = date('d', strtotime($result->DateDiscount)); $Hours = date('H', strtotime($result->DateDiscount)); $Minutes = date('i', strtotime($result->DateDiscount)); echo "<script>anooo('".$Month."','".$Days."','".$Hours."','".$Minutes."')</script>"; //echo "<script>alert('".$Month."')</script>"; ?> <ul class="time_sell remain_time"> <li> <dl> <dt class="blind">남은시간</dt> <dd> <span class='n_date day' id='days'></span> <span class='date'>일</span> <span class='n_time hour' id='hrs'></span> <span class='n_time minute' id='minus'></span> <span class='n_time second' id='secs'></span> <div id="countdown"></div> </dd> </dl> </li> </ul> <? } ?> eu já tentei de tudo mais sempre que mudo de produto ele exibe a data dos produtos anteriores em loop. a cada atualização do setInterval
    • By WagnerFilho
      Olá,
      Eu escrevi um exemplo de trabalho de um problema real que estou tentando resolver
      Criei um objeto simulando o retorno json que recebo do banco de dados.
       
      Eu preciso:
      Listar contratos e lotes de contratos Ao entrar na função, marcar o último `lote` do `contrato` como selecionado no Dropdown List Ao entrar na função, exibir as faturas `lote` e `contrato` selecionado no elemento `ul-invoices` Carregar e exibir as respectivas `faturas` ao alterar o `lote`  
      Problemas:
      Não consigo listar as `faturas` do último `lote` do `contrato selecionado` ao carregar a função. Não consigo listar as `faturas` ao `alterar` o `lote` do `contrato`  
      Observação:
      Ao entrar na página, já tenho as informações do contrato selecionado; no caso do exemplo, deixei o contrato com o ID 1. No exemplo estou usando a classe `in-attendance` para definir o contrato selecionado Estou usando `Revealing Pattern` e quero manter este padrão  
      Tradução
      contracts = contratos batches = lotes invoices = faturas  
      Exemplo
      <html> <label id="contracts"></label> <ul id="ul-invoices"></ul> <pre></pre> <script> let lblContract = document.querySelector('#contracts'); let UlInvoices = document.querySelector('#ul-invoices'); let contractInAttendance = 1; const objectContract = { id: 1, nome: 'wagner', contracts: [{ id: 1, contract: '123456', batches: [ { id: 1, contract_id: 1, batch: '1', invoices: [ { value: 10, batch_id: 1, }] }, { id: 2, contract_id: 1, batch: '2', invoices: [{ value: 10, batch_id: 2, }] }] }, { id: 2, contract: '246789', batches: [ { id: 3, contract_id: 2, batch: '1', invoices: [ { value: 20, batch_id: 3, }] }] }] } const revelling = (function() { function privateInit() { const contracts = objectContract.contracts; let contractFilteredById = contracts.filter(contract => contract.id === contractInAttendance); for (const contract of contracts) { const selectedContract = contract.id === contractFilteredById[0].id ? 'in-attendance' : ''; let htmlForBatchsOptions = contract.batches.map(batch => `<option value=${batch.id}>${batch.batch}</option>`).join(''); lblContract.innerHTML += `<div class="contract-${selectedContract}" style="display: flex;"> <div id="contract-${contract.contract}" data-contract="${contract.id}" class="loren"> <span>${contract.contract}</span> </div> <div class="ipsulum" style="margin-left: 5px;"> <select class="sel-batch"> ${htmlForBatchsOptions} </select> </div> </div>`; const batchOption = lblContract.querySelector('select.sel-batch'); batchOption.addEventListener('change', getInvoices); //batchOption.value = 2; } } function getInvoices() { const batchValue = event.target.value console.log(batchValue); //console.log(this.value); } return { init: privateInit() } })(); revelling.init; </script> </html>  
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.