我正在寻找创建一个包含一组按钮的页面。这些按钮分别绑定到不同的php函数(这些函数完成的事情必须在服务器端完成)。 基本上,所有编码都是在php中完成的。 php具有所有对象,常量,页面中所需的所有信息。但是,所有操作都需要由用户通过单击按钮启动。
但问题出现了:如何有效地将这些PHP功能与我的按钮混合?现在我正在使用ajax,javascript和jquery,但我这样做的方式感觉有争议,这就是我的意思:
var continueFight;
$("#playerAttack").click(function() {
if (continueFight) {
AJAX actions here
}
其中一个ajax操作是$.post
,指向以下页面:
<?php
//some fight calculations
if ($fightOver)
echo "<script>continueFight=false</script>";
?>
在上面,进行了一些php计算以确定战斗是否结束,如果是,它回应一些Javascript并将其返回(通过AJAX请求)到主页面,这将导致按钮停止在未来奔跑。
这感觉非常混乱。有没有更好的方法将PHP与按钮混合?
答案 0 :(得分:3)
我不明白为什么要回显一个脚本元素。只需回显一个值(例如,1
或没有),并根据响应从成功回调行为中回显:
<?php
//some fight calculations
echo $fightOver;
?>
var continueFight;
$("#playerAttack").click(function() {
if (continueFight) {
$.post(url, {}, function(response) {
continueFight = !!response; // cast response to boolean
}
}
})
答案 1 :(得分:2)
你的方法与你想象的完全一样。您必须将PHP视为孤立事件而不是保持不变记录的事物。假设你正在制作游戏。您可以将游戏状态和任何相关数据存储在玩家常用的数据库中,通常使用来回传递的令牌。
您的整个游戏的互动应该在客户端处理。我的意思是通过ajax向php发送请求的监听器。 PHP应该只返回状态响应以用js解释,它不应该返回html或任何像这样的傻瓜。
你可以在你的php中添加条款以验证状态服务器端以防止js操作,但这可能不是你现在的一个大问题。
看起来其他人基本上都说同样的东西,但是有代码示例,所以我会在这里删除它。如果您有具体问题,请随时提出,我可能会更新。
修改强>
状态响应类似于一个对象,整数表示布尔值,整数范围,分数或其他任何用作触发javascript中更复杂动作的简单响应的东西。 所以假设你有攻击。假设您将请求发送给PHP以确定攻击是否成功,如果是,那么它会造成什么样的损害。您可能希望从PHP获得这样的响应:
$response = array(
'success' => 1,
'damage' => 200,
'enemy_id' => 4
);
echo json_encode($response);
来自javascript,假设您的jQuery ajax成功将响应分配给data
,您可以像这样评估响应:
//assume generically that this object represents the damagable players
var players = {
0: {
health: 200
},
1: {
health: 300
},
2: {
health: 30
},
3: {
health: 750
},
4: {
health: 10
}
};
// and assume this is in your success function in your ajax call
if(data.success == 1)
{
//successful attack. cause damage
players[data.enemy_id].health -= data.damage;
if(players[data.enemy_id].health <= 0)
{
// do something to kill enemy
}
}
重点是,您应该向浏览器返回绝对最少的数据,并让客户端处理所有游戏操作。 PHP仅用于同步游戏或获取客户端无法获取的资源。
答案 2 :(得分:1)
不要将JavaScript块回送到页面。在JavaScript中编写JavaScript,并从PHP传回一个标志,告诉S该做什么:
JavaScript的:
var continueFight;
$("#playerAttack").click(function() {
if (continueFight) {
$.post('scriptname.php', function(data) {
continueFight = data.continueFight;
});
}
});
PHP:
<?php
//some fight calculations
echo json_encode(array('continueFight' => !$fightOver));
这很简单。不幸的是,Ajax需要大量输入。