jQuery — Почему всегда вызывается обратный вызов Ajax () с ошибкой?

#php #jquery #codeigniter

#php #jquery #codeigniter

Вопрос:

Я пытаюсь вернуть объект JSON подтверждения обратно в мою AJAX-функцию. По какой-то причине, несмотря на то, что сообщение выполнено успешно (200), функция обратного вызова с ошибкой всегда вызывается. Я записываю возвращаемый JSON в файл для дублирования, и он кажется правильным. Я не могу понять, почему это происходит. Кто-нибудь может предложить?

Действие контроллера PHP (CI):

 public function sendMail()
    {
        $senderName = trim($_POST['senderName']);
        $returnEmail = trim($_POST['returnEmail']);
        $message = trim($_POST['message']);


        if (valid_email($returnEmail))
        {
            send_email('email@email.com','Website Email From: '.$senderName, $message);
            $success = array('success'=>'Mail Sent');

            //Debugging to file
            $myFile = "testFile.txt";
            $fh = fopen($myFile, 'w') or die("can't open file");
            $stringData = json_encode($success);
            fwrite($fh, $stringData);
            fclose($fh);


            echo json_encode($success);
        }
        else
        {
            $errorMessage = array('error'=>'Invalid Email Address');
            echo json_encode($errorMessage);
        }
    }
  

}

JS:

 $.ajax({
                   type: "POST",
                   url: "http://domain.com/index.php/mail/sendmail",
                   data: {senderName: senderName, returnEmail: senderAddr, message: message },
                   dataType: "JSON",
                   success: function(msg){
                     console.log(msg);
                   },
                   error: function(data){
                        alert("Something went wrong"); // possible that JSON wasn't returned
                    }
                 });
  

Ответ №1:

Проблема заключалась в том, что я не использовал относительный URL для целевого объекта. Я полагаю, что проблема заключалась в междоменном написании сценариев. Я изменил свойство url на index.php/mail/sendmail и все хорошо.

 $.ajax({
               type: "POST",
               url: "index.php/mail/sendmail",
               data: {senderName: senderName, returnEmail: senderAddr, message: message },
               dataType: "JSON",
               success: function(msg){
                 console.log(msg);
               },
               error:function (xhr, ajaxOptions, thrownError){
                    var x = xhr;
                    var y = ajaxOptions;
                    var z = thrownError;
                }
             });
  

Ответ №2:

error Обратный вызов принимает до трех аргументов: объект XHR, строку ошибки и необязательный объект исключения. Примите также последние два, и они должны рассказать вам, что происходит.

Вы также можете захотеть использовать отладчик, такой как Firebug, Dragonfly или инструменты разработчика Chrome, чтобы проверить, так ли успешен запрос, как вы думаете.

Комментарии:

1. Я использую firebug .. и я знаю, что post работает, потому что в этом случае отправляется электронное письмо. Я посмотрю на объект XHR для подсказок. Спасибо

2. К сожалению.. объект XHR показывает только statusText = ошибка

3. Как насчет status , readyState responseText ? Вы также могли бы попробовать выполнить сам запрос с помощью Firebug и копии jQuery для разработки.

4. readyState = 0, status = 0, responseText = «» Не очень полезно, не так ли .. Я предполагал, что смогу ознакомиться с реализацией jQuery.. надеялся, что до этого не дойдет.

5. О, подождите, что Firebug сказал о запросе ajax? Получение электронного письма не обязательно означает, что ответ был правильным.