如何在页面刷新后反转按位操作以标记复选框

时间:2014-07-23 18:29:39

标签: javascript php jquery mysql

我有一个php函数,其中包含所有这些兴趣选择的数组供用户选择。我在表格中填充了这样的数据:     

foreach($interests as $key=>$value){
?>
<input type="checkbox" name="targetInterests" id="targetInterests"  value="<?php echo $key;?>" class="addeditplacefields">
<?php echo $value;?>
<?php   
}
?>

我将复选复选框的值设为1表示为true,-1表示为false,创建1和-1的数组,并使用bitshift将这些复选复选框的值存储在我们的mysql数据库中,如下所示:

var chkStr = "";
$(":checkbox").each(function(){
    chkStr += this.checked ? "1," : "-1,";
});
var chkStr = chkStr.substr(0, chkStr.length - 1);
// Turn checkbox string into an iterable array
var target =  JSON.parse("[" + chkStr + "]");

x = 0;
for (i=0; i<46; i++){
    var val = target[i];
    if (val == 1){
        x |= (1 << i);
    }
return x;

按位操作对我来说是一个新概念,我很难找到一个简洁的解决方案,在用户点击保存并刷新页面或用户返回页面查看他们检查的内容后,将重新填充这些复选框。任何帮助或建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

逐位存储复选框设置的最有效方法是使用整数,其中每个复选框代表整数的1位。例如,如果设置了复选框:

checkbox 0 checked
checkbox 1 unchecked
checkbox 2 checked

这将代表5(1 * 2 ^ 0 + 0 * 2 ^ 1 + 1 * 2 ^ 2)。在表达式的每个术语中,系数为1或0,具体取决于复选框是选中还是未选中,指数是复选框的索引。

要进行解码,即测试是否选中了复选框N,请使用&amp;&amp; (AND)运算符,如下:

isCheckBoxNChecked = I&amp;&amp; (2 ^ N)

其中I是上面计算的整数值。如果结果为1,则选中复选框,否则取消选中。例如,要解码上面示例中的复选框设置:

for checkbox 0:  5 && (2 ^ 0) =1 (so checkbox 0 was checked)
for checkbox 1:  5 && (2 ^ 1) =0 (so checkbox 1 was unchecked)
for checkbox 2:  5 && (2 ^ 2) =1 (so checkbox 2 was checked)

答案 1 :(得分:0)

建立@ mti2935的建议我意识到使用bitwise和js映射值限制为32位。我有44个元素,我试图改变,所以一旦它到达第32个元素,它将重新开始。不是一个快乐的结果!所以我用一个指数函数来解决它,就像@ mti2935建议结果如下:

var chkStr = "";

$(":checkbox").each(function(){
    chkStr += this.checked ? "1," : "-1,";
});
var chkStr = chkStr.substr(0, chkStr.length - 1);
// Turn checkbox string into an iterable array
var target =  JSON.parse("[" + chkStr + "]");

// Looking for values of 1 in the array
var hasCheck = $.inArray(1, target);
if (hasCheck != -1) {
    // loop through the values of the above array and work the bitwise magic
    y = 0;

    for (i=0; i<target.length; i++){
        var val = target[i];

        if (val === 1){
            y += Math.pow(2, i);
        }

    return y;

这个值被写入我们数据库中的一列,当我们想要重新访问页面并查看检查了哪些值时,或者在页面刷新后发布数据后,我们可以重新填充复选框的状态,如下所示: / p>

rawInterests = getRawInterests();
var interestArray = JSON.parse("[" + rawInterests + "]");

$.each (interestArray, function (index, val) {
    if (val === 1){
        $("#targetInterests[value='" + index + "']").prop('checked', true);
    }   
});     

希望这可以帮助其他人。