我已经研究并玩了相当多,但我被难住了。从本质上讲,我想设置我的网站,这样它就可以检测用户是否"登录",从而改变它的外观:删除"登录"链接,代之以"注销"链接,等等。
为了测试的目的,我开始我的index.html页面:
<?php
session_start();
$_SESSION["username"]="javaman";
?>
接下来,从jquery文档中调用setup函数。ready:
$(document).ready(function() {
setup_page();
};
设置函数如下:
function setup_page()
{
var username = get_user();
//check for error
var index = username.indexOf("error");
//if not an error
if(username.length > 0 && index == -1)
{
//do the jquery calls to hide/show links
}
}
get_user函数是这样的
function get_user()
{
var result;
$.post("./session.php", {action : "get", key : "username", value : "val"}, function(data){
result = data;
});
return result;
}
session.php是一个简单的应用程序,它接受3个post值,并希望吐出适当的结果,我遇到的问题是js结果变量通常是未定义的,特别是当我通过IE开发工具栏进行调试时。不过FF看起来还行。我是否以正确的方式使用回调?我试过把alert()函数放在任何地方,以找出代码搞砸的地方,但这也没有帮助,因为警报经常说结果是未定义的。同时,似乎get_user调用post函数,但堆栈立即返回,并且永远不会返回语句,直到get_user返回值…未定义的。我相信我误解了这里的代码流。我习惯用C语言,逻辑上一个函数跟着另一个函数。在这种情况下,我将回调解释为:
int I = callback_function(post("some data"));
所以在我看来,post完成了它的动作,然后调用另一个函数或至少执行另一个动作,然后完成,然后get_user可以返回它的值。
或者是操作顺序:post, get_user, callback?
…
Internet Explorer原生不支持数组上的indexOf
。使用jQuery的$.inArray()
代替:
var index = $.inArray("error", username);
请记住,AJAX代表异步 Javascript和XML。所以回调会在响应来的时候触发,但是其余的执行会继续。如果您想锁定执行直到ajax请求完成,请使用
$.ajaxSetup({async:false});