0

我正在用 PHP 编写一个页面,并且我正在尝试根据前一个下拉列表的值填充一个下拉列表。这在 Firefox 中完美运行,但在 Internet Explorer 中根本不起作用。我想知道它是否可以在 Firefox 而不是 IE 中运行是侥幸,或者我只是在这样做的方式上有所偏离。这是我所拥有的:

主页:

<select id="make" name="make" onChange="carCompanyListHandler(this.value);">
    <option selected disabled>Choose Make</option>
    <optgroup label="American Cars">
            <option value="chevrolet">Chevrolet</option>
            <option value="dodge">Dodge</option>
            <option value="ford">Ford</option>
            <option value="jeep">Jeep</option>
            <option value="tesla">Tesla</option>
    </optgroup>
    <optgroup label="UK Car Companies">
            <option value="astonmartin">Aston Martin</option>
            <option value="bentley">Bentley</option>
            <option value="landrover">Land Rover</option>
            <option value="lotus">Lotus</option>
            <option value="morgan">Morgan</option>
    </optgroup>
    <optgroup label="Japanese Cars">
            <option value="acura">Acura</option>
            <option value="mazda">Mazda</option>
            <option value="nissan">Nissan</option>
            <option value="subaru">Subaru</option>
            <option value="toyota">Toyota</option>
    </optgroup>
    <optgroup label="Italian Cars">
            <option value="alfaromeo">Alfa Romeo</option>
            <option value="ferrari">Ferrari</option>
            <option value="fiat">Fiat</option>
            <option value="lamborghini">Lamborghini</option>
            <option value="maserati">Maserati</option>
    </optgroup>
            <optgroup label="German Cars">
            <option value="audi">Audi</option>
            <option value="bmw">BMW</option>
            <option value="goliath">Goliath</option>
            <option value="porche">Porche</option>
            <option value="volkswagen">Volkswagen</option>
    </optgroup>
</select>

JavaScript:

function carCompanyListHandler(carCompany){
    xmlHttp = GetXmlHttpObject();

    if (xmlHttp == null){
            alert ("Browser does not support HTTP Request");
            return;
    }

    var url = "./ajaxprocessor.php?carCompany=" + carCompany;
    url = url + "&sid=" + Math.random();
    console.log(url);

    xmlHttp.onreadystatechange = populateModels;
    xmlHttp.open("GET",url,true);
    xmlHttp.send(null);
}

function populateModels(){
    if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete"){
            var selectList = document.getElementById('model');
            var selectListOptions = xmlHttp.responseText;
            console.log(selectListOptions);
            selectList.innerHTML = selectListOptions;
            return;
    }
}

后端 PHP:

<?php
    $carCompany = (isset($_GET['carCompany']) && $_GET['carCompany'] != "") ? $_GET['carCompany'] : null;
    $returnValue = null;

    error_log("The car company chosen was: " . $carCompany);

    switch($carCompany){
            case "chevrolet":
                    $returnValue = "<option value=\"camaro\">Camaro</option>\n<option value=\"corvette\">Corvette</option>\n<option value=\"lumina\">Lumina</option>\n<option value=\"silverado\">Silverado</option>\n<option value=\"volt\">Volt</option>\n";
                    break;
            case "dodge":
                    $returnValue = "<option value=\"avenger\">Avenger</option>\n<option value=\"challenger\">Challenger</option>\n<option value=\"charger\">Charger</option>\n<option value=\"dakota\">Dakota</option>\n<option value=\"ramcharger\">Ramcharger</option>\n";
                    break;
            case "ford":
                    $returnValue = "<option value=\"fiesta\">Fiesta</option>\n<option value=\"focus\">Focus</option>\n<option value=\"taurus\">Taurus</option>\n<option value=\"explorer\">Explorer</option>\n<option value=\"f150\">F-150</option>\n";
                    break;
            case "jeep":
                    $returnValue = "<option value=\"compass\">Compass</option>\n<option value=\"cherokee\">Cherokee</option>\n<option value=\"patriot\">Patriot</option>\n<option value=\"wrangler\">Wrangler</option>\n<option value=\"srt8\">SRT8</option>\n";
                    break;
            case "tesla":
                    $returnValue = "<option value=\"teslaroadster\">Tesla Roadster</option>\n<option value=\"models\">Model S</option>\n<option value=\"modelx\">Model X</option>\n";
                    break;
            case "astonmartin":
                    $returnValue = "<option value=\"v8vantage\">V8 Vantage</option>\n<option value=\"db9volante\">DB9 Volante</option>\n<option value=\"rapide\">Rapide</option>\n<option value=\"astonmartinv12zagato\">Aston Martin V12 Zagato</option>\n<option value=\"cygnet\">Cygnet</option>\n";
                    break;
            case "bentley":
                    $returnValue = "<option value=\"mulsanne\">Mulsanne</option>\n<option value=\"flyingspur\">Flying Spur</option>\n<option value=\"continentalgt\">Continental GT</option>\n<option value=\"continentalgtc\">Continental GTC</option>\n";
                    break;
            case "landrover":
                    $returnValue = "<option value=\"defender\">Defender</option>\n<option value=\"freelander\">Freelander</option>\n<option value=\"discovery\">Discovery</option>\n<option value=\"rangerover\">Range Rover</option>\n";
                    break;
            case "lotus":
                    $returnValue = "<option value=\"elise\">Elise</option>\n<option value=\"exige\">Exige</option>\n<option value=\"evora\">Evora</option>\n<option value=\"2eleven\">2-Eleven</option>\n";
                    break;
            case "morgan":
                    $returnValue = "<option value=\"evagt\">Eva GT</option>\n<option value=\"pluse\">Plus E</option>\n<option value=\"anniversdary4x4\">Anniversdary 4x4</option>\n<option value=\"aeroplus\">Aero Plus</option>\n<option value=\"roadster\">Roadster</option>\n";
                    break;
            case "acura":
                    $returnValue = "<option value=\"ilx\">ILX</option>\n<option value=\"MDX\">MDX</option>\n<option value=\"rdx\">RDX</option>\n<option value=\"tsx\">TSX</option>\n<option value=\"zdx\">ZDX</option>\n";
                    break;
            case "mazda":
                    $returnValue = "<option value=\"mazda2\">Mazda 2</option>\n<option value=\"mazda3\">Mazda 3</option>\n<option value=\"mazda6\">Mazda 6</option>\n<option value=\"mx5\">MX-5</option>\n<option value=\"cx5\">CX-5</option>\n";
                    break;
            case "nissan":
                    $returnValue = "<option value=\"leaf\">Leaf</option>\n<option value=\"sentra\">Sentra</option>\n<option value=\"altima\">Altima</option>\n<option value=\"cube\">Cube</option>\n<option value=\"titan\">Titan</option>\n";
                    break;
            case "subaru":
                    $returnValue = "<option value=\"brz\">BRZ</option>\n<option value=\"exiga\">Exiga</option>\n<option value=\"forester\">Forester</option>\n<option value=\"outback\">Outback</option>\n<option value=\"stella\">Stella</option>\n";
                    break;
            case "toyota":
                    $returnValue = "<option value=\"corolla\">Corolla</option>\n<option value=\"camry\">Camry</option>\n<option value=\"tacoma\">Tacoma</option>\n<option value=\"tundra\">Tundra</option>\n<option value=\"4runner\">4Runner</option>\n";
                    break;
            case "alfaromeo":
                    $returnValue = "<option value=\"4c\">4C</option>\n<option value=\"mito\">Mito</option>\n<option value=\"giulietta\">Giulietta</option>\n<option value=\"159\">159</option>\n<option value=\"quadrifoglio\">Quadrifoglio</option>\n";
                    break;
            case "ferrari":
                    $returnValue = "<option value=\"california\">California</option>\n<option value=\"458italia\">458 Italia</option>\n<option value=\"458spider\">458 Spider</option>\n<option value=\"f12berlinetta\">F12 Berlinetta</option>\n<option value=\"laferrari\">La Ferrari</option>\n";
                    break;
            case "fiat":
                    $returnValue = "<option value=\"punto\">Punto</option>\n<option value=\"panda\">Panda</option>\n<option value=\"500\">500</option>\n<option value=\"albea\">Albea</option>\n<option value=\"bravo\">Bravo</option>\n";
                    break;
            case "lamborghini":
                    $returnValue = "<option value=\"miura\">Miura</option>\n<option value=\"espada\">Espada</option>\n<option value=\"jarama\">Jarama</option>\n<option value=\"countach\">Countach</option>\n<option value=\"silhouette\">Silhouette</option>\n";
                    break;
            case "maserati":
                    $returnValue = "<option value=\"quattroporte\">Quattroporte</option>\n<option value=\"ghibli\">Ghibli</option>\n<option value=\"granturismo\">Gran Turismo</option>\n<option value=\"grancabrio\">Gran Cabrio</option>\n<option value=\"levante\">Levante</option>\n";
                    break;
            case "audi":
                    $returnValue = "<option value=\"a1\">A1</option>\n<option value=\"a8\">A8</option>\n<option value=\"s3\">S3</option>\n<option value=\"q5\">Q5</option>\n<option value=\"ttrs\">TT RS</option>\n";
                    break;
            case "bmw":
                    $returnValue = "<option value=\"1series\">1 Series</option>\n<option value=\"3series\">3series</option>\n<option value=\"5series\">5 Series</option>\n<option value=\"i3\">i3</option>\n<option value=\"x3\">X3</option>\n";
                    break;
            case "goliath":
                    $returnValue = "<option value=\"gp700\">GP 700</option>\n<option value=\"gp900\">GP 900</option>\n<option value=\"dreirad\">Dreirad</option>\n<option value=\"gv800\">GV 800</option>\n<option value=\"express\">Express</option>\n";
                    break;
            case "porche":
                    $returnValue = "<option value=\"911\">911</option>\n<option value=\"boxter\">Boxter</option>\n<option value=\"carrera\">Carrera</option>\n<option value=\"cayenne\">Cayenne</option>\n<option value=\"macan\">Macan</option>\n";
                    break;
            case "volkswagen":
                    $returnValue = "<option value=\"newbeetle\">New Beetle</option>\n<option value=\"jetta\">Jetta</option>\n<option value=\"passat\">Passat</option>\n<option value=\"touareg\">Touareg</option>\n<option value=\"phaeton\">Phaeton</option>\n";
                    break;
            default:
                    $returnValue = "<option selected disabled>Choose make</option>\n";
    }

    error_log("Here is the list of models: " . $returnValue);
    echo $returnValue;
?>

就像我说的那样,这在 Firefox 中非常有效,但在 IE 中根本不行。任何输入(正面或负面)将不胜感激。另外,我不能使用 jQuery。

=========================================

编辑

=========================================

作为这篇文章的后续,我应用了在 PHP 端使用 json_encode 和在 JavaScript 端使用 JSON.parse 的建议技术。这确实可以使用 Internet Explorer;但是,对于返回数千次点击的数据库调用,它确实会减慢浏览器的速度……很多!这是我现在正在使用的,使用从 data.gov 网站获得的 FEMA 灾难列表:

JavaScript:

function filtered(){
    var tableBody = document.getElementById('tableToPopulate');
    if (xmlHttp.readyState == 4 || xmlHttp.readyState == "complete"){
        var listOfDisasters = xmlHttp.responseText;
        var j = 0;
        for(var i=0; i<JSON.parse(listOfDisasters).length; i++){
            var disaster = JSON.parse(listOfDisasters)[i];
            var newRow = document.createElement("tr");
            for(var index in disaster){
                var newCell = document.createElement("td");
                var node = document.createTextNode(disaster[index]);
                newCell.appendChild(node);
                newRow.appendChild(newCell);
            }
            tableBody.appendChild(newRow);
            j++;
        }
    }
}

后端 PHP:

<?php
        $filter = (isset($_GET['filter']) && $_GET['filter'] != '') ? strip_tags($_GET['filter']) : null;
        $filterCriteria = (isset($_GET['filterCriteria']) && $_GET['filterCriteria'] != '') ? strip_tags($_GET['filterCriteria']) : null;
        $returnValue = null;
        $arrayOfResults = array();

        $query = "select fd.ID,fd.DisasterNumber,fd.DeclarationDate,i.IncidentType,s.State,fd.County,fd.ApplicantName,fd.EducationApplicant,fd.NumberOfProjects,fd.FederalShareObligated from DISASTERS fd join INCIDENTTYPE i on i.ID = fd.IncidentTypeID join STATE s on s.ID = fd.StateID where " . $filter . " like '%" . $filterCriteria . "%' order by State,County,IncidentType";
        error_log("Filter Query: " . $query);
        if($result = $dbConnection->query($query)){
                while($row = $result->fetch_object()){
                        $tmpArray = array();
                        $tmpArray['DisasterNumber'] = $row->DisasterNumber;
                        $tmpArray['DeclarationDate'] = $row->DeclarationDate;
                        $tmpArray['IncidentType'] = $row->IncidentType;
                        $tmpArray['State'] = $row->State;
                        $tmpArray['County'] = $row->County;
                        $tmpArray['ApplicantName'] = $row->ApplicantName;
                        $tmpArray['EducationApplicant'] = $row->EducationApplicant;
                        $tmpArray['NumberOfProjects'] = $row->NumberOfProjects;
                        $tmpArray['FederalShareObligated'] = $row->FederalShareObligated;
                        array_push($arrayOfResults, $tmpArray);
                }
                $result->close();
        }

        $returnValue = json_encode($arrayOfResults);

        error_log($returnValue);
        echo $returnValue;
?>

我从 data.gov 得到的数据文件超过 131K 行,所以一些数据库查询可以返回几千行。我知道这很多,但 innerHTML 方法确实比 DOM 方法工作得更快。也许有一种更有效的方法可以做到这一点。如果是这样,我将不胜感激有关此事的任何意见。

4

2 回答 2

1

.innerHTML是非标准的。大多数浏览器都支持它,但正如您发现的那样,有些浏览器比其他浏览器更好。我认为尤其是在表单的情况下,您会看到一些奇怪的行为。

正确的方法是使用 DOM API:

var option = document.createElement("option");
option.setAttribute("value", value);
selectList.appendChild(option);

仍然有一些小警告,但 IE8 及更高版本应该没问题。

于 2013-11-06T15:12:32.347 回答
0
console.log(selectListOptions);

可能在 IE 中不支持,请尝试评论此行

于 2013-11-06T15:20:03.523 回答