Ajax пошта сұрауы браузер жабылғаннан кейін ғана пайда болады және қайтадан ашылады

Мен көп уақыт бойы AJAX, jQuery және Sessions-мен жұмыс істедім. Бірақ бұл бірінші рет осы проблемаға тап болдым.

Мен басқа параққа қалыпты пошта сұранысын жіберіп жатырмын және ескі кодтарым сияқты, мен AJAX сұрауының сәтті болғанын тексеру үшін мақсатты бетке сеанстар қолданамын.

Мен мұны жасаған кездерім үшін, ол менің AJAX-ті табысты жалғастыруға кедергі болатын айқын Javascript қателіктері бар кезден басқа, тамаша жұмыс істеді.

Енді ajax-дің сұранысы сәтті болу үшін менің браузерді жабып, ашқаннан кейін оны іске қосуым керек, ал егер бірінші сұранысты жібергеннен кейін оны қайтадан жасасам, ол сәтті болмайды, тағы бір қызықты нәрсе Мен AJAX үшін қате туралы жауапты іске қосқан кезде, әрдайым қате аламын, бұл шынында да алаңсыз және тітіркендіргіш, себебі мен бұл мәселенің түпкі себебін анықтай алмаймын.

Бұл сервер мәселесі немесе кодтық мәселе немесе мен білмейтін ереже ме?

Менің кодты қосқанда, код:

