Запит на публікацію Ajax отримує лише після того, як веб-переглядач закрито та відкрито знову

Я працював з AJAX, jQuery та сесіями дуже довго. Але це перший раз, коли я зіткнувся з цією проблемою.

Я надсилаю звичайний запит на публікацію на іншу сторінку, і, як і мої старі коди, я використовую сеанси на цільовій сторінці, щоб перевірити, чи мій AJAX-запит був успішним.

За всі ті часи, які я це зробив, вона чудово працювала, за винятком випадків, коли існують явні помилки Javascript, які не дозволяють моєму AJAX продовжувати успішно.

Тепер трапляється так, що для того, щоб запит ajax був успішним, мені потрібно запустити його після того, як я закрию і знову відкрию браузер. Якщо я знову зробив це після того, як я відправив перший запит, він більше не пройде успішно, ще одна цікава річ. Я завжди отримую помилку, коли вмикаю відповідь на помилку для AJAX, що насправді є набридливим і дратує, оскільки я просто не можу визначити першопричину цієї проблеми.

Це проблема з сервером або проблема з кодом або якесь правило, про яке я не знаю?

Мій код, за виключенням включеної JS:

<link href="/admin/shop/css/tabs.css" type="text/css" rel="stylesheet" media="screen" />
<link href='http://fonts.googleapis.com/css?family=Raleway:400,500,700,800' rel='stylesheet' type='text/css'>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
    $(function() {    

    $(".tab_content").hide();
     $("ul.tabs").each(function() {
         $(this).find('li:first').addClass("current");
         $(this).next('.panes').find('.tab_content:first').show();
     });

    /* binding click to display another tab */
    $("ul.tabs li a").click(function(event) {

        var cTab = $(this).closest('li');
         cTab.siblings('li').removeClass("current");
         cTab.addClass("current");
         cTab.closest('ul.tabs').nextAll('.panes:first').find('.tab_content').hide();

         var activeTab = $(this).attr("href"); //Find the href attribute value to identify the active tab + content
         $(activeTab).fadeIn(); //Fade in the active ID content
         return false;
    });



});
    function checkIt(evt) {
        evt = (evt) ? evt : window.event
        var charCode = (evt.which) ? evt.which : evt.keyCode
        if (charCode > 31 && (charCode < 48 || charCode > 57)) {
            status = "This field accepts numbers only."
            return false
        }
        status = ""
        return true
    }

    function addRows(elem) {
        var ctr = parseInt($("#rows_ctr").val())+parseInt(1);
        var row = $(elem);
        emails_dropdown = $("#email_id_sample").clone();
        row.closest('.adder').parents(".adder-row").before('<tr><td>Subject:</td><td></td></tr>');
        $("#rows_ctr").val(ctr);
       //$("#email_id_"+ctr).val('');
    }

    function addForm() {
        var ctr = parseInt($("#rows_ctr1").val())+parseInt(1);
        form_content = $("#formcopy").clone();
        $('#cform > tbody > tr:last').after('<tr><td><div id="crm-feedback'+ctr+'"></div><form id="form'+ctr+'" onsubmit="return setList('+ctr+');">'+form_content.html()+'<form/></td></tr>');
        $("#rows_ctr1").val(ctr);
    }

    function setList(str){
        var postDatas = decodeURI($('#form'+str+'').serialize());
        console.log('Post data: ' + postDatas);
        $.ajax({
            url: base_url+"admin/page/file.php",
            type: "POST",
            cache: false,
            data: postDatas,
            beforeSend:function(){
                $('#crm-feedback'+str+'').html('
');
             },
            success: function(data){
               //$('#crm-feedback').html('Saved!').css('color','green');
                console.log('Success');
            },
            error: function (jqXHR, textStatus, errorThrown) {
                console.log(jqXHR);
                console.log(textStatus);
                console.log(errorThrown);
            }
        });
    }
</script>

<body class="colorbox-body">
    <div class="welcome-box">
        

Set Group Email and SMS

    </div>
    <div class="colorbox-content">
        <div id="notification">
            <?php 
                if($email_success){ 
                        echo"Schedule Saved.";
                        echo '<script>
                                    setTimeout("$(\"#notification\").fadeOut()",5000);
                                </script>';
                }   
                if($nochanges==1){
                    echo "No changes made.";
                    echo '<script>
                                    setTimeout("$(\"#notification\").fadeOut()",5000);
                            </script>';
                }
            ?>
        </div>
        

Set Group Email and SMS

        <table id="cform">
            <tr>
                <td>
                <form id = "form0" name="form0" onsubmit="return setList(0);">                    
                    <div class="sel">
                    <?php
                        $ctr = 0;
                        //get group emails
                        $sql_grpemails = "some things";
                        $res_grpemails = mysql_query($sql_grpemails);
                        if(mysql_num_rows($res_grpemails) > 0) {
                            while($row_grpemails = mysql_fetch_assoc($res_grpemails)) {
                                echo '<tr><td>Subject:</td>';
                                echo '<td></td></tr>';
                                $ctr++;
                            }
                        } 
                    ?>
                    <table cellpadding="3">
                        <tr>
                            <td>
                                Subject:
                            </td>
                            <td>
                                
                            </td>
                        </tr> 
                        <tr class="adder-row">
                            <td colspan="2">
                                <input type="button" class="adder btn-link right" value="Add More" onclick="addRows(this);" />
                            </td>
                        </tr>                                  
                        </table>

                    </div>                                                             
                        
<input type="hidden" name="rows_ctr" id="rows_ctr" value="<?php echo $ctr;?>" /> <input type="hidden" name="rows_ctr1" id="rows_ctr1" value="<?php echo $ctr;?>" /> <input type="hidden" name="gid" id="" value="<?php echo $_GET['gid'];?>" /> <input type="submit" value="Save" class="btn-link right" /> <div class="clr"></div> </div> </form> </td> </tr> </table> <table width="95%"> <tr> <td colspan="2"> <input type="button" class="btn-link right" value="Add More" onclick="javascript:addForm();" /> </td> </tr> </table> <form id = "formcopy" name="form1" method="post" action="" style="display:none"> <table cellpadding="3"> <tr> <td> Subject: </td> <td> </td> </tr> <tr class="adder-row"> <td colspan="2"> <input type="button" class="adder btn-link right" value="Add More" onclick="addRows(this);" /> </td> </tr> </table> <div class="scheduled_days">
Scheduled (Days)
                <div class="panes">
                    <div id="tab5" class="tab_content" style = "padding-top: 20px;">
                        Recurring: Every  <input type="text" name="dval"/> Day(s)
                        
*Reference date: Member date added to the group </div> <div id="tab6" class="tab_content" style = "padding-top: 20px;"> Recurring: Every <input type="text" name="wval"/> Week(s)
*Reference date: Member date added to the group
<input type="radio" name="recursched" value="weekmon"/> Monday <input type="radio" name="recursched" value="weektue"/>Tuesday <input type="radio" name="recursched" value="weekwed"/>Wednesday <input type="radio" name="recursched" value="weekthu"/>Thursday <input type="radio" name="recursched" value="weekfri"/> Friday <input type="radio" name="recursched" value="weeksat"/> Saturday <input type="radio" name="recursched" value="weeksun"/> Sunday </div> <div id="tab7" class="tab_content" style = "padding-top: 20px;"> Recurring:
*Reference date: Member date added to the group
<input type="radio" name="recursched" value="monthlyrecur"/> Day <input type="text" name="mday"/> of every <input type="text" name="mmonth"/> month(s)
<input type="radio"name="recursched" value="monthlyrecur"/> The </div> <div id="tab8" class="tab_content" style = "padding-top: 20px;"> Recurring:
*Reference date: Member date added to the group
<input type="radio" name="recursched" value="yearlyrecur"/> Every <input type="text" name="yday"/>
<input type="radio" name="recursched" value="yearlyrecur2"/> The of </div> </div>
<input type="hidden" name="rows_ctr" id="rows_ctr" value="<?php echo $ctr;?>" /> <input type="hidden" name="rows_ctr1" id="rows_ctr1" value="<?php echo $ctr;?>" /> <input type="hidden" name="gid" id="" value="<?php echo $_GET['gid'];?>" /> <input type="submit" value="Save" class="btn-link right" /> <div class="clr"></div> </div> </form>
<div class="warning-msg"> *Please note that changing the schedule may result in some members not receiving emails. </div> </div> </body>

It now works on chrome, but not on all occasion, i might need to submit it twice before it gets trough

1
Чи ця проблема стосується лише певного веб-переглядача або всіх веб-переглядачів? Чи ви викинули консоль.log у функцію setList, щоб переконатися, що вона дійсно викликається, коли ви думаєте?
додано Автор Mark Amery, джерело
Одна дика гіпотеза: в іншому місці на сторінці ви надсилаєте декілька запитів AJAX на якусь URL-адресу, яка ніколи не повертається, і ви потрапляєте в обмеження браузера на одночасних запитах AJAX, запобігаючи тим, що в setList з колись фактично бути посланий. Можливо, але малоймовірно; вам дійсно потрібно зробити додаткову роботу свого власного , щоб ви могли надати нам більше інформації .
додано Автор Mark Amery, джерело
@MarcB цим я маю на увазі, що я додав помилку: function() {event of $ .ajax. Також помилок у моїй консолі немає
додано Автор magicianiam, джерело
@KirKill намагалася помилка: функція (xhr, повідомлення, помилка) {alert (повідомлення); }, і це просто говорить про помилку, але, хоча запит пройшов повз. це дуже заплутане.
додано Автор magicianiam, джерело
@MarcB буде робити, але чому це те, що, навіть якщо він викликається, чому він все ще переходить на цільову сторінку?
додано Автор magicianiam, джерело
@MarcB він просто говорить про помилку
додано Автор magicianiam, джерело
@MarkAmery на всіх веб-переглядачах, насправді я дійсно зробив кілька досліджень, тому я зміг визначити, що він не надсилатиме повідомлення, якщо я не відкрию браузер, також помилок у журналі консолі, функція помилки jQuery просто говорить про помилку, яка не дуже корисна. хоча одна з моїх функцій JS також не працює, як очікувалося, я зробив повідомлення про це -> jQuery декількох груп тегів на одній сторінці "> stackoverflow.com/questions/16407252/… . може вони як-то пов'язані?
додано Автор magicianiam, джерело
що таке повідомлення про помилку? ми не можемо визначити причину, якщо ви не повідомляєте нам ніяких корисних відомостей.
додано Автор Marc B, джерело
якщо обробник error: отримує виклик, то виникла помилка. спробуйте error: function (xhr, message, error) {alert (message); } , щоб дізнатись, про що скаржаться jquery.
додано Автор Marc B, джерело
Параметр помилки AJAX має 3 параметри, з яких один повертає помилку? Якщо ви спробуєте "error: function (x, t, m)" і сповіщаєте "m", що це говорить?
додано Автор Samuel Robert, джерело
@magicianIam Ви сповістили неправильну річ, другий параметр - це стан, це може бути помилка, таймаут, перервана або парсеророга, але це лише статус, що треба сповістити, це третій параметр, який буде "помилкою" у вашому випадок, що є помилкою, яку кинули.
додано Автор Samuel Robert, джерело
Чи є запит на вкладці «Мережа» (у вікні консолі) неможливим чи успішним? Який статус запиту? Які його заголовки?
додано Автор Maxime Fafard, джерело

9 Відповіді

Швидше за все, є помилка на стороні сервера. Ви можете визначити цю помилку, використовуючи обробник error ajax, також спробуйте використовувати консоль.log() замість alert() при налагодженні JS:

function setList(str){
    var postDatas = decodeURI($('#form'+str+'').serialize());
    console.log('Post data: ' + postDatas);
    $.ajax({
        url: base_url+"admin/page/file.php",
        type: "POST",
        data: postDatas,
        success: function (data) {
           //$('#crm-feedback').html('Saved!').css('color','green');
            console.log('Success');
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(jqXHR);
            console.log(textStatus);
            console.log(errorThrown);
        }
    });
}

Тоді перевірте консоль на докладні повідомлення, я думаю, ви б знали, що сталося тоді.

3
додано
@HieuNguyen запит тепер потрапляє вручну, хоча воно взагалі не працює на Firefox
додано Автор magicianiam, джерело
Так, у мене є, що мені потрібно перевірити там? також оновив код. хоча я виключив зовнішні файли JS.
додано Автор magicianiam, джерело
Що може викликати це на стороні серверів?
додано Автор magicianiam, джерело
це те, що я отримав. Дані публікації: email_id [] = 3-sms & dval = 123 & wval = & mday = & mmonth = & mweek = Спочатку & ym & zwnj; onth = Січень і дні = & y & zwnj; тиждень = перше & yday = mond & zwnj; ay & ymonth2 = січня & rwns; ows_ctr = 0 & rows_ctr1 = & 0; gid = 47 setGroupEmail.php? Gid = 47: 205 [об'єкт Object] setGroupEmail.php? Gid = 47: 219 помилка
додано Автор magicianiam, джерело
Це залежить від усякого роду помилки. Ви можете отримати код стану помилки (500, 405, 403 ...) на вкладці мережі в інструментах chrome dev/firebug при виконанні запиту. У будь-якому випадку налагодження коду на стороні сервера - це ще одна історія. Ви взагалі маєте доступ до серверної сторони?
додано Автор Hieu Nguyen, джерело
Копіювання коду PHP тут може стати іншим шляхом. Хтось може помітити помилку досить швидко, просто переглянувши код. Але в цілому ви можете слідкувати за коментарем або встановити "точки перерви" (echo '1'; echo '2'; і т. Д в різних розділах) в коді для налагодження, який розділ має помилку.
додано Автор Hieu Nguyen, джерело
Код, який працює в Chrome, звучить як проблема JS. Чи є запит надіслано правильно в Firefox або воно не надсилається (перевірте Firebug's Network на вкладці)? Одне маленьке питання полягає в тому, чи є причина, чому ви повинні decodeURI() серійні пост-дані? Здається, це нічого не робить, і цілком нормально надсилати серійні дані самостійно.
додано Автор Hieu Nguyen, джерело
Поштові дані виглядають нормально. Я думаю, є помилка, коли файл setGroupEmail.php обробляє це запит. Ви можете натиснути на об'єкт [Object Object], щоб перевірити, чи є якась деталь про викинуту помилку. Але добре, на мій погляд, все-таки на сторожі сервера.
додано Автор Hieu Nguyen, джерело
Якщо ви впевнені, що другий, третій тощо, запит POST робить його на сервері (він з'явиться у ваших журналах http), перевірте помилки php. Подивіться на файл error_log , якщо він вказаний в php.ini або встановіть error_log через ini_set() у вашому коді. error_reporting має бути встановлено щось багатослівне під час розробки E_ALL && E_STRICT . Якщо все інше не вдається, у вашій функції вирушайте по лінії, додаючи умирати ('get here'), доки ви не побачите той самий (помилка) результат. Однак сам браузер може бути винуватцем.
додано Автор im3r3k, джерело

Окрім перегляду консолі Javascript, вам слід подивитися на фактичний обмін трафіком.

Використовуйте fiddler , щоб перевірити це.

Ви також повинні спробувати налагодити JS за допомогою інструментів, доступних у веб-переглядачі, який ви використовуєте.

Це найважливіший крок для вирішення проблеми. Ви повинні точно знати, чи справді дійсно відбуваються запити. Якщо такі є, то вам потрібно подивитися на різницю у запитах. В іншому випадку ви можете налагодити JS, щоб точно дізнатися, що відбувається.

2
додано
Використовуваний firefox addon замість цього називається живими заголовками http. на перший запит мені вдалося отримати /admin/setGroupEmail.php?email_id%5B%5D=&email_id%5B%5D=&dva‌ l = & wval = & mday = & mmont & html; h = & mweek = First & ymont & amp; h = січня & yday = & ywee & = K & rs; ymonth2 = January & rows & amp; zwnj; _ctr = 1 & rows_ctr1 = 1 & g & zwnj; id = 1, але виконуючи запит знову не відображається нічого на заголовку.
додано Автор magicianiam, джерело
у вас є певний список для інструментів браузера Chrome? спасибі. Запит проходить через кошик, коли веб-переглядач нещодавно відкрився, навіть якщо jQuery дає мені помилку
додано Автор magicianiam, джерело
Re chrome: він поставляється з браузером, натисніть f12. Якщо ви не бачите другий запит, ви навіть не зможете надсилати запит. Ви повинні встановити деякі точки зупинки та пройти через нього (на вкладці вихідного коду клацніть лівою смужкою, як і в будь-якому IDE).
додано Автор eglasius, джерело
@magicianIam ваш обмін з hieu, здається, натякає, що запит виходить. Я настійно рекомендую вам перевірити обидва запити за допомогою скрипаля, ви можете просто перевірити інформацію, яка надсилається в обох запитах. Це єдине може сказати вам, що не так. Якщо запити повинні мати різницю, тоді все ще дуже важливо, щоб запити в скритсері були готові до повторного подання, навіть на інший сервер (наприклад, ваш локальний комп'ютер, для налагодження). Якщо запити не мали різниці, то тепер ви знаєте, що шукати.
додано Автор eglasius, джерело

Можливо, це кешування. Спробуйте cache: false в виклику ajax подібно.

function setList(str){
    var postDatas = decodeURI($('#form'+str+'').serialize());
    alert(postDatas);
   //$('#crm-feedback').html('');
   //var formname = "test";
    $.ajax({
        url: base_url+"admin/page/file.php",
        type: "POST",
        cache: false,
        data: postDatas,
       //data: "formname="+formname,
        success: function(data){
           //$('#crm-feedback').html('Saved!').css('color','green');
            alert("test");
        }

    });
}
0
додано
як і раніше не отримаєте жолоб, також не буде помилок на консолі чи jquery
додано Автор magicianiam, джерело

Ви описали помилку на стороні сервера . Будь-ласка, налагоджте свій код.

Якщо у вас є запитання про помилку на стороні сервера , оновіть своє запитання або ще краще поставте інше запитання з відповідним кодом ( сторона сервера ).


Переконайтеся, що php.ini не вимикає повідомлення про помилки та попередження.

Перевірте свій журнал помилок сервера (я думаю, ви використовуєте apache?).

0
додано
це мій код на сервері, хоча він тепер працює, використовуючи тільки хром.
додано Автор magicianiam, джерело

Спробуйте поставити випадковий $ _GET у ваш запит

rand     = rand.getMilliseconds(rand);  
url_ajax ='myajaxpage.php?rand='+rand; //Force refresh

$.ajax({
    url: url_ajax,
    type: "POST",
    ...
0
додано

Можливо, ви використовуєте абсолютні URL-адреси, деякі браузери мають проблеми з абсолютними URL-адресами і ставляться до них як до міждоменних запитів, навіть якщо їх немає. Перевірте, base_url + "адміністратор/сторінка/file.php" абсолютний URL ( Http: //yourserver/admin/page/file.php ). Якщо так, спробуйте змінити відносний URL.

0
додано
який був би відносний url?
додано Автор magicianiam, джерело
@magicianIam: URL-адреси без http://serverdomain . Наприклад, /admin/page/file.php
додано Автор Khanh TO, джерело

Залежно від веб-переглядача, який ви використовуєте, може бути кешування вашого запиту POST . Це не кешування jQuery, тому cache: false не допоможе. Це справжній браузер.

У PHP довелося вручну встановити заголовки відповіді, щоб переконатися, що додаткові запити не будуть кешовані.

header("Cache-Control: no-cache, must-revalidate"); //HTTP 1.1
header("Pragma: no-cache"); //HTTP 1.0
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");//Date in the past
0
додано

Чи є файл .htaccess у обслуговуванні сторінки (наприклад, досить URL-адреси чи певна маршрутизація)?

Якщо це так, спробуйте замість цього скористатись http: //domain.tld/index.php/page_uri і перевірте, чи яке-небудь правило htaccess блокує запити POST.

Чи розміщуєте ви дані на ту саму URL-адресу, що і сторінка, яка ініціює запит AJAX? Якщо ні, може статися проблема CSRF або крос-домену. У цьому випадку перегляньте Керівництво AJAX Cross Domain .

Тоді в PHP-файлі може існувати неправильна конфігурація або помилка, яка повинна обробляти запит AJAX. Запустіть PHP-Lint і подивіться, що він говорить, або перевірте це вручну.

Насправді ви лише трохи усвідомлюєте проблему з наданими вами даними (опис проблеми та фрагмент коду). Там може бути більше проблемних джерел. Подібно до цього це гадаюча гра. Я не стогну, розглядаю це як пропозицію оновити відповідь з додатковою інформацією щодо проблеми.

0
додано
.htaccess використовується тільки для зовнішніх сторінок, а не для бекенда. Ви можете пояснити це мені domain.tld/index.php/page_uri . Я розміщую дані на тій же URL-адресі просто іншому файлу.
додано Автор magicianiam, джерело

Я сподіваюсь, що ви знаєте інструменти налагодження браузера та використовуєте їх.

Якщо ні, для firefox спробуйте firebug - https://addons.mozilla.org/ en-US/firefox/addon/firebug/ або для chrome, доступний інструмент розробника за замовчуванням. Не потрібно інсталяції. В обох випадках натисніть F12, щоб відкрити інструмент розробки.

Якщо використовуєте firebug, клацніть на вкладці Net. Потім виконайте дії, щоб запустити ваш дзвінок ajax. Відповідна рядок додається там. Натисніть на цю лінію. Він буде відкритий для показу деяких вкладок, таких як заголовки, запит, відповідь тощо. Подивіться на вкладку відповіді. Що він говорить?

У chrome з'явиться вкладка «Мережа». Відкрийте його та запустіть свій дзвінок ajax. Відпочинок майже подібний, як у firebug. Що таке вкладка відповіді?

Якщо ви не знайшли вирішального результату, спробуйте вставити точку зупинки всередині функції помилки вашого виклику ajax на вкладці сценарію в firebug або на вкладці джерел у інструментах розробника Chrome. Перегляньте, яке повідомлення містить параметр помилки.

0
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php

ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram