Как заполнить $ .get () при отправке формы с использованием jQuery - PullRequest
0 голосов
/ 12 июля 2010

Я использую стороннюю корзину для покупок, которая отправляет форму регистрации в сценарий .cgi.

Я хочу отправить информацию из этой формы мне и клиенту через jQuery $ .get ()вызов функции.

$ .get вызывает сценарий registration.mail.php.

Проблема заключается в том, что отправка формы, по-видимому, отменяет вызов ajax до завершения вызова ajax.

Я могу подумать о некоторых не элегантных решениях, и я решил, потому что я собираюсь путешествовать, чтобы использовать счетчик и заставить пользователя дважды нажать «Зарегистрироваться».Это решение, очевидно, ранит мою душу.

Вот Javascript, который находится в нижнем колонтитуле:

<script type="text/javascript">
var getsuccess = false;
$(document).ready(function() {

    $('form#registerWholesale').bind('submit', function() {

        $email = $('#email').val();
        $username = $('#contactname').val();
        $company = $('#company').val();
        $phone = $('#billphone1').val();

        $message = "A new customer has registered at the wholesale website. \n ";
        $message += "They have the username of: " + $username + ". \n";
        $message += "Their company is: " + $company + ". \n";
        $message += "Their email is: " + $email + ". \n";
        $message += "Their phone is: " + $phone + ". \n";
        $message += "Please help them ASAP. You can access the back end of the site at: http://location of website admin backend";

      $.get('/mail.php', {from: 'orders@OurCompany.com', message: $message, email: $email, username: $username, company: $company}, function(data, textStatus, xhr) {
         getsuccess = true;
      });

      if (getsuccess) {
        return true;
      }else{
        return false;
      }
    });


</script>

А вот код registration.mail.php.

<?php

//Vendor email (to us)
$to = "ouremail@OurCompany.com";
$subject = "URGENT--New Registration--URGENT";
$message = htmlentities($_GET['message'], ENT_QUOTES, 'UTF-8');
//$message = $_GET['message'];
$from = htmlentities($_GET['from'], ENT_QUOTES, 'UTF-8');
//$from = trim($_GET['from']);
$headers = "From: $from";
mail($to,$subject,$message,$headers);
//echo "Mail Sent.";



//Customer email (to them)
$to_cust = htmlentities($_GET['email'], ENT_QUOTES, 'UTF-8');
$subject_cust = 'OurCompany Online Wholesale Account Request Recieved';
$message_cust = "Thank you for you interest in OurCompany's new wholesale website. \n\n
We have received your request to create an account.   In order to obtain a wholesale account, a OurCompany representative must verify your account information and details by telephone.  OurCompany will contact you within 1 business day at the telephone number that we have on file, or feel free to give us a call at 1-xxx-xxx-xxxx anytime if you would like a more rapid approval.  \n\n

Thanks Again ~ OurCompany";

$headers_cust = "From: orders@OurCompany.com";
mail($to_cust,$subject_cust,$message_cust,$headers_cust)
?> 

Спасибо!

Ответы [ 5 ]

2 голосов
/ 12 июля 2010

Ваш обработчик Ajax get устанавливает асинхронный обратный вызов.Другими словами, этот фрагмент кода:

  $.get('/mail.php', {from: 'orders@OurCompany.com', message: $message, email: $email, username: $username, company: $company}, function(data, textStatus, xhr) {
     getsuccess = true; <---- THIS
  });

Строка «ЭТО» вызывается только тогда, когда вызов Ajax возвращает результат.Поскольку вы отправляете реальное электронное письмо, это может занять много времени.

Итак, к тому времени, когда вы запустите это:

  if (getsuccess) {
    return true;
  }else{
    return false;
  }

Вызов Ajax никогда не завершался, и он всегда возвращаетсяfalse.

Вы должны просто решить, хотите ли вы отправить форму с помощью Ajax или нет, и использовать только один из них.Если вы хотите выполнить Ajax, обработчик события Submit всегда должен возвращать False.

EDIT: я не осознавал, что отправка почты и отправка формы - это два разных действия и два отдельных вызова сервера.(Вы не показываете остальную часть своего приложения, но эту идею я получаю из других ответов.) Это плохой дизайн, который может привести к противоречивым результатам и плохим данным.Вам следует перестроить свое приложение так, чтобы обе эти вещи обрабатывались на стороне сервера в одном и том же месте, чтобы веб-приложение выполняло только один вызов, независимо от того, выполняется ли этот вызов с помощью Ajax или обычной отправки формы.

1 голос
/ 12 июля 2010

По крайней мере, вместо того, чтобы дважды щелкнуть по ним, почему бы вам не сделать успешный обратный вызов $ .get, чтобы отправить им форму снова?

$('form#registerWholesale').bind('submit', function() {
     if (getsuccess) {
        return true;
     } else {
        $email = $('#email').val();
        $username = $('#contactname').val();
        $company = $('#company').val();
        $phone = $('#billphone1').val();

        $message = "A new customer has registered at the wholesale website. \n ";
        $message += "They have the username of: " + $username + ". \n";
        $message += "Their company is: " + $company + ". \n";
        $message += "Their email is: " + $email + ". \n";
        $message += "Their phone is: " + $phone + ". \n";
        $message += "Please help them ASAP. You can access the back end of the site at: http://location of website admin backend";

      $.get('/mail.php', {from: 'orders@OurCompany.com', message: $message, email: $email, username: $username, company: $company}, function(data, textStatus, xhr) {
         getsuccess = true;
         $('form#registerWholesale').submit();
      });
      return false;
    }
});
1 голос
/ 12 июля 2010

Одним из решений является привязка события к нажатию кнопки, предотвращение действия по умолчанию для щелчка, чтобы форма не отправлялась, и, наконец, отправка формы в обратном вызове .get.

N.B. Как подсказывает Jaanus, вам действительно нужно посмотреть на дизайн приложения, отправить письмо и сохранить корзину в тот же вызов. Что произойдет, если письмо будет отправлено, тогда действие отправки формы завершится неудачно?

$(document).ready(function() {

    $('#yourSubmitButton').click( function(ev) {

        //prevent form submission
        ev.preventDefault();

        $email = $('#email').val();
        $username = $('#contactname').val();
        $company = $('#company').val();
        $phone = $('#billphone1').val();

        $message = "A new customer has registered at the wholesale website. \n ";
        $message += "They have the username of: " + $username + ". \n";
        $message += "Their company is: " + $company + ". \n";
        $message += "Their email is: " + $email + ". \n";
        $message += "Their phone is: " + $phone + ". \n";
        $message += "Please help them ASAP. You can access the back end of the site at: http://location of website admin backend";

        $.get('/mail.php', {from: 'orders@OurCompany.com', message: $message, email: $email, username: $username, company: $company}, function(data, textStatus, xhr) {

           //all is well, submit the form
           $('#yourForm').submit()

       });

    });
0 голосов
/ 12 июля 2010

Обратный вызов, который вы передаете $.get, будет оцениваться после запроса AJAX. Поскольку AJAX является асинхронным, ваш код продолжит вычислять в это время, а это означает, что ваше условие if с двумя операторами return всегда будет оценивать до вызова AJAX.

То, что вы хотите сделать, это для submit прослушивателя всегда , возвращающего false, а в обратном вызове AJAX вы условно запускаете $('form#registerWholesale').submit();

Конечно, здесь есть и дизайн: вы можете захотеть, чтобы отправка электронной почты и оптовая регистрация были атомарными. Если письмо отправлено, вы всегда хотите, чтобы то, что происходит в форме, также происходило, верно? В этом случае вы хотите переместить либо электронное письмо, отправляемое в форму обратной передачи, либо оптовую регистрацию в обратный вызов AJAX, так что все это обрабатывается за один шаг.

0 голосов
/ 12 июля 2010

Вы пытались поместить вызов ajax в функцию и перехватить onSubmit формы?

onsubmit="myajaxcallFunc(); return true;"

Это обычно используется, чтобы остановить отправку с возвратом false, но в этом случае она может делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...