MozTW 討論區
https://forum.moztw.org/

"childNodes.length"firefox抓到的長度怪怪的
https://forum.moztw.org/viewtopic.php?f=18&t=14566
1 頁 (共 1 頁)

發表人:  engine [ 2006-06-16, 11:08 ]
文章主題 :  "childNodes.length"firefox抓到的長度怪怪的

httprequest_test_xml.html
代碼:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <script type="text/javascript" language="javascript">

            var http_request = false;

            function makeRequest(url) {

                http_request = false;

                if (window.XMLHttpRequest) { // Mozilla, Safari,...
                    http_request = new XMLHttpRequest();
                    if (http_request.overrideMimeType) {
                        http_request.overrideMimeType('text/xml');
                    }
                } else if (window.ActiveXObject) { // IE
                    try {
                        http_request = new ActiveXObject("Msxml2.XMLHTTP");
                    } catch (e) {
                        try {
                        http_request = new ActiveXObject("Microsoft.XMLHTTP");
                        } catch (e) {}
                    }
                }

                if (!http_request) {
                    alert('Giving up :( Cannot create an XMLHTTP instance');
                    return false;
                }
                http_request.onreadystatechange = alertContents;
                http_request.open('GET', url, true);
                http_request.send(null);

            }

            function alertContents() {

                if (http_request.readyState == 4) {
                    if (http_request.status == 200) {
                        var xmldoc = http_request.responseXML;
                  var root_node = xmldoc.getElementsByTagName('root')[0];
                  var g2=root_node.childNodes.length;
                        document.write(g2);
                    } else {
                        alert('There was a problem with the request.');
                    }
                }

            }
        </script>
    </head>
    <body>
        <span
            style="cursor: pointer; text-decoration: underline"
            onclick="makeRequest('test.xml')">
                Make a request
        </span>
    </body>
</html>

test.xml
代碼:
<?xml version="1.0" ?>
<root>
   <rf>wwdw</rf>
   <rf>wewe</rf>
   <rf>4452</rf>
</root>

好奇怪,在IE能夠正確抓到<rf>的長度為3
但是FireFox卻是抓到"7",怎麼會這樣?請大大幫忙[/code]

發表人:  engine [ 2006-06-16, 11:40 ]
文章主題 : 

如同對於標準 HTML,對於可各方面控制 XML 檔的 DOM 的支援,Mozilla 也是依 W3C 所定的 XML DOM 規格。
Mozilla 與 Internet Explorer 在 XML DOM 上的不同處大多在於 Internet Explorer 非標準的處理方式。
一個常見的差異是對空白字元節點的處理。 通常在建立 XML 時,XML 節點間會有空白。 Internet Explorer 用 XMLNode.childNodes[] 時不會包括這些空白節點,
但在 Mozilla 上這些節點會在 array 裡。

所以只要把test.xml變成
代碼:
<?xml version="1.0" ?>
<root><rf>wwdw</rf><rf>wwdw</rf><rf>wwdw</rf></root>

就會找到正常的長度
雖然在http://wiki.moztw.org/index.php/%E8%BD%89%E6%8F%9B%E7%B6%B2%E9%A0%81%E7%A8%8B%E5%BC%8F%EF%BC%9A%E5%BE%9E_IE_%E5%88%B0_Mozilla#.E6.8E.8C.E6.8E.A7_XML
中的"掌控XML"有用for迴圈去避開空白節點,但我不知道怎麼套用上我這個程式,請問那位大大可以給於協助嗎?感激不盡

發表人:  kourge [ 2006-06-19, 21:12 ]
文章主題 : 

把這一段...
var g2=root_node.childNodes.length;
改成這一段
var blah=root_node.childNodes;
var g2=0;
for (i = 0; i < blah.length; i++){
if (blah[i].nodeType != 3 && blah[i].nodeType != 8) g2++;
}

在此,blah 可以改成隨便你要的名稱

發表人:  ianjung [ 2006-08-26, 14:32 ]
文章主題 : 

以下是我發生的問題,不知是否有人知道為什麼

我在 IE 執行都是正常的,但是在 Firefox 卻出現問題了,先說明 XML 檔案沒問題。

第一個
代碼:
alert(CalXml_request.readyState);

執行呈現 1,照程式判斷應該是直接執行
代碼:
alert('CalXml_request.readyState != 4.');

才對,但是卻執行了
代碼:
alert(CalXml_request.readyState);
alert(Cal_xmldoc);

而這回的
代碼:
alert(CalXml_request.readyState);

卻是呈現 4。

如果把第一個
代碼:
alert(CalXml_request.readyState);

