jQuery的.find()基于ajax.dataType表现不同

时间:2011-04-14 05:02:23

标签: jquery

我有两个网页; “Foo.aspx”和“Bar.aspx”。 Bar.aspx使用jQuery.ajax()从Foo.aspx请求一串数据。 Foo.aspx只返回

<SerialNumber>12345-ABC</SerialNumber>

成功返回后,Bar.aspx将使用.find()来显示

  

12345-ABC

以下是使示例更清晰的示例代码(简化):

Bar.aspx

<script type='text/javascript'>
    $(document).ready(function () { 
        getData();    
    });

    function getData() {
        $.ajax({ 
            url: '/Foo.aspx', 
            dataType: 'xml', 
            cache: false, 
            data: {cmd: 'sn'}   
        })
        .success(parseData)
        .error(displayError);  
    }

    function parseData(data) { 
        var sn = $(data).find('SerialNumber').text(); 
        $('#serialNumber').text(sn); 
        window.setTimeout(getData, 1000);  
    }

    function displayError(error) { 
        $('#error').text('Error occurred getting data');  
    }
</script>
<div>
    <label>Serial Number:</label> 
    <label id='serialNumber'></label> 
</div>
<div id='error'></div>

Foo.aspx

public void Page_Load(object sender, EventArgs e)
{
    string response = string.Empty;
    if (Request.QueryString["cmd"] != null)
    {
        switch (Request.QueryString["cmd"])
        {
            case "sn":
                response = "<SerialNumber>12345-ABC</SerialNumber>";
                break;
         }
    }

    Response.Write(response);
    Response.Flush();
}

$ .ajax()调用一直没有任何问题。但是,根据我指定的dataType: AND取决于我使用的浏览器类型(Chrome,Firefox或IE),.find()方法将会或不会起作用。更具体地说,数据12345-ABC不会显示在浏览器中。

可能需要注意的是,我使用Fiddler2来观察从Foo.aspx返回的数据,而<SerialNumber>12345-ABC</SerialNumber>字符串实际上是返回到Bar.aspx。换句话说,我知道数据存在于.find()中解析。

分解dataType和浏览器结果,这是我发现的:

dataType = "text or html or script or excluded"时 - Chrome和Firefox成功显示序列号。另一方面,IE无法显示序列号。

dataType = "xml" - IE成功显示序列号时,Chrome和Firefox无法显示序列号。

为什么dataType会影响.find()的工作方式(或者不工作),更重要的是,我可以做些什么来让.find()在Chrome / FF / IE中工作而不必运行不同的代码基于浏览器类型?

1 个答案:

答案 0 :(得分:1)

我怀疑你有标签案例问题。你可以安排让XML带回小写标签吗?

<serialnumber>12345-ABC</serialnumber>

然后你会在parseData中执行此操作:

var sn = $(data).find('serialnumber').text();

如果您无法更改XML,请尝试仅更改parseData

HTML中的标签应该不区分大小写,但在XML中它们区分大小写。我通常将所有标签放在小写字母中,以便我不必处理浏览器,解析器或上下文混淆。