在下面的代码中,有一个带有目标url test_location_jquery.php
的XMLHTTPRequest,尽管触发了成功函数,但永远不会访问此文件。单独运行以进行测试test_location_jquery.php
已按预期成功返回JSON对象。任何关于如何在不访问文件时触发成功函数的想法都将不胜感激。
<?php
require_once '../meta/php/dbConn.php';
$charlie_query = "";
$charlie_result = "";
$charlie_query = "
SELECT ud.user_id as 'id',
concat(ud.last_name,', ',ud.first_name) as 'name'
FROM `user_detail` AS ud,
`user_type` AS UT
WHERE ud.user_type = ut.id
AND ut.class IN ('charlie')
AND ut.level IN (4)
ORDER BY ut.class;
";
$charlie_result = mysql_query($charlie_query);
if(!(bool)$charlie_result){
throw new Exception();
}
?>
<html>
<head>
<script src="../meta/js/jquery-1.7.2.js"></script>
<!-- <script src="../meta/js/getXML_sir.js"></script> -->
<script>
$(document).ready(function(){
$('#charlie').change(function(){
var charlie_id = $('#charlie option:selected').val();
var DT = "json";
$.post(
'test_location_jquery.php',
{'id':charlie_id,'datatype':DT},
function(data){
alert('Success');
var obj = $.parseJSON(data);
}
);
if(obj != 'undefined'){
var locations = obj.find('location');
console.log(locations);
}else{
alert("failure");
}
})
})
</script>
</head>
<body>
<form>
<label>Charlie: </label><select id="charlie" name="charlie">
<option> </option>
<?php
while($row = mysql_fetch_assoc($charlie_result)){
print("<option value='".$row['id']."'>".$row['name']."</option>");
}
?>
</select>
<label>Location: </label><select id="location" name="location"></select>
</form>
<div></div>
</body>
</html>
<?php
require_once("../meta/php/dbConn.php");
if(!isset($_POST)){
throw new Exception();
}else{
$id = $_POST['id'];
$datatype = $_POST['datatype'];
}
$query = "
SELECT l.id as 'id',
ld.attribute_string as 'name'
FROM `location` AS l,
`location_details` AS ld
WHERE l.id = ld.location_id
AND ld.attribute_label = 'name'
AND l.id = ".$id.";
";
$result = mysql_query($query);
if(!(bool)$result){
throw new Exception();
}else{
switch($datatype){
case 'xml':
break;
case 'json':
$rows = array();
while($r = mysql_fetch_assoc($result)) {
$rows[] = $r;
}
return json_encode($rows);
break;
}
?>
答案 0 :(得分:4)
您的.post()
函数是异步的。这意味着调用.post()
只是启动帖子。紧随其后的行在post()
完成之前和调用成功处理程序之前执行。
然后,一段时间后调用成功处理程序。
使用帖子响应的所有代码必须在成功处理程序中或从成功处理程序中调用。
因此,您的问题是您无法在此代码所在的成功处理程序中引用数据集(在.post()
调用之后)。您必须将此代码放在成功处理程序本身中。
if(obj != 'undefined'){
var locations = obj.find('location');
console.log(locations);
}else{
alert("failure");
}
因此,在执行此操作后,您的代码将如下所示:
<script>
$(document).ready(function(){
$('#charlie').change(function(){
var charlie_id = $('#charlie option:selected').val();
var DT = "json";
$.post(
'test_location_jquery.php',
{'id':charlie_id,'datatype':DT},
function(data){
alert('Success');
var obj = $.parseJSON(data);
if(obj != 'undefined'){
var locations = obj.find('location');
console.log(locations);
}else{
alert("failure");
}
}
);
})
})
</script>
答案 1 :(得分:0)
这应该有用。
$.post(
'test_location_jquery.php',
{'id':charlie_id,'datatype':DT},
function(data){
alert('Success');
var obj = $.parseJSON(data);
if(obj != 'undefined'){
var locations = obj.find('location');
console.log(locations);
}else{
alert("failure");
}
}
);
由于Ajax是异步的,因此在完全调用页面之前obj变量不存在。因此,如果您放入函数(数据)内部,它将仅在完全调用之后继续,并且该变量现在将存在。