2012-12-03 65 views
0

我有一個簡單的複選框,通過查詢數據庫打開或關閉。用戶可以更改此值,並通過ajax發送請求。該網址是古怪的,因爲它是一個Joomla組件(這個問題不重要,但以防萬一)。缺乏jQuery的Ajax成功設置

$(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. 我只傳入網址,沒有其他設置。我一直使用success設置,但在這種情況下,我不需要做其他響應。我知道這是可選的,但我應該在那個時候做其他事情嗎?
  3. 我應該傳入ajax的其他設置?它看起來太...簡單。

任何指導表示讚賞。謝謝。

+1

兩個ajax請求都是** IDENTICAL **。爲什麼你有兩個然後? – zerkms

+0

它們不相同,checkedLength是1或0.所以我可以在url上放一個if語句,而不是重複整個'ajax'調用。雖然我不確定這是否可能,但無論哪種方式,這都是第1個問題,必須有更好的方法 – Tom

+0

@zerkms有一點,刪除if。使用變量checkedLength使得if冗餘。另外,查詢字符串中的PHP是否做你打算做的事情? –

回答

1

根本不需要if/else結構,因爲在兩個分支中你都有相同的代碼行,所以如果你只是自己放這行代碼就行了(它仍然會使用這個值的checkedLength)。

然而,$(this + ':checked').length沒有意義 - 你的選擇地連接了':checked'對象this結束。我看不出目前如何工作。將結果作爲「長度」的等效方式將是$(this).filter(':checked').length,這是一種笨重的方式。或者,您可以使用if ($(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最初使用可能永遠只能是01,因爲事件是您通過ID選擇元素。)

「我只是路過的網址,沒有其他的設置。我一直使用的成功設置,但在這種情況下,我不需要做其他的迴應。我知道這是可選的,但我應該做別的事情在這一點上「

號如果您不需要做任何事情的成功,然後不指定成功回調 - 它可能是明智的以指定一個錯誤回調,但如果通話因爲某種原因不起作用,

+0

非常明確的解釋,謝謝。但由於某種原因,它不起作用。如果我使用'var checkLength = $(this).filter(':checked').length;'和單個ajax調用它。任何想法? – Tom

+0

關於爲什麼它不起作用的唯一想法是,如果您似乎正在使用的'iButton()'插件導致直接檢查DOM屬性時出現問題。使用'(this.checked?1:0)'可以在這裏很好地工作:http://jsfiddle.net/y24zY/,所以應該沒有問題用'$(this).filter(':checked')替換。 length'。無論如何,如果你在原來的代碼中沒有改變任何東西,那麼刪除if/else仍然是一個很大的改進,只需要'$ .ajax()'行。 – nnnnnn

+0

證明存在。我會明白爲什麼它不適合我。 – Tom