這段拿掉
程式直接跳到
代碼:
alert('CalXml_request.readyState != 4.');

然後結束..@@

完整程式碼如下

代碼:
<script type="text/javascript" language="javascript">
<!--


function makeRequest(url) {

   var http_request = false;

   if (window.XMLHttpRequest) { // Mozilla, Safari,...
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType) {
         http_request.overrideMimeType('text/xml');
      }
   } else if (window.ActiveXObject) { // IE
      try {
         http_request = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
         try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
         } catch (e) {}
      }
   }

   if (!http_request) {
      alert('Giving up :( Cannot create an XMLHTTP instance');
      return false;
   }
   
   http_request.open('GET', url, true);
   http_request.send(null);
   
   
   return http_request;
}


function GetXmlData() {
   var cal_xml = 'http://127.0.0.1/baby2/rss/mem_calendar/cal_mem_2.xml';
   var CalXml_request = makeRequest(cal_xml);
   
   alert(CalXml_request.readyState);
   if (CalXml_request.readyState == 4) {
      if (CalXml_request.status == 200) {
         var Cal_xmldoc = CalXml_request.responseXML;
         alert(CalXml_request.readyState);
         alert(Cal_xmldoc);
                     
      } else {
         alert('CalXml_request.status != 200.');
      }
   }else{
      alert('CalXml_request.readyState != 4.');
   }

}


-->
</script>


<span onclick="GetXmlData();"> Make a request </span>



發表人:  kourge [ 2006-08-26, 22:12 ]
文章主題 : 

這年頭做 Ajax 的,沒有人在自己又寫 XMLHttpRequest 的控制碼,因為各瀏覽器的行為怪癖很多,所以建議使用 Prototype 或者是 Dojo 這兩個 library。這樣的話,部分就已經有 library 幫你解決了。
我個人是偏好 Prototype。

發表人:  roytam1 [ 2006-08-26, 22:35 ]
文章主題 : 

ianjung 寫:
以下是我發生的問題,不知是否有人知道為什麼

我在 IE 執行都是正常的,但是在 Firefox 卻出現問題了,先說明 XML 檔案沒問題。

第一個
代碼:
alert(CalXml_request.readyState);

執行呈現 1,照程式判斷應該是直接執行
代碼:
alert('CalXml_request.readyState != 4.');

才對,但是卻執行了
代碼:
alert(CalXml_request.readyState);
alert(Cal_xmldoc);

而這回的
代碼:
alert(CalXml_request.readyState);

卻是呈現 4。

如果把第一個
代碼:
alert(CalXml_request.readyState);

這段拿掉
程式直接跳到
代碼:
alert('CalXml_request.readyState != 4.');

然後結束..@@

完整程式碼如下

代碼:
<script type="text/javascript" language="javascript">
<!--


function makeRequest(url) {

   var http_request = false;

   if (window.XMLHttpRequest) { // Mozilla, Safari,...
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType) {
         http_request.overrideMimeType('text/xml');
      }
   } else if (window.ActiveXObject) { // IE
      try {
         http_request = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (e) {
         try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
         } catch (e) {}
      }
   }

   if (!http_request) {
      alert('Giving up :( Cannot create an XMLHTTP instance');
      return false;
   }
   
   http_request.open('GET', url, true);
   http_request.send(null);
   
   
   return http_request;
}


function GetXmlData() {
   var cal_xml = 'http://127.0.0.1/baby2/rss/mem_calendar/cal_mem_2.xml';
   var CalXml_request = makeRequest(cal_xml);
   
   alert(CalXml_request.readyState);
   if (CalXml_request.readyState == 4) {
      if (CalXml_request.status == 200) {
         var Cal_xmldoc = CalXml_request.responseXML;
         alert(CalXml_request.readyState);
         alert(Cal_xmldoc);
                     
      } else {
         alert('CalXml_request.status != 200.');
      }
   }else{
      alert('CalXml_request.readyState != 4.');
   }

}


-->
</script>


<span onclick="GetXmlData();"> Make a request </span>


如果你在AJAX中用alert()的話是不準確的

發表人:  pinker [ 2006-08-26, 22:39 ]
文章主題 : 

這個跟空白字元 (此空白字元包含:空白 [Space]、定位 [Tab]、Carriage return [\r] 與 Line feed (newline) [\n]) 有關。

對 MS XML 來說,他預設會將這些空白字元濾掉,而 Mozilla 則不會濾掉,直接以 Node 的形式存在,所以導致兩者取得的 childNodes.length 會有所不同。

1 頁 (共 1 頁) 所有顯示的時間為 UTC + 8 小時
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/