2015-01-04 11 views
5

Soruyu sorduğumda sunucuda javascript liste dosyaları, "javascript, sunucu dosya sistemine erişemiyor çünkü bir client-side scripting language". Ama cevabın sadece kısmen doğru olduğunu düşündüm, çünkü tarayıcı dirlisting etkinse, sunucu dizininin içeriğini listeleyebilir. Bu yüzden, xml biçiminde ihtiyacınız olan verileri görebildiğinizde, cgi'u kullanmaya gerek kalmadan çıktıyı ayrıştırmaya çalıştım. Ben lighttpd kullanıyorumJavaScript'i kullanarak liste sunucusu dizini XHR

ve lighttpd.conf önemli girdileri şunlardır: Yani burada ne yaptım XHR sınamak için kullanılan

dir-listing.activate = "enable"     #enables directory listing 
dir-listing.auto-layout = "disable"    #simplifies the list style 
mimetype.assign   = (".xml" => "text/xml") #deals with xmls 

test.xml şuna benzer:

<?xml version="1.0"?> 
<anchors> 
<a>foo</a> 
<a>bar</a> 
</anchors> 

Dizin girişi sayfasında, lighttpdmod_dirlisting.so:

tarafından oluşturulmaktadır
<?xml version="1.0" encoding="iso-8859-1"?> 
<h2>Index of /directory/</h2> 
<div class="list"> 
<table summary="Directory Listing" cellpadding="0" cellspacing="0"> 
<thead><tr><th class="n">Name</th><th class="m">Last Modified</th><th class="s">Size</th><th class="t">Type</th></tr></thead> 
<tbody> 
<tr><td class="n"><a href="../">Parent Directory</a>/</td><td class="m">&nbsp;</td><td class="s">- &nbsp;</td><td class="t">Directory</td></tr> 
<tr><td class="n"><a href="foo">foo</a></td><td class="m">2015-Jan-03 13:24:12</td><td class="s">39.4K</td><td class="t">application/octet-stream</td></tr> 
</tbody> 
</table> 
</div> 
oluşturmak için kullanılan

test.html sayfa: (bir uyarı kutusunda 'foo' get) iyi çalışır, ancak tüm bunlar

<html><head></head><body><script> 

if (window.XMLHttpRequest) var request = new XMLHttpRequest(); 
else var request = new ActiveXObject('Microsoft.XMLHTTP'); 
request.open('post', 'test.xml', true); 
request.send(); 
if (request) request.onreadystatechange = function() alert(request.responseXML.getElementsByTagName('a')[1].childNodes[0].nodeValue); 

</script></body></html> 

Ben request.open dizin yerine xml, hiçbir şey, hatta içeri girince hata konsolu

cevap

3

Kodunuzda birkaç sorun var. Yeni başlayanlar için, JavaScript dosyanızda request.readyState4 mesajına girmeden önce request.responseXML numaralı telefondan erişebilirsiniz. Bu noktada, bu özellik mevcut olmamalı, bu yüzden bazı hatalar almalısınız. Bu oldukça kolay bir şekilde sabitlenebilir. Bununla birlikte, başka bir sorunla karşılaşırsınız. Çıktınızı XML olarak ayrıştırmaya çalışıyorsunuz, ancak geçerli bir XML belgesi veya bu konu için geçerli bir HTML belgesi değil. Tek bir kök düğümü olabileceğinden, çıktıyı geçerli bir XML belgesi olması için sarmalayan başka bir öğeye sahip olmanız gerekir. Ayrıca, &nbsp; XML'de desteklenmez, bu nedenle de or replaced kaldırılması gerekir. Aşağıdaki gibi bir şey işe yarayacaktı.

<?xml version="1.0" encoding="iso-8859-1"?> 
<xml> 
<h2>Index of /directory/</h2> 
<div class="list"> 
<table summary="Directory Listing" cellpadding="0" cellspacing="0"> 
<thead><tr><th class="n">Name</th><th class="m">Last Modified</th><th class="s">Size</th><th class="t">Type</th></tr></thead> 
<tbody> 
<tr><td class="n"><a href="../">Parent Directory</a>/</td><td class="m"></td><td class="s">- </td><td class="t">Directory</td></tr> 
<tr><td class="n"><a href="foo">foo</a></td><td class="m">2015-Jan-03 13:24:12</td><td class="s">39.4K</td><td class="t">application/octet-stream</td></tr> 
</tbody> 
</table> 
</div> 
</xml> 

Ayrıca XMLHttpRequest ait responseType özelliğini kullanarak ilginizi çekebilir. Bu özelliği 'document' olarak ayarlarsanız, XML yanıtı yerine HTML yanıtını ayrıştırabilirsiniz.

request.open('post', 'dir/', true); 
request.responseType = 'document'; 
request.send(); 
+1

'(request.readyState' kod örneği kısalık için ihmal edilmiştir, ve, 'xml' dosya mod_dirlisting.so' sunucu modülü' tarafından oluşturulan, bu nedenle onun yarı yanlış bir çıkış yönetemeyeceğiniz' ve nbsp' vs) herhangi bir şekilde, ama aslında benim sorununun doğrudan cevabı olan 'request.responseType = 'document'' kullanarak çıktısını ayrıştırmaktan vazgeçebilirim. Teşekkür ederim. – Ulrik

İlgili konular