我的代码从mysql中提取帖子。每个帖子都有一对单选按钮(喜欢/不喜欢),点击后,将相应的类分配给它所附加的div,并将值存储在mysql中(所以当页面加载时,调用的值会被调用)。该页面具有主控制复选框,单击该复选框时,显示/隐藏与相应类别匹配的所有div。
例如:如果用户决定隐藏所有不喜欢的帖子,则剩余的帖子是喜欢的帖子和尚未决定的帖子。这可以。然而,问题在于用户决定将喜欢的帖子改为不喜欢的帖子(或者决定不喜欢未定的帖子)。在那种情况下,新不喜欢的帖子并没有像它应该消失的那样(隐藏不喜欢的帖子的开关是ON)。
更改后的值确实已发送到数据库,因此问题不在于我的ajax。
我有css根据类改变我的div的背景颜色,当用户改变他的选择时,背景改变所以我知道div类也被改变,因此,这不是问题。
这使得问题出现在复选框查找div类的方式中。
这是我的代码:
<form name="myform" action="" method="post">
<fieldset>
<legend>Master Controls</legend>
<div class="left">
<p><input id="show_likes" name="show_likes" type="checkbox" value="1" />
<label for="b1">Hide Likes:</label></p>
</div>
<div class="right">
<p><input id="show_dislikes" name="show_dislikes" type="checkbox" value="1" />
<label for="b1">Hide Disikes:</label></p>
</div>
</fieldset>
<br><br>
<fieldset>
<legend>Posts</legend>
<?php
$data = mysql_query("SELECT * FROM Contests");
while($row = mysql_fetch_array( $data )){
$query = mysql_query("SELECT * FROM userContests WHERE userID='$userID' AND contestID='$row[contestID]';") or die(mysql_error());
$checked = mysql_fetch_assoc($query);
?>
<script type="text/javascript">
$(document).ready(function() {
var checked = <?php echo $checked['value']; ?>;
if (checked == 1) {
$('#contest_<?php echo $row['contestID']; ?>').addClass('like');
} else if (checked == 0) {
$('#contest_<?php echo $row['contestID']; ?>').addClass('dislike');
}
$("input[name*='pref_<?php echo $row['contestID']; ?>']").click(function() {
var contestID = <?php echo $row['contestID']; ?>;
var value = $(this).val();
var userID = <?php echo $current_user->ID; ?>;
$.ajax({
url: 'check.php',
type: 'POST',
data: 'userID=' + userID + '&contestID=' + contestID + '&value=' + value,
success: function(result) {
$('#Message_<?php echo $row['contestID']; ?>').html('').html(result);
}
});
if (value == 1) {
$('#contest_<?php echo $row['contestID']; ?>').removeClass('dislike').addClass('like');
} else if (value == 0) {
$('#contest_<?php echo $row['contestID']; ?>').removeClass('like').addClass('dislike');
}
});
$("input[name*='show_likes']").click(function() {
if ($('#contest_<?php echo $row['contestID']; ?>').is('.like')) {
$('#contest_<?php echo $row['contestID']; ?>').toggle();
}
});
$("input[name*='show_dislikes']").click(function() {
if ($('#contest_<?php echo $row['contestID']; ?>').is('.dislike')) {
$('#contest_<?php echo $row['contestID']; ?>').toggle();
}
});
});
</script>
<div id="contest_<?php echo $row['contestID']; ?>" class="post">
<div id="contest_<?php echo $row['contestID']; ?>_inside">
<b><?php echo $row['Title']; ?></b><br>
Expires: <?php echo $row['Exp']; ?><br>
<ul id="listM"></ul>
<form id="form_<?php echo $row['contestID']; ?>" action="/">
<fieldset>
<div class="left"><p><input id="like_<?php echo $row['contestID']; ?>" type="radio" name="pref_<?php echo $row['contestID']; ?>" value="1"<?php if ($checked['value'] == "1") echo " checked"; ?> />
<label for="like_<?php echo $row['contestID']; ?>">Like</label></p></div>
<div class="right"><p><input id="dislike_<?php echo $row['contestID']; ?>" type="radio" name="pref_<?php echo $row['contestID']; ?>" value="0"<? if ($checked['value'] == "0") echo " checked"; ?> />
<label for="dislike_<?php echo $row['contestID']; ?>">Dislike</label></p></div>
<hr />
</fieldset>
</form>
</div>
</div>
<div id="Message_<?php echo $row['contestID']; ?>"></div>
<?php
}
?>
</div>
有什么想法吗?
答案 0 :(得分:1)
您需要在表单值更改时重新触发隐藏显示逻辑。我捅了一下。当一个偏好无线电值改变时,它会改变最近的“.post”的类,分别被喜欢或不喜欢,然后检查“.post”是否应该可见。
<script type="text/javascript">
$(document).ready(function() {
var checked = <?php echo $checked['value']; ?>;
if (checked == 1) {
$('#contest_<?php echo $row['contestID']; ?>').addClass('like');
} else if (checked == 0) {
$('#contest_<?php echo $row['contestID']; ?>').addClass('dislike');
}
$("input[name*='pref_<?php echo $row['contestID']; ?>']").click(function() {
var contestID = <?php echo $row['contestID']; ?>;
var value = $(this).val();
var userID = <?php echo $current_user->ID; ?>;
$.ajax({
url: 'check.php',
type: 'POST',
data: 'userID=' + userID + '&contestID=' + contestID + '&value=' + value,
success: function(result) {
$('#Message_<?php echo $row['contestID']; ?>').html('').html(result);
}
});
if (value == 1) {
$('#contest_<?php echo $row['contestID']; ?>').removeClass('dislike').addClass('like');
} else if (value == 0) {
$('#contest_<?php echo $row['contestID']; ?>').removeClass('like').addClass('dislike');
}
});
$("input[name*='show_likes']").click(function() {
if ($('#contest_<?php echo $row['contestID']; ?>').is('.like')) {
$('#contest_<?php echo $row['contestID']; ?>').toggle();
}
});
$("input[name*='show_dislikes']").click(function() {
if ($('#contest_<?php echo $row['contestID']; ?>').is('.dislike')) {
$('#contest_<?php echo $row['contestID']; ?>').toggle();
}
});
$("input:radio[name^='pref_']").bind("shouldHide", function(event){
var dislikesHidden = $("#show_dislikes").prop("checked");
var likesHidden = $("#show_likes").prop("checked");
var closestPost = $(this).closest(".post");
if((dislikesHidden && closestPost .is(".dislike")) ||
likesHidden && closestPost.is(".like")
){
closestPost.hide();
}
}).change(function(event){
//if it has a class in the list, it removes it. If it does not have a class in the list, it adds it.
$(this).closest(".post").toggleClass("like dislike");
$(this).trigger("shouldHide");
});
});
</script>