<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
Бұл мәселе нақты браузерде немесе барлық шолғыштарда ма? Console.log параметрін setList функциясына лақтырып тастасаңыз, ол сіз ойлаған кезде ол нақты қоңырау шалынатынына көз жеткізіңіз бе?
қосылды автор Mark Amery, көзі
Бір жабайы гипотеза: беттегі басқа жерлерде сіз ешқашан нақты қайтармайтын бірнеше URL мекенжайына AJAX сұрауларын жіберіп жатырсыз және сіз бір мезгілде AJAX сұрауларына браузердің шегін соқсаңыз, setList іс жүзінде жіберіледі. Мүмкін, бірақ екіталай; бізге қосымша ақпарат беріңіз болуы үшін өзіңіздің жеке зерттеу жұмыстарын жасаңыз. .
қосылды автор Mark Amery, көзі
@MarcB бұл дегеніміз, мен қатені енгіздім: function() {$ .ajax оқиғасы. Сондай-ақ менің консольімде қате жоқ
қосылды автор magicianiam, көзі
@KirKill қатені көрді: function (xhr, message, error) {alert (message); } және ол жай қате туралы айтады, бірақ сұраныс өтіп кетсе де. бұл өте күрделі.
қосылды автор magicianiam, көзі
@MarcB жасайды, бірақ неге ол алынады, неге ол әлі де мақсатты бетке ауысады?
қосылды автор magicianiam, көзі
@MarcB бұл қате ғана айтады
қосылды автор magicianiam, көзі
@MarkAmery барлық браузерлерде, іс жүзінде шынымен де кейбір зерттеулерді жасадым, сондықтан браузерді қайта ашпасам да, жібермейінше, jQuery қателігі функциясында қате туралы өте пайдалы емес дейді. бірақ менің JS функциясымның біреуі де жұмыс істемейді деп күткендей жұмыс істемейді -> jQuery бірнеше тег топтары бір бетте «> stackoverflow.com/questions/16407252/… . Мүмкін олар бір-бірімен байланысты?
қосылды автор magicianiam, көзі
содан кейін қате туралы хабар қандай? біз пайдалы мәліметтерді айтпасаңыз, түбірлік себептерді анықтауға көмектесе алмаймыз.
қосылды автор Marc B, көзі
error: өңдегіші шақырылатын болса, онда қате бар. error: функциясын (xhr, хабарлама, қате) байқап көріңіз {alert (message); } , jquery-тің шағымы туралы білу үшін.
қосылды автор Marc B, көзі
AJAX қате параметрінде қате қайтарылатын 3 параметр бар. Егер сіз 'error: function (x, t, m)' және alert 'm' тырыссаңыз, бұл не айтады?
қосылды автор Samuel Robert, көзі
@magicianIam Сіз қате нәрсені ескертесіз, екінші параметр - статус, ол қате, уақытша тоқтату, тоқтату немесе парсейрор болуы мүмкін, бірақ бұл жай ғана мәртебе, сізге ескерту қажет үшінші параметр - бұл сіздің «қате» қате болып табылатын оқиға.
қосылды автор Samuel Robert, көзі
Сұрау желілік қойындыда (консоль терезесінде) сәтсіз немесе сәтті ме? Сұраудың күйі қандай? Оның тақырыбы қандай?
қосылды автор Maxime Fafard, көзі

9 жауаптар

Бәлкім, сервер жағында қате бар. Бұл қатені ajax қате өңдегішін қолдану арқылы анықтауға болады, сондай-ақ JS күйін келтіру кезінде alert() орнына console.log() функциясын қолдануға тырысыңыз:

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 сұраныс қазірдің өзінде кездейсоқ түседі, бірақ бұл өрт сөндірмесінде жұмыс істемейді
қосылды автор magicianiam, көзі
иә, мен онда немен айналысуға болады? ақ кодты жаңартты. бірақ мен сыртқы JS файлдарын шығарып тастағанмен.
қосылды автор magicianiam, көзі
бұл серверлер жағына не әкелуі мүмкін?
қосылды автор magicianiam, көзі
Мен бұл алдым. & Dw = 0 & rows_ctr1 = & zwnj; 0 & gid = 1 & d & rs = 0 & rows_ctr1 = & zwwn = & & mweek = Бірінші & yy & zwnj; onth = January & yday = & y & zwnj; week & year = first & yday = mond & zwnj; month & ymonth2 = January & r & zwnj; ows_ctr = 0 & rows_ctr1 = & zwnj; 47 setGroupEmail.php? Gid = 47: 205 [object Object] setGroupEmail.php? Gid = 47: 219 қатесі
қосылды автор magicianiam, көзі
Бұл әртүрлі қателіктерге байланысты. Сұрауды орындау кезінде қате коды (500, 405, 403 ...) желілік қойындысында chrome dev tools/firebug бөлімінен алуға болады. Қалай болғанда да, сервердің бүйірлік кодты түзету - бұл басқа бір оқиға. Сервер тарапынан қолыңыз бар ма?
қосылды автор Hieu Nguyen, көзі
Бұл жерде php-кодты көшірудің тағы бір жолы болуы мүмкін. Біреу кодты қарап шығып, қатені тез қараған болуы мүмкін. Бірақ, жалпы алғанда, түсініктемеден кейін немесе «break breakpoint» (echo '1', echo '2' және т.б. түрлі бөлімдерде) кодының қатесі бар қателерді түзету үшін орнатуға болады.
қосылды автор Hieu Nguyen, көзі
Кодта жұмыс істейтін код тек JS мәселесі сияқты естіледі. Сұрау Firefox-та дұрыс жіберілген бе немесе ол мүлдем жіберілмеген бе (Firebug желісінің қойындысын тексеріңіз)? Бір шағын мәселе, сізде decodeURI() сериализацияланған postdata-ны шешудің қандай да бір себебі бар ма? Онда ештеңе істемейді және бірізді деректерді жалғыз жөнелту әдетті.
қосылды автор Hieu Nguyen, көзі
Пошталық деректер қалыпты көрінеді. Файл setGroupEmail.php бұл сұрауды өңдеген кезде қате бар деп ойлаймын. Сіз қателік бойынша қандай да бір мәліметтердің бар-жоқтығын тексеру үшін [Object Object] түймесін басуға болады. Бірақ, менің ойымша, сервер жағында тұрған қате.
қосылды автор Hieu Nguyen, көзі
Егер екінші, үшінші, және т.б. сенімді болсаңыз, POST сұрауы оны серверге жібереді (бұл сіздің http журналдарыңызда көрсетіледі) PHP қателерін тексеріңіз. php.ini ішінде көрсетілген болса, error_log файлын қараңыз немесе error_log арқылы ini_set() кодының. E_ALL && E_STRICT әзірлеген кезде error_reporting сөзі бір нәрсе үшін орнатылуы керек. Егер бәрі сәтсіз болса, функцияңызда бірдей (қате) нәтижені көре бастағанға дейін жолды қосыңыз («алған»). Дегенмен, шолғыш өзі кінәлі болуы мүмкін.
қосылды автор im3r3k, көзі

Javascript консольіне қарап отырып, нақты трафикпен алмасуды қарауыңыз керек.

Тексеру үшін ойынды пайдаланыңыз.

Сіз js-ді сіз қолданатын шолғышта қол жетімді құралдармен отладтауға тырысыңыз.

Бұл шешімді шешудің басты қадамы. Сұраулар шынымен орындалып жатқанын білуіңіз керек. Егер солай болса, онда сіз сұраулардағы айырмашылықты қарауыңыз керек. Әйтпесе, не болып жатқанын білу үшін js-ді отладтауға болады.

2
қосылды
орнына Firefox addon қолданылған http тақырыптары деп аталады. бірінші сұраныс бойынша GET/admin/setGroupEmail.php?email_id%5B%5D=&email_id%5B%5D=&dva‌ l = & wval = & mday = & mmont & zwnj; h = & mweek = Бірінші & ymont & zwnj; h = қаңтар & = & ywee & zwnj; k = бірінші & yday = monday && zwnj; ymonth2 = қаңтар & rows & zwnj; _ctr = 1 & rows_ctr1 = 1 & g & zwnj; id = 1, бірақ сұрауды қайтадан тақырыпта ештеңе көрсетпеді.
қосылды автор magicianiam, көзі
Chrome браузер құралдары үшін нақты тізім бар ма? Рақмет сізге. сұрау jQuery маған қате жіберсе де, браузер жақында ашылғанда
қосылды автор magicianiam, көзі
Шамамен хром: браузермен келеді, f12 пернесін басыңыз. Егер сіз екінші сұрауды көрмесеңіз, сіз сұрауды жіберу үшін қоңырауға қол жеткізе алмауыңыз мүмкін. Кейбір тоқтау нүктелерін орнатып, оған қадам жасаңыз (бастапқы кестеде, кез-келген IDE-дегідей, сол жақ жолақты нұқыңыз).
қосылды автор eglasius, көзі
@magiciIyour exchange with hieu, сұраныстың нашарлайтынын айтады. Мен сізді екі сұранысты тексеретіндігіңізді ұсынамын, сіз тек екі сұрауда жіберілген ақпаратты тексере аласыз. Сізге тек ненің дұрыс емес екенін айтуға болады. Егер сұраулардың айырмашылығы бар болса, онда басқа серверге (жергілікті компьютер сияқты, отладка үшін) қайта жіберуге дайын болып қалу өте пайдалы. Егер сұрауларға айырмашылық болмаса, онда сіз не іздейтінін білесіз.
қосылды автор eglasius, көзі

Мүмкін ол оны кэштейді. Ajax шақыруындағы cache: false деп көріңіз.

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 + «admin/page/file.php» - абсолютті url ( http: //yourserver/admin/page/file.php ) екендігін тексеріңіз. Егер солай болса, салыстырмалы url-ге ауысыңыз.

0
қосылды
салыстырмалы url деген не?
қосылды автор magicianiam, көзі
@magicianIam: URL мекенжайлары http://serverdomain жоқ. Мысалы /admin/page/file.php
қосылды автор Khanh TO, көзі

Пайдаланып отырған браузерге байланысты POST сұрауыңызды кэштеу мүмкін. cache: false - бұл jQuery кэштауы емес. Бұл нақты шолғыш.

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 дегенді қолданып көріңіз және кейбір әдеттегi ереже POST сұрауларын бұғаттайтынын тексеріңіз.

Деректерді AJAX сұрауын бастайтын бетке ұқсас URL мекенжайына орналастырасыз ба? Олай болмаса, CSRF немесе Cross-Domain проблемасы орын алуы мүмкін. Бұл жағдайда Cross Domain AJAX Guide бөлімін қараңыз.

Сонда AJAX сұрауын өңдеуге болатын PHP файлында қате конфигурация немесе қате болуы мүмкін. PHP-Lint бағдарламасын іске қосыңыз және ол не айтқанын немесе оны қолмен тексеріңіз.

Шын мәнінде, сіз берген деректермен (мәселенің сипаттамасы және код үзіндісі) мәселенің жай ғана түсінігін бересіз. Мәселе көздері көп болуы мүмкін. Мынау секілді, бұл ойынға арналған ойын. Мазасыз емеспін, бұл мәселе туралы қосымша ақпаратпен жауапты жаңарту туралы ұсыныс ретінде қарастырыңыз.

0
қосылды
.htaccess тек алдынғы беттер үшін ғана пайдаланылады. Сізге бұл туралы түсіндіруге болады domain.tld/index.php/page_uri . Мен сол URL мекен-жайындағы деректерді тек әртүрлі файлға орналастырамын.
қосылды автор magicianiam, көзі

Сіз браузерді жөндеу құралдарын білесіз және оларды қолданасыз деп үміттенемін.

Егер болмаса, firefox үшін firebug - https://addons.mozilla.org/ en-US/firefox/addon/firebug/ немесе хром үшін әдепкі әзірлеуші ​​құралы бар. Ешқандай орнату талап етілмейді. Екі жағдайда да, құралды ашу үшін F12 пернесін басыңыз.

Егер Firebug қолданылса, Net қойындысын нұқыңыз. Содан соң, сіздің ajax шақыруыңызды қолдануға арналған әрекетті жасаңыз. Онда тиісті жол қосылады. Сол сызыққа басыңыз. Бұл тақырыптар, сұраулар, жауаптар және т.б. сияқты кейбір қойындыларды көрсету үшін ашылады. Жауап қойындысына қараңыз. Бұл не дейді?

Хромда Желілік қойынды болады. Оны ашып, ajax шақыруын өртеп жіберіңіз. Қайта өрт сөндіруге ұқсас. Жауап қойындысы не айтады?

Егер сіз ешқандай нәтиже таба алмасаңыз, ajax қоңырауының қате функциясының тоқтау нүктесін өрт сөндіргішіндегі сценарий қойындысындағы немесе хромдық әзірлеуші ​​құралдарының қайнар көзінде қойыңыз. Қате параметрінің қандай хабарламасын көріңіз.

0
қосылды