我正在处理一个网页的视图和控制器,我正试图弄清楚这将如何工作:
- 控制器将在加载页面时定义视图中使用的变量。
- 一旦用户提交了一个表单,它就会执行一个onclick jQuery函数,该函数会返回给控制器。
- 根据投票是否成功插入数据库,控制器返回给视图true或false。
- 视图的jquery函数继续,决定下一步做什么:如果成功,执行另一个jquery函数。
- 下一个jQuery函数执行$。返回到控制器,它决定在视图中使用的相关变量。
现在,我的工作是提交投票。然而,当我运行它时,我从来没有看到警告弹出,这让我担心我的设置没有按应有的方式工作。
这是我的PHP网站控制器的代码:
if(!isset($_POST['poll'])) //UPON PAGE LOAD
{
//define relevant variables to be put into the view
}
if(isset($_POST['poll'])) //UPON jQuery $.Post() back to controller
{
if($_POST['poll']=='done')
$vote = 2;
if($_POST['poll']=='no')
$vote = 1;
$id = $_POST['id'];
$result = vote($user_id, $id, $vote); //inserts vote into Database
if( !$res )
echo json_encode(array('success'=>true, 'text'=>'success'));
else
echo json_encode(array('success'=>false, 'text'=>'fail'));
//I want ^this json data to be sent back to the jQuery of my view
}
if(isset($_GET['newListing']))
{
//code that would redifine relevant variables to be put into view
}
if(isset($_GET['newListing']) || !isset($_POST['poll']))
{
//code that does something--both upon page load and when needing to retrieve
//and define variables to put into view.
}
include('view.php');
这是代码从我的HTML/jQuery网站视图:
<html>
<body>
<form name='poll' id='poll' >
<INPUT TYPE="radio" name='poll' value='done'checked/>Done it.<br/>
<INPUT TYPE="radio" name='poll' value='no'/>No.</br>
<button id='submit-vote' onclick="postVote();">Submit</button>
<INPUT TYPE='hidden' name='id' value='<?php echo $id; ?>'/>
</form>
</body>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
function loadListing(){
$.get('controller.php?newListing=yes',function(data){
if(data.response == 'success'){
//something}
else{
return false;}
});
}
function postVote(){
$.post('controller.php', { poll: $('input:radio[name=poll]:checked').val(), id: $('input:hidden[name=id]').val()} , function(data){
if(data.success){
alert('data.text');
loadListing();
return true;}
else{
alert(data.text);
return false;}
},
"json");
}
</script>
</html>
感谢任何帮助/建议!
编辑:从我的视图代码:HTML:
<fieldset id='poll'>
<INPUT TYPE="radio" name='poll' value='yes' checked/>Yes!<br/>
<INPUT TYPE="radio" name='poll' value='done'/>Done it.<br/>
<INPUT TYPE="radio" name='poll' value='no'/>No.</br>
<button id='submit-vote'>Submit</button>
<INPUT TYPE='hidden' name='id' value='<?php echo $id; ?>'/>
</fieldset>
jquery: jQuery(function($){
$("#submit-vote").click(
function(){
alert("HELLO");
$.post('controller.php', { poll: $('input:radio[name=poll]:checked').val(), id: $('input:hidden[name=id]').val()} ,
function(data)
{
alert("THIS FUNCTION WORKS");
}, "json");
}
);
});
控制器基本相同。当我现在点击提交按钮时,alert("HELLO");
被执行,并且根据Firefox的Firebug, $.post()
确实发生了。然而,alert("THIS FUNCTION WORKS");
不会被执行。我需要帮助弄清楚为什么可能是....
谢谢!
问题是json_encode创建了一个字符串。然而,在Javascript中,您试图访问它,就好像它是一个对象(data.success)。首先需要使用window.JSON.parse()将其转换为对象:
var dataObj = window.JSON.parse(data);
这样做之后,您应该能够访问dataObj.success.
老实说,我不知道你为什么把它弄得那么复杂。为什么不返回一个简单的字符串,比如"成功"或"失败"?然后,您不需要在php中编码对象或在JavaScript中解码它。你只需要这样做:
PHPif( !$res )
echo 'success';
else
echo 'failure';
JavaScript if(data === 'success'){
//do your stuff
}else{
//do other stuff
}
编辑OP对这个答案的第一个评论一旦PHP脚本结束,JavaScript将重新获得控制权。在您发布的代码中,在PHP脚本的末尾包含了一个view.php文件。我不知道view.php里面有什么,很有可能包括这个文件会导致你的JS alert()仍然没有触发,即使你做了我上面描述的更改。这是因为如果有任何输出(即echo, print等)在view.php文件中运行,它将被附加到json_encode创建的字符串上。结果将是一个不能被window.JSON.parse()解析的字符串。
如果您希望脚本在回显"成功"或"失败"(或您的json_encoded版本)后结束,只需将return;
放在echo语句之后:
if( !$res ){
echo 'success';
else
echo 'failure';
}
return;
include('view.php');
应该只放在if(!isset($_POST['poll'])) //UPON PAGE LOAD
代码中