Javascript XMLHttpRequest不会与IE 8或9一起发送,但可以与IE 10一起使用
我目前在使用低于10的IE版本时遇到了很多麻烦,而我对Firefox、Chrome、Safari、Opera甚至IE 10都没有问题。我的网站只显示了3个链接在一起的选择菜单,其中2个在第一个菜单和第二个菜单中选择了某个内容时,就会被来自mysql数据库的数据填满。使用IE 8或9时,Apache日志不会显示正在执行的任何POST请求,并且我的选择菜单不会充满数据 这是我的javascript代码:Javascript XMLHttpRequest不会与IE 8或9一起发送,但可以与IE 10一起使用,javascript,internet-explorer-8,internet-explorer-9,xmlhttprequest,Javascript,Internet Explorer 8,Internet Explorer 9,Xmlhttprequest,我目前在使用低于10的IE版本时遇到了很多麻烦,而我对Firefox、Chrome、Safari、Opera甚至IE 10都没有问题。我的网站只显示了3个链接在一起的选择菜单,其中2个在第一个菜单和第二个菜单中选择了某个内容时,就会被来自mysql数据库的数据填满。使用IE 8或9时,Apache日志不会显示正在执行的任何POST请求,并且我的选择菜单不会充满数据 这是我的javascript代码: function getXMLHttpRequest() { var xhr = nul
function getXMLHttpRequest() {
var xhr = null;
if (window.XMLHttpRequest || window.ActiveXObject) {
if (window.ActiveXObject) {
try {
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
} else {
xhr = new XMLHttpRequest();
}
} else {
alert("Your browser doesn't support XMLHTTPRequest...");
return null;
}
return xhr;
}
function request(oSelect) {
var value = oSelect.options[oSelect.selectedIndex].value;
var xhr = getXMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
displayOptions(xhr.responseText, oSelect);
}
}
xhr.open("POST", "ajax.pl", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(oSelect.name + "=" + value);
}
function displayOptions(oData, oSelect) {
if (oSelect.name == "genus") {
document.getElementsByName("species")[0].disabled = false;
document.getElementsByName("species")[0].innerHTML = oData;
document.getElementsByName("subspecies")[0].disabled = true;
document.getElementsByName("subspecies")[0].innerHTML = "";
}
if (oSelect.name == "species") {
document.getElementsByName("subspecies")[0].disabled = false;
document.getElementsByName("subspecies")[0].innerHTML = oData;
}
}
到目前为止,我已经尝试将POST中的xhr.open命令更改为GET,但没有成功。我还尝试在xhr.send命令中放置perl cgi的绝对路径,但对IE8没有任何影响
我也试过以下方法:
xhr.onreadystatechange = function() {
if(xhr.readyState == 0) {
alert("zero");
}
if(xhr.readyState == 1) {
alert("one");
}
if(xhr.readyState == 2) {
alert("two");
}
if(xhr.readyState == 3) {
alert("three");
}
if(xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
alert("four");
displayOptions(xhr.responseText, oSelect);
}
}
这为我提供了Chrome的以下输出:
one
two
three
four
我用IE 8制作了这个:
one
one
four
因为我是个新手,我没能找到导致这个问题的原因。我一直在网上寻找答案,但仍然没有找到答案
当我开始绝望的时候,任何人都会非常感激。我按照奥斯卡的建议使用jQuery找到了一个解决办法 下面是我在上面的帖子中替换js函数的代码,它的工作方式很有魅力:
$(document).ready(function() {
var $genus = $('#genus');
var $species = $('#species');
var $subspecies = $('#subspecies');
$genus.on('change', function() {
var value = $(this).val();
$species.empty();
$subspecies.empty();
if(value != '') {
$species.removeAttr('disabled');
$subspecies.attr('disabled', 'disabled');
$.ajax({
url: 'ajax.pl',
data: 'genus=' + value,
dataType: 'html',
success: function(code_html) {
$(code_html).appendTo('#species');
}
});
} else {
$species.attr('disabled', 'disabled');
$subspecies.attr('disabled', 'disabled');
}
});
$species.on('change', function() {
var value = $(this).val();
$subspecies.empty();
if (value != '') {
$subspecies.removeAttr('disabled');
$.ajax({
url: 'ajax.pl',
data: 'species=' + value,
dataType: 'html',
success: function(code_html) {
$(code_html).appendTo('#subspecies');
}
});
} else {
$subspecies.attr('disabled', 'disabled');
}
});
});
我按照Oscar的建议,通过使用jQuery找到了一个解决方法 下面是我在上面的帖子中替换js函数的代码,它的工作方式很有魅力:
$(document).ready(function() {
var $genus = $('#genus');
var $species = $('#species');
var $subspecies = $('#subspecies');
$genus.on('change', function() {
var value = $(this).val();
$species.empty();
$subspecies.empty();
if(value != '') {
$species.removeAttr('disabled');
$subspecies.attr('disabled', 'disabled');
$.ajax({
url: 'ajax.pl',
data: 'genus=' + value,
dataType: 'html',
success: function(code_html) {
$(code_html).appendTo('#species');
}
});
} else {
$species.attr('disabled', 'disabled');
$subspecies.attr('disabled', 'disabled');
}
});
$species.on('change', function() {
var value = $(this).val();
$subspecies.empty();
if (value != '') {
$subspecies.removeAttr('disabled');
$.ajax({
url: 'ajax.pl',
data: 'species=' + value,
dataType: 'html',
success: function(code_html) {
$(code_html).appendTo('#subspecies');
}
});
} else {
$subspecies.attr('disabled', 'disabled');
}
});
});
这就是JS框架存在的原因。。我认为旧版IE不喜欢使用.innerHTML填充选择元素。为什么要先测试window.ActiveXObject?IE从版本7开始就支持window.XMLHttpRequest以获得基本支持。另外,如果您不在另一个函数中测试null,那么当浏览器不支持null返回时,为什么还要编写null返回代码呢@CrazyTrain-这不会阻止Ajax请求到达Web服务器。@nnnnnn:你是对的,尽管在日志警报中,OP显示readyState为4。你能将代码更改为先测试XMLHTTPRequest吗?直觉告诉我们,在IE上,虽然可以使用XMLHTTP,但您正在测试ActiveX,得到了真实的结果,并基于它设置了一个对象。可能您的计算机等上的ActiveX权限存在问题。您正在捕获0的xml.status,该状态为“未初始化”,因此失败将在代码中输出“四”。这就是JS框架存在的原因。。我认为旧版IE不喜欢使用.innerHTML填充选择元素。为什么要先测试window.ActiveXObject?IE从版本7开始就支持window.XMLHttpRequest以获得基本支持。另外,如果您不在另一个函数中测试null,那么当浏览器不支持null返回时,为什么还要编写null返回代码呢@CrazyTrain-这不会阻止Ajax请求到达Web服务器。@nnnnnn:你是对的,尽管在日志警报中,OP显示readyState为4。你能将代码更改为先测试XMLHTTPRequest吗?直觉告诉我们,在IE上,虽然可以使用XMLHTTP,但您正在测试ActiveX,得到了真实的结果,并基于它设置了一个对象。可能您的计算机等上的ActiveX权限有问题。您正在捕获0的xml.status,该值为“未初始化”,因此失败将在代码中输出“四”。有时使用jQUERY不是我们喜欢的奢侈品。有时使用jQUERY不是我们喜欢的奢侈品。