0

我有一个简单的复选框,可以通过查询数据库来选中或关闭。用户可以更改此值,我通过发送请求ajax。该 url 很古怪,因为它是一个 Joomla 组件(对于这个问题并不重要,但以防万一)。

$(function() {

$("#iButton").iButton();

$('#iButton').change(function() {
    var checkedLength = $(this + ':checked').length;
    if(1 == checkedLength){
        $.ajax({
            url: 'index.php?option=com_mycomponent&task=globaldetection&id_hash=<?php echo $id_hash; ?>&global_monitoring='+checkedLength+'&format=raw'
        });
    } else {
        $.ajax({
            url: 'index.php?option=com_mycomponent&task=globaldetection&id_hash=<?php echo $id_hash; ?>&global_monitoring='+checkedLength+'&format=raw'
        });
    }
});

});

<?php
//highlight whether the checkbox is on or off
if ($userstatus == "ENABLED") //get this value from server
{
    //turned on
    $global_monitoring = "checked=\"checked\"";
}
else
{
    $global_monitoring = "";
}

?>
    <div class="dropshadow">
    <p id="iButtontext">
      <input type="checkbox" id="iButton" <?php echo $global_monitoring; ?> name="iButton_checkbox" />
    </p>
    </div>

这工作正常,正如我所料,但我在这里有几个问题:

  1. ajax我根据条件复制该功能两次。有没有更好的方法来做到这一点或完全可以接受?
  2. 我只传入 url 而没有其他设置。我一直使用该success设置,但在这种情况下,我不需要做其他响应。我知道这是可选的,但那时我应该做其他事情吗?
  3. 我应该传递给ajax的任何其他设置?它似乎太……简单。

任何指导表示赞赏。谢谢。

4

1 回答 1

1

您根本不需要 if/else 结构,因为在两个分支中您都有相同的代码行,所以如果您只是将那行代码单独放置,它会起作用(它仍然会使用 的值checkedLength)。

但是,$(this + ':checked').length没有意义 - 您的选择器将字符串连接到 object':checked'的末尾。我不知道目前这会如何工作。将结果作为“长度”的等效方法是,这有点笨拙。或者您可以使用 将其作为布尔值进行测试,除非这比执行相同工作时所需的复杂得多。 this$(this).filter(':checked').lengthif ($(this).is(':checked'))this.checked

鉴于您可以直接获得检查状态,this.checked我认为以下更简单(并且肯定更有效):

$('#iButton').change(function() {
    $.ajax({
       url: 'index.php?option=com_mycomponent&task=globaldetection&id_hash=<?php echo $id_hash; ?>&global_monitoring='
            + (this.checked ? 1 : 0) + '&format=raw'
    });
});

(我假设.length您最初使用的只能是0,或者1因为事件位于您通过 id 选择的元素上。)

“我只传递 url 而没有其他设置。我一直使用成功设置,但在这种情况下,我不需要做其他响应。我知道这是可选的,但我应该在那时做其他事情?”

不。如果您不需要对成功执行任何操作,则不要指定成功回调 - 不过,指定错误回调可能是明智之举,以防调用因某种原因无法正常工作。

于 2012-12-03T02:25:53.523 回答