[英]AJAX and PHP get files and folders list using RecursiveIteratorIterator as needed
I need get list of files and folders from server. 我需要从服务器获取文件和文件夹列表。
I don't want get all files, folders, sub-folders at once. 我不想一次获取所有文件,文件夹,子文件夹。
I want get theirs little by little, as needed. 我想根据需要一点一点地得到他们的。 So I use AJAX.
所以我使用AJAX。
I use PHP. 我用PHP。 I use RecursiveIteratorIterator.
我使用RecursiveIteratorIterator。
I did it without AJAX, but I can't do it using AJAX : 我是在没有AJAX的情况下完成的,但我无法使用AJAX :
It works only for first directory (~root directory). 它仅适用于第一个目录(~root目录)。 I can't pass $name variable in function.
我无法在函数中传递$ name变量。
**Not JQuery!!!** **不是JQuery !!! **
PHP PHP
<?php
if (isset($_GET['you_choose_directory'])){print "do something";}
getList("/start_folder/"); //always(
function getList($name) {
$path = realpath($name);
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CATCH_GET_CHILD);
foreach($objects as $name => $object){
if (filetype($name) == "dir") {
print "<a href='?you_choose_directory=" . basename($name) . "'><b>" . basename($name) . "</b></a>";
} else {
print "<a><div></div><b>" . basename($name) . "</b></a>";
}
}
}
?>
JAVASCRIPT JAVASCRIPT
function getXmlHttp(){
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
function do_it() {
var req = getXmlHttp();
var list = document.getElementById('it_is_files');
req.onreadystatechange = function() {
if (req.readyState == 4) {
if(req.status == 200) {
list.innerHTML = req.responseText;
}
}
}
req.open('GET', 'php.php', true);
req.send(null);
list.innerHTML = 'loading...';
}
do_it();
HTML HTML
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="utf-8"/>
<title>file list</title>
<script src="javascript.js"></script>
</head>
<body onload="doOnLoad();">
<div id="it_is_files">
</div>
</body>
</html>
Thanks. 谢谢。
(I don't know PHP.) (我不懂PHP。)
The reason it only works for your root directory is because of this: 它仅适用于您的根目录的原因是:
print "<a href='?you_choose_directory=" . basename($name) . "'><b>" . basename($name) . "</b></a>";
You are making a link to the html page you are on, so the page reloads and everything starts over. 您正在链接到您所在的html页面,因此页面重新加载,一切都重新开始。 You need to set the href of that a tag to javascript:void so the page doesn't reload.
您需要将该标记的href设置为javascript:void,以便页面不会重新加载。 Then you need to add an onClick event handler to call your do_it() function and pass it the path to the directory whose contents you want to list.
然后,您需要添加一个onClick事件处理程序来调用do_it()函数,并将路径传递给要列出其内容的目录。 You will need to change do_it() so that it can accept a parameter.
您需要更改do_it()以便它可以接受参数。
HTML and javascript: HTML和javascript:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="utf-8"/>
<title>file list</title>
<script type="text/javascript">
function getXmlHttp(){
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
function do_it(dirName) {
var req = getXmlHttp();
var list = document.getElementById('it_is_files');
req.onreadystatechange = function() {
if (req.readyState == 4) {
if(req.status == 200) {
list.innerHTML = req.responseText;
}
}
}
req.open('GET', 'getList.php?you_choose_directory=' + dirName, true);
req.send(null);
list.innerHTML = 'loading...';
}
</script>
</head>
<body onload="do_it('');">
<div id="it_is_files">
</div>
</body>
</html>
PHP: PHP:
<?php
$dir = "./"; //default to root directory
if (strlen($_GET['you_choose_directory']) > 0){$dir = $_GET['you_choose_directory'];}
getList($dir);
function getList($name) {
$path = realpath($name);
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CATCH_GET_CHILD);
foreach($objects as $name => $object){
if (filetype($name) == "dir") {
print "<br/><a href='javascript:void' onClick='do_it(\"" . $path . "/" . basename($name) . "\")'><b>" . basename($name) . "</b></a>";
} else {
print "<br/><a><b>" . basename($name) . "</b></a>";
}
}
}
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.