仍不能確定您的問題每個頁面加載只能觸發一次。如果沒有看到更多的代碼,就很難合理地進行猜測。從來沒有,這裏有一個例子,我把你如何以更有用的方式呈現返回的數據放在一起。
該代碼要求您下載我在前面的評論中提到的AjaxRequest庫。 (http://ajaxtoolbox.com/request/)
在這裏,我演示了一些原則。
- 的數據排列成一個PHP類
- 構造此類
- 的實例返回這個數組作爲JSON
- 捕捉JSON文本並將它回對象在JS
的陣列
- 處理數據
我已經給出了2個非常簡單的例子 - 第一個簡單地加載當前目錄中的所有文件名(即hol ds jsonDir.php)轉換爲select元素。選擇文件名會導致它被複制到按鈕旁邊的文本輸入中。
第二,只檢索png文件的名稱。它將它們全部加入到select元素中。然而,這一次,當一個項目被選中時,它被用作圖像的src。在每種情況下,只有在按下相應按鈕時纔會抓取文件名。有一點冗餘/否則蹩腳的代碼我可以做得更好,但20小時清醒後,我準備好睡覺了!
希望這對您有用。任何問題,只要問。 :)
1 jsonDir.php
<?php
class mFile
{
public $name, $time, $size;
}
if (!isset($_GET['wildcard']))
$wildCard = "*.*";
else
$wildCard = $_GET['wildcard'];
foreach (glob($wildCard) as $curFilename)
{
$curFileObj = new mFile;
$curFileObj->name = $curFilename;
$curFileObj->time = date("d/m/Y - H:i", filectime($curFilename));
$curFileObj->size = filesize($curFilename);
$fileArray[] = $curFileObj;
}
printf("%s", json_encode($fileArray));
?>
2. readDir.html
<!DOCTYPE html>
<html>
<head>
<script type='text/javascript' src='script/ajaxRequestCompressed.js'></script>
<script>
function byId(e){return document.getElementById(e);}
function newEl(tag){return document.createElement(tag);}
function myGetAjaxResponseWithCallback(url, target, callbackFunc)
{
AjaxRequest.get(
{
'url':url,
'onSuccess':function(req){ callbackFunc(req.responseText, target); }
}
);
}
function getResults1()
{
var url = "jsonDir.php";
var target = byId('resultsDiv');
myGetAjaxResponseWithCallback(url, target, jsonDataReceived1);
}
function getResults2()
{
var url = "jsonDir.php?wildcard=*.png";
var target = byId('resultsDiv2');
myGetAjaxResponseWithCallback(url, target, jsonDataReceived2);
}
function jsonDataReceived1(responseText, targetContainer)
{
var resultObject = JSON.parse(responseText);
targetContainer.innerHTML = "";
var mStr = "There were " + resultObject.length + " records returned" + "<br>";
var mSel = newEl("select");
mSel.addEventListener('change', doAutofill, false);
var i, n = resultObject.length;
for (i=0; i<n; i++)
{
var curRecordOption = new Option(resultObject[i].name, i);
mSel.appendChild(curRecordOption);
}
targetContainer.innerHTML = mStr;
targetContainer.appendChild(mSel);
}
function jsonDataReceived2(responseText, targetContainer)
{
var resultObject = JSON.parse(responseText);
targetContainer.innerHTML = "";
var mSel = newEl("select");
mSel.addEventListener('change', showSelectedImg, false);
var i, n = resultObject.length;
for (i=0; i<n; i++)
{
var curRecordOption = new Option(resultObject[i].name, i);
mSel.appendChild(curRecordOption);
}
targetContainer.innerHTML = '';
targetContainer.appendChild(mSel);
}
function doAutofill(e)
{
var curSelIndex = this.value;
var curText = this.options[curSelIndex].label;
byId('autofillMe').value = curText;
}
function showSelectedImg(e)
{
byId('previewImg').src = this.options[this.value].label;
}
</script>
<style>
img
{
border: solid 2px #333;
}
</style>
</head>
<body>
<button onclick='getResults1()'>Get *.* dir listing</button> <input id='autofillMe'/>
<div id='resultsDiv'></div>
<hr>
<button onclick='getResults2()'>Get *.png dir listing</button> <img id='previewImg' width='100' height='100'/>
<div id='resultsDiv2'></div>
</body>
</html>
當你說它只會觸發一次。你究竟意味着什麼 - 每次發佈密鑰時它只會觸發一次,或者只觸發一次頁面,或者其他事情? – enhzflep
每次瀏覽器負載都會觸發一次。所以,我輸入「a」,然後用「a」加載所有內容,然後當我輸入「b」時,它不會再次啓動。我必須重新加載瀏覽器才能重置,以便再次啓動。 –
嗯,這有點奇怪。我通常使用AjaxRequest庫(http://ajaxtoolbox.com/request/),因爲它可以毫不費力地處理多個並行請求,而且比jQuery輕得多,我對此沒有興趣 - 我以爲ajax的東西可能有一直在倒下,但也從你的代碼中拼湊出了一個功能性示例。 PHP有點時髦 - 我猜這不是一個副本,而是一個look'n'retype問題。我會把結果放入一個數組中,然後將其作爲JSON返回。然後,您可以以任何方式加載和使用陣列中的元素。 – enhzflep