Javascript 为什么赢了';我的AJAX函数是否正确地填充了Internet Explorer中的下拉列表?
我正在用PHP编写一个页面,并且我正在尝试填充一个下拉列表,给定前面下拉列表的值。这在Firefox中非常有效,但在InternetExplorer中根本不起作用。我想知道这是不是一个侥幸,它在Firefox中工作,而不是IE,或者如果我只是在我做这件事的方式的方式。以下是我所拥有的: 主页:Javascript 为什么赢了';我的AJAX函数是否正确地填充了Internet Explorer中的下拉列表?,javascript,php,ajax,internet-explorer,firefox,Javascript,Php,Ajax,Internet Explorer,Firefox,我正在用PHP编写一个页面,并且我正在尝试填充一个下拉列表,给定前面下拉列表的值。这在Firefox中非常有效,但在InternetExplorer中根本不起作用。我想知道这是不是一个侥幸,它在Firefox中工作,而不是IE,或者如果我只是在我做这件事的方式的方式。以下是我所拥有的: 主页: <select id="make" name="make" onChange="carCompanyListHandler(this.value);"> <option sele
<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>
后端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;
?>
<?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;
?>
正如我所说,这在Firefox中工作得非常好,但在IE中根本不起作用。任何输入(正面或负面)都将非常感谢。此外,我不能使用jQuery
=======================================================
编辑
=======================================================
作为这篇文章的后续,我应用了建议的技术,在PHP端使用json_编码,在JavaScript端使用json.parse。这确实可以使用Internet Explorer工作;然而,由于数据库调用返回数千次点击,它确实减慢了浏览器的速度。。。很多以下是我现在正在处理的问题,使用我从data.gov网站上获得的FEMA灾难列表:
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;
}
}
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++;
}
}
}
函数筛选(){
var tableBody=document.getElementById('tabletopulate');
如果(xmlHttp.readyState==4 | | xmlHttp.readyState==“完成”){
var listOfDisasters=xmlHttp.responseText;
var j=0;
对于(var i=0;i
我从data.gov获得的数据文件超过131K行,因此一些数据库查询可以返回几千行。我知道这是很多,但innerHTML方法确实比DOM方法工作得更快。也许有一种更有效的方法可以做到这一点。如果是这样的话,我将非常感谢对此问题的任何意见。
。innerHTML
不是s大多数浏览器都支持它,但是你已经发现有些浏览器比其他浏览器更好。我认为特别是在表单的情况下,你可以看到一些奇怪的行为
正确的方法是使用DOM API:
var option = document.createElement("option");
option.setAttribute("value", value);
selectList.appendChild(option);
还有一些小的警告,但IE8及以上应该可以
console.log(selectListOptions);
可能在IE中不支持,请尝试注释这一行IE的哪个版本?您在控制台中是否收到任何错误消息?
控制台。除非控制台打开,否则日志
在IE中不起作用。因此,只有在测试时才使用console.log
。IE 8…没有错误,它根本不起作用。看起来它几乎可以在IE中工作t I get,看起来像什么,下拉列表为空。始终使用以正确编码查询字符串参数(变量名和值)。(在这种情况下这并不重要,但您可能最终尝试发送应编码的字符。)您还应该检查xmlHttp.status
,它可能不是200。console.log(selectListOptions)输出是什么?那么,如果我的PHP函数发回多行,我该怎么做呢?划出每行的末尾,使用JavaScript“拆分”方法,并循环每一个?IE是第一个支持.innerHTML
的浏览器。我也经常使用它,而且没有任何错误。@Brian您也可以发回JSON格式的文本并用JavaScript构建菜单。是的,我同意@MarcelKorpel。JSON在这方面非常好。用PHP和构建您的选项数组>echo json_encode($options)
。然后在JavaScript中你可以json.parse(responseText)
,你就有了你的数组。@Brian注意,json.parse
仅受IE>=8支持。对于低于此值的任何内容,请使用来自的json2.js
或json_sans\u eval
。