对于措辞严厉的标题,我很抱歉,如果我的解释很黯淡,我还要提前道歉。我对JavaScript和Ajax的了解并不是那么好。
无论如何,所以,我想要做的是使用PHP显示项目列表,然后当点击一个项目时,将显示一个弹出窗口,基本上询问用户是否想要将项目添加到数据库(它是基本上从一个DB导入到另一个DB)。部分弹出窗口是一个下拉列表,其中包含导入项目的可能父项。 (因此,如果要导入名为Vista的项目,则可以将其放在父类别“OS”中)。
为了生成下拉列表,必须发出ajax请求,并且后端PHP使用JSON对象进行回复,该对象包含下拉列表中需要包含的所有元素。
因此,作为测试AJAX连接是否有效的测试,我只是随意在窗口上放置一个按钮,如下所示:
<div align="center" onclick="test()">TEST BUTTON </div>
并有一个名为test
的JS函数:
function test(){
var url = "index.php?module=getlist";
//Code to send post request with a callback to function test2();
}
和函数test2():
function test2(data){
if (data){
alert(data.Project[0].id);
}
else {
alert("ERROR");
}
}
注意:PHP代码返回一个JSON对象,其中一个子对象物称为Project,它是一个关联数组,其中包含id和name等字段。
以上作品。警告框显示与项目ID对应的数字。
但是,我们希望有一个包含列表的弹出窗口!所以,我们得到一些像这样的HTML:
<td align="center" onclick="collection('Random_Name', 'Random_Description')">Project 1</td>
注意:我将项名称和描述的值传递给名为collection的JS函数。
function collection(name, description){
test();
//Stuff that creates the popup, creates a form in the popup, and populates the form with default values(name and description).
// Following Stuff is used to make the drop down.
var tempdata = new Array(new Array());
tempdata[0]['name'] = json.Project[0].name;
tempdata[0]['value'] = json.Project[0].id;
//This function creates the Select list, it requires a name, default value, and
//a multi-dimensional array like the one defined above.
var pacolist = createSelect("collection_list",'',tempdata)
//Append the elements together and add a save button.
}
为了尝试让它工作,我在页面顶部声明了一个名为json的全局变量。我将test2()中的alert(data.Project[0].id);
更改为json = data;
但是,它没有用。
单击打开弹出窗口时出现Uncaught TypeError: Cannot read property 'Project' of undefined
错误。
我将test2()方法更改为:
function test2(data){
if(data){
return data
}
else{
//Code from the original test() function to send post request to PHP with
//a callback to test2.
}
在collection()
函数中,我添加了这个:var json = test2
,(没有全局json),但这也不起作用。
很抱歉这个冗长的问题,但基本上,我打开一个函数,该函数需要调用另一个发送post请求的函数,并且请求接收的数据需要由原始函数使用。我该怎么做呢?
我认为这只是时间问题。因为请求需要一段时间,同时原始功能已经开始了。
编辑:找到解决方案。我认为这是一个时间问题。为了解决它。我使页面html调用一个函数,将名称和描述存储为全局变量。然后,此函数使用对不同函数的回调发出post请求。然后,这个不同的函数使用它收到的数据(JSON对象),并将它与全局名称和描述一起传递给前面提到的collection()
函数。
答案 0 :(得分:1)
您必须在使用之前解析数据。
//For IE6/IE7
var data = eval('(' + json + ')');
//For IE8+/Chrome/Firefox...
var data = JSON.parse(json);