【问题标题】:XMLHttpRequest returning in FF but not IEXMLHttpRequest 在 FF 中返回但不在 IE 中
【发布时间】:2012-01-10 03:23:06
【问题描述】:

我正在尝试执行 AJAX 调用以根据另一个下拉框的选择来拉回数据以填充下拉框。我的代码在 FF 9.0.1(用于萤火虫)中运行良好,但在 IE 7(这是我的公司标准)中失败。我已经尝试了几种显示数据的方法,但我现在没有时间学习如何在 jQuery 中执行此操作。我敢肯定这会让人头疼,但是 IE 会导致这个问题吗?

这是我的代码页。首先是调用 JavaScript 的精简版表单。

<html>
<head>
<script language="JavaScript" src="/includes/Transaction_Update.js"></script>
<form id="submit" name="submit" action="Transaction_Process.php" method="post">
    <table align='left'>
      <tr>
        <td class='reporttd'>Vendor</td>
        <td>
          <select name='selVendorCode' id='selVendorCode' onChange="getServiceCode()">
            <option value='' selected='selected'></option>
            <?php echo $vendorOptionList; ?>
          </select>
        </td>
      </tr>
      <tr>
        <td class='reporttd'>Service Code</td>
        <td class='reporttd'>
          <select name='selServiceCode' id='selServiceCode'>
            <option value='' selected='selected'></option>
          </select>
        </td>
      </tr>
    </table>  
  </div>
</div>
</form>

JavaScript 页面

//setup xmlHttp request for Ajax call
var xmlHttp = createXmlHttpRequestObject();

function createXmlHttpRequestObject(){

    var xmlhttp;
    try{
        xmlHttp = new XMLHttpRequest();
    }
    catch(e)
    {
        var xmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
                                        "MSXML2.XMLHTTP.5.0",
                                        "MSXML2.XMLHTTP.4.0",
                                        "MSXML2.XMLHTTP.3.0",
                                        "MSXML2.XMLHTTP",
                                        "Microsoft.XMLHTTP");
        for (var i=0; i<xmlHttpVersions.length && !xmlHttp; i++){
            try{
                xmlHttp = new Activexobject(xmlHttpVersions[i]);
            }
            catch(e) {}
        }
    }

    if (!xmlHttp){
        alert("Error creating the XMLHttpRequest object.");
    }
    else{
        return xmlHttp;
    }
}
//Call page to get all service codes for a vendor.
function getServiceCode(){  
    if (xmlHttp){
        try{
            var vCode = document.getElementById("selVendorCode").value;
            var parms = "vCode=" + vCode;

            //Call Transaction_AJAX.php to pass back an XML.
            xmlHttp.open("GET", "Transaction_AJAX.php?" + parms, true);
            xmlHttp.onreadystatechange = handleRequestStateChange;
            xmlHttp.send(null);
        }
        catch(e){
            alert("Can't connect to server:\n" + e.toString());
        }
    }
}

//Checks state of the HTTP request call, and proceed if status is ready
function handleRequestStateChange(){
    if (xmlHttp.readyState == 4){
        if(xmlHttp.status == 200){
            try{
                handleServerResponse();
            }
            catch(e){
                alert("Error reading the response: " + e.toString());
            }
        }
        else{
            alert("There was a problem retrieving the data:\n" + xmlHttp.StatusText);
        }
    }
}

//Handles response from the server
function handleServerResponse(){
    var xmlResponse = xmlHttp.responseXML;
        if (!xmlResponse || !xmlResponse.documentElement){
        throw("Invalid XML Structure:\n" + xmlHttp.responseText);
    }

    var rootNodeName = xmlResponse.documentElement.nodeName;
    if(rootNodeName == "parsererror"){
        throw("Invalid XML Structure:\n" + xmlHttp.responseText);
    }

    xmlRoot = xmlResponse.documentElement;
    if(rootNodeName != "root" || !xmlRoot.firstChild){
        throw("Invalid XML structure:\n" + xmlHttp.responseText);
    }

    //Get response and load it into drop down
    responseText = xmlRoot;

    var sel = document.getElementById("selServiceCode");
    sel.options.length = 0;
    var opt = document.createElement("option");
    document.getElementById("selServiceCode").options.add(opt);
    for(var i=0; i < responseText.childElementCount; i++){
        var newOpt = new Option(responseText.childNodes[i].childNodes[1].textContent,responseText.childNodes[i].childNodes[0].textContent);
        sel.options[sel.options.length] = newOpt;
    }
}

创建 XML 文件的 PHP 页面

<?php
header('content-type:text/xml; charset=utf-8');

include("../includes/DBConn.php");

$vCode = $_GET['vCode'];

///Setup cursers and proc command
$curs = OCI_New_Cursor($c); 
$stmt = OCI_Parse($c,"begin schema.package.procedure(:var_code, :expected_cv); end;");

OCI_Bind_By_Name($stmt, ":var_code", $vCode);
OCI_Bind_By_Name($stmt,":expected_cv",&$curs,-1,OCI_B_CURSOR);

//execute statment and cursors
oci_execute($stmt); 
oci_execute($curs); 

//Create xml document
$dom = new DOMDocument('1.0', 'UTF-8');

$root = $dom->createElement('root');
$root = $dom->appendChild($root);

//loop through results of Proc
while (ocifetchinto($curs,&$vendor_cv )) { 

    //Add node for each row
    $occ = $dom->createElement("cell");
    $occ = $root->appendChild($occ);

    //Id Value
    $id = "value";
    $child = $dom->createElement($id);
    $child = $occ->appendChild($child);

    //Here is the actual value
    $id = $vendor_cv[1];
    $value = $dom->createTextNode($id);
    $value = $child->appendChild($value);

    //Id text
    $id = "text";
    $child = $dom->createElement($id);
    $child = $occ->appendChild($child);

    //Here is the actual value
    $id = $vendor_cv[1];
    $value = $dom->createTextNode($id);
    $value = $child->appendChild($value);
}
//Close xml tags and save.
$xmlString = $dom->saveXML();

//Echo XML back to Transaction_Update.js
echo $xmlString;
?>

【问题讨论】:

    标签: php ajax internet-explorer xmlhttprequest


    【解决方案1】:

    这是你在 jQuery 中的做法

    1) 在页面的 head 部分中包含 jQuery 库。 (这里我从 google cdn 引用它)

    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>  
    </head>
    

    在你的 javascript 中

    $("#stateDropDown").change(function(){
        var stateId=$("#stateDropDown").val();
        $.ajax({
          url: 'getcities.php?stateid='+stateId,
          success: function(data) {
           $("cityDropDown").html(data);       
          }
        });
    });
    

    假设您有一个 HTML 选择元素 id "stateDropDown" 代表州,另一个 id id "cityDropDown" 代表城市。

    上面的代码将完成以下操作

    1) 当 state 下拉框的值发生变化时,会执行里面的代码。

    2 ) 读取选中项的值并将其存储在一个名为 stateId 的变量中。

    3) 使用 jQuery ajax 方法,它使用名为 stateid 的查询字符串键调用 getcities.php 页面

    4) 当我们从 ajax 调用中得到响应时,控制流将在称为“success”处理程序的部分中。我们在一个名为 data 的变量中接收响应。

    5)将接收到的响应(数据)设置为城市下拉菜单的内部html。

    假设 getcities.php 页面会返回一些类似这样的输出

    <option value='1'>Ann Arbor</option>
    <option value='2'>Dexter</option>
    <option value='3'>Novi</option>
    

    jQuery 会处理你的跨浏览器问题。是的,它经过了很好的测试,每个人都在使用它。

    http://www.jquery.com

    【讨论】:

    • 感谢您的回复,但要求此更新的人希望尽快获得它。一旦事情在这里平静下来,我计划再看看这里使用 jQuery。这似乎比 JavaScript 更有效。
    【解决方案2】:

    您可以将 handleServerResponse 中的 for 循环更改为以下内容以解决此问题:

    for(var i=0; i < responseText.childNodes.length; i++){
        var node = responseText.childNodes[i];
        var text = node.childNodes[1].text ? node.childNodes[1].text : node.childNodes[1].textContent;
        var value = node.childNodes[0].text ? node.childNodes[0].text : node.childNodes[0].textContent;
        var newOpt = new Option(text,value);
        sel.options[sel.options.length] = newOpt;
    }
    

    【讨论】:

    • 谢谢!使用 textContent 和 childElementCount 而不是 text 和 childeNodes.length 会引发 IE。我想当你使用 2006 年的书和最新版本的 FireBug 时会发生这种情况。
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2020-02-21
    相关资源
    最近更新 更多