Javascript/AJAX работи добре във всичко, освен в IE

Имам проста програма и тя работи 100% във Firefox и Chrome, но не работи в Internet Explorer (версия 9).

Извиква се изскачащ прозорец от страница, която изброява всички планирани срещи за деня. Това е кодът на този изскачащ прозорец:

<?php

$name = $_GET['name'];
#$type = $_GET['type'];
$type = "Regular";
$id   = $_GET['id'];

?>

<!doctype html>
<html>
    <head>
        <title><?php echo $name; ?></title>
        <style type="text/css">
            body {
                font-family: Georgia;
            }
            .col1 {
                float: left;
                padding-right: .75em;
            }
            .col1 div { height: 1.5em; }
            .col2 div { height: 1.5em; }
            .col2 {
                float: left;
                padding-right: .5em;
            }
            .notes {
                clear: both;
            }
        </style>
        <script type="text/javascript">
            function saveClose() {
                var xmlhttp;
                var getstring  = "";
                var d          = document;

                var start_hour = d.getElementsByName('start_hour')[0].value;
                var start_min  = d.getElementsByName('start_min')[0].value;
                var start_am   = d.getElementsByName('start_am')[0].value;

                var end_hour   = d.getElementsByName('end_hour')[0].value;
                var end_min    = d.getElementsByName('end_min')[0].value;
                var end_am     = d.getElementsByName('end_am')[0].value;

                var no_show    = d.getElementsByName('no_show')[0].checked;

                var notes      = d.getElementsByName('notes')[0].value;

                getstring += "?type=<?php echo $type ?>";
                getstring += "&id=<?php echo $id ?>";
                getstring += "&s_hour="+start_hour;
                getstring += "&s_min=" +start_min;
                getstring += "&s_am="  +start_am;
                getstring += "&e_hour="+end_hour;
                getstring += "&e_min=" +end_min;
                getstring += "&e_am="  +end_am;
                getstring += "&ns="    +no_show;
                getstring += "&notes=" +notes;

                if (window.XMLHttpRequest)
                {
                    // code for IE7+, Firefox, Chrome, Opera, Safari;
                    xmlhttp = new XMLHttpRequest();
                } else {
                    // code for IE6, IE5;
                    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                }

                xmlhttp.onreadystatechange = function()
                {
                    if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
                    {
                        var reply = xmlhttp.responseText;
                        if (reply == "Successful!") {
                            setTimeout('self.close()', 1000);
                        } else {
                            document.getElementById('resultsContent').innerHTML = xmlhttp.responseText;
                        }
                    } else {
                        document.getElementById('resultsContent').innerHTML = "Saving...";
                    }
                }

                xmlhttp.open("GET", "saveClose.php"+getstring, true);
                xmlhttp.send();
            }
        </script>
    </head>
    <body>
        <div><h2><?php echo $name; ?>'s Consult</h2></div>
        <div class="col1">
            <div>Consult Start Time:</div>
            <div>Consult End Time:</div>
            <div>No Show? :</div>
        </div>
        <div class="col2">
            <div>
                <select name="start_hour">
                    <option></option>
                    <option>1</option>
                    <option>2</option>
                    <option>3</option>
                    <option>4</option>
                    <option>5</option>
                    <option>6</option>
                    <option>7</option>
                    <option>8</option>
                    <option>9</option>
                    <option>10</option>
                    <option>11</option>
                    <option>12</option>
                </select>
                :
                <select name="start_min">
                    <option></option>
                    <option>00</option>
                    <option>05</option>
                    <option>10</option>
                    <option>15</option>
                    <option>20</option>
                    <option>25</option>
                    <option>30</option>
                    <option>35</option>
                    <option>40</option>
                    <option>45</option>
                    <option>50</option>
                    <option>55</option>
                </select>
                -
                <select name="start_am">
                    <option></option>
                    <option>AM</option>
                    <option>PM</option>
                </select>
            </div>
            <div>
                <select name="end_hour">
                    <option></option>
                    <option>1</option>
                    <option>2</option>
                    <option>3</option>
                    <option>4</option>
                    <option>5</option>
                    <option>6</option>
                    <option>7</option>
                    <option>8</option>
                    <option>9</option>
                    <option>10</option>
                    <option>11</option>
                    <option>12</option>
                </select>
                :
                <select name="end_min">
                    <option></option>
                    <option>00</option>
                    <option>05</option>
                    <option>10</option>
                    <option>15</option>
                    <option>20</option>
                    <option>25</option>
                    <option>30</option>
                    <option>35</option>
                    <option>40</option>
                    <option>45</option>
                    <option>50</option>
                    <option>55</option>
                </select>
                -
                <select name="end_am">
                    <option></option>
                    <option>AM</option>
                    <option>PM</option>
                </select>
            </div>
            <div><input type="checkbox" name="no_show" /></div>
        </div>
        <div class="notes">Notes:</div>
        <div class="notes"><textarea name="notes" rows="5" cols="53"></textarea></div>
        <div class="notes"><button type="button" onClick="saveClose();">Save & Close</button><span id="resultsContent" style="padding-left:1em"></span></div>
    </body>
</html>

AJAX повикването изпълнява този PHP скрипт:

<?php

$type   = $_GET['type'];
$id     = $_GET['id'];
$s_hour = $_GET['s_hour'];
$s_min  = $_GET['s_min'];
$s_am   = $_GET['s_am'];
$e_hour = $_GET['e_hour'];
$e_min  = $_GET['e_min'];
$e_am   = $_GET['e_am'];
$ns     = $_GET['ns'];
$ns     = (($ns == "true") ? "1" : "0");
$notes  = $_GET['notes'];


switch (true) {
    case empty($type):
        echo "\$type is broken!";
        break;
    case empty($s_hour):
        echo "\$s_hour is broken!";
        break;
    case empty($s_min):
        echo "\$s_min is broken!";
        break;
    case empty($s_am):
        echo "\$s_am is broken!";
        break;
    case empty($e_hour):
        echo "\$e_hour is broken!";
        break;
    case empty($e_min):
        echo "\$e_min is broken!";
        break;
    case empty($e_am):
        echo "\$e_am is broken!";
        break;
    case (!isset($ns)):
        echo "\$ns is broken!";
        break;
    case (!isset($notes)):
        echo "\$notes is broken!";
        break;

    default:
        // SALES APPTS.
        # ...
        # ...
        # ...

        // OTHER APPTS.
        # ...
        # ...
        # ...

        echo "Successful!";
        break;
}


?>

Както се очакваше, Firefox и Chrome спират при всеки случай, докато не бъдат избрани началният и крайният час. Работи перфектно.

IE обаче ще спира на case empty($s_hour): всеки път, независимо от всичко. Дори не мога да подмина първия случай, за да видя дали и останалите не са повредени. Не разбирам.

Всяка помощ ще бъде високо оценена, тъй като това приложение трябва да е съвместимо с IE9.


person jdstankosky    schedule 10.12.2012    source източник
comment
Е, малко вероятно е да има проблем с вашия PHP код, защото това просто ще върне стойност. Със сигурност в IE не се забива при изпълнението на PHP кода. Ако е така, може би си струва да отворите своя PHP скрипт в IE сам и да видите какви данни се връщат, за да видите дали са приемливи.   -  person Luke    schedule 10.12.2012
comment
Използвали ли сте инструмент като Fiddler и вижте ли какво се изпраща до сървъра, което нарушава вашия php код?   -  person epascarello    schedule 10.12.2012
comment
@Coulton Мисля, че въпросът е, че IE не изпраща правилните данни до сървъра по някаква причина   -  person Ian    schedule 10.12.2012
comment
@epascarello Никога преди не съм използвал Fiddler. Каква е разликата между Fiddler2 и Fiddler4 (освен необходимата рамка)?   -  person jdstankosky    schedule 10.12.2012
comment
вашият php-код е увит в кавички тук getstring += "?type=<?php echo $type ?>"; getstring += "&id=<?php echo $id ?>";. Това нарочно ли е? Автоматично ли се избягва?   -  person nozzleman    schedule 10.12.2012
comment
@nozzleman Какво говориш? PHP низовете не се отпечатват с кавички, така че няма какво да се избягва...освен ако не искате да кажете, че самите низове може да имат кавички вътре в тях? И това няма да направи несъответствие между IE и други браузъри - ще се провали във всички   -  person Ian    schedule 10.12.2012
comment
@jdstankosky за това, което правите, няма значение   -  person epascarello    schedule 10.12.2012
comment
това се чудех и аз :) имах предвид, че мислех, че трябва да изглежда нещо. така getstring += "?type=" + <?php echo $type ?>; или греша?   -  person nozzleman    schedule 10.12.2012
comment
@nozzleman - не, това е грешно. объркваш се от смесването на езиците. Може да работи, ако $type на PHP е числов, но това би било по-скоро късмет, отколкото дизайн; наистина е правилно да го има в низа на Javascript.   -  person SDC    schedule 10.12.2012
comment
би било по-добре функцията saveClose() да е статична (т.е. без PHP код, вграден в нея) и съответните PHP стойности (тип и id) да бъдат предадени в нея като параметри.   -  person SDC    schedule 10.12.2012
comment
опитахте ли да направите console.log(getstring), за да видите какво всъщност публикува кодът? Използвайте инструментите за отстраняване на грешки в браузъра, за да видите изхода на конзолата и да сравните стойностите между двете. Това трябва да ви покаже какво е различното. (без дори да се налага да използвате Fiddler)   -  person SDC    schedule 10.12.2012
comment
Също така, наистина ли трябва да поддържате IE6 и 5.5? Бихте могли да опростите нещата, като изхвърлите този ActiveX бит.   -  person SDC    schedule 10.12.2012
comment
Fiddler показва, че променливите s_hour, s_min, s_am, e_hour, e_min и e_am не се предават в низа за получаване; променливите са празни. Въпреки това, ns и notes се предават. Това ме кара да мисля, че моят метод за получаване на стойностите от входовете за избор на падане е неправилен. Може ли някой да провери?   -  person jdstankosky    schedule 10.12.2012
comment
@SDC Това има много повече смисъл, отколкото да се налага да използвате Fiddler. Страхотно предложение.   -  person jdstankosky    schedule 10.12.2012


Отговори (2)


Опитвате се да прочетете стойността на стойността на полетата за избор, но свойството „стойност“ може да не е попълнено, както очаквате, защото се опитва да получи свойството стойност от избраната опция, а не текста на тази опция.

Трябва или да добавите изричен атрибут на стойност към елементите <option> така:

<option value='12'>12</option>

или изрично вземете текста на избраната опция, така:

var objStHr = document.getElementsByName('start_hour')[0];
var start_hour = objStHr.options[objStHr.value];

(Използвах временна променлива, за да задържа обекта за краткост, тъй като трябва да го препращаме два пъти)

Надявам се това да помогне.

person SDC    schedule 10.12.2012
comment
Добавяйки изричния атрибут на стойност, защо, по дяволите, дори вече не направих това??? Не мога да повярвам, че не забелязах. Както и да е, той реши проблема елегантно, абсолютно и с най-малко количество променен код. Харесвам четивността. - person jdstankosky; 10.12.2012

Ако вашите стойности идват от падащи менюта, не трябва да използвате .value на елемента <select> директно за достъп до избраната опция (свойството не се актуализира във всички браузъри). Използвайте това вместо това:

function getDropdownValue(el)
{
    return el.selectedIndex >= 0 ? el.options[el.selectedIndex].value : '';
}

start_hour = getDropdownValue(d.getElementsByName('start_hour')[0]);
// ...
person Ja͢ck    schedule 10.12.2012