2011-08-04 56 views
0

我有一個表格,這是一個用php構建的表格,用於從數據庫中提取一堆信息。在這些中,我有一個複選框,單擊它時,將取得estimatedCost的值並將其引發到一個JavaScript函數中,該函數可以計算它並保持所有對象的運行總數被檢查。使用Javascript的高級複選框

我想要做的是創建一個全選和取消全選選項,它仍然會將所需的變量傳遞到其他JavaScript函數中。讓我用一些代碼演示:

這將繪製標題旁邊的複選框。

foreach($replace as $key => $value) 
    { 
    $jScript = 'onclick=\'calcTotals("'.$replace[$key]['estimatedCost'].'","'.$replace[$key]['optionItem_id_replaceOrRepair'].'","'.$replace[$key]['service_title'].'","'.$replace[$key]['maintenanceitem_id'].'");\''; 
    $checkbox = sprintf('<input type="checkBox" name="ids[]" id="%s" value="%s" %s>', $replace[$key]['maintenanceitem_id'], $replace[$key]['maintenanceitem_id'], $jScript).'&nbsp;'; 
    $replace[$key]['title'] = $checkbox.$replace[$key]['title']; 
    $replace[$key]['estimatedCost'] = $replace[$key]['estimatedCost']; 
    } 

這是當前檢查所有,並取消所有鏈接:

echo '<a href="#" onClick=\'setCheckboxes("budgeting", true); return false;\'>Check All</a>&nbsp;|&nbsp;'; 
    echo '<a href="#" onClick=\'setCheckboxes("budgeting", false); return false;\'>Uncheck All</a>'; 

現在目前的職能,我有在javascript:

function setBudgetCheckboxes(the_form, do_check) { 
     var elts  = (typeof(document.forms[the_form].elements['ids[]']) != 'undefined') 
         ? document.forms[the_form].elements['ids[]'] 
         : (typeof(document.forms[the_form].elements['ids[]']) != 'undefined') 
       ? document.forms[the_form].elements['ids[]'] 
       : document.forms[the_form].elements['ids[]']; 
     var elts_cnt = (typeof(elts.length) != 'undefined') 
         ? elts.length 
         : 0; 
     if (elts_cnt) { 
      for (var i = 0; i < elts_cnt; i++) { 
       elts[i].checked = do_check; 
       var name = document.getElementById(name); 
      } // end for 
     } else { 
      elts.checked = do_check; 
     } // end if... else 
     return true; 
    } 

的,另外,它處理點擊一次一個:

function calcTotals(amount, type, service, name) { 
     if(amount[0] == '$') { 
      amount = amount.substr(1,amount.length); 
     } 
     var id = type+"_"+service+"_selected"; 
     var grand_id = "Grand_selected"; 
     var grand_service_id = "Grand_"+service+"_selected"; 
     var type_id = type+"_selected"; 

     var checked = document.getElementById(name).checked; 

     var multiplier = -1; 

     if(checked) { 
      multiplier = 1; 
     } 

     amount = amount * multiplier; 

     addBudgetValue(amount, id); 
     addBudgetValue(amount, grand_id); 
     addBudgetValue(amount, grand_id+"_h"); 
     addBudgetValue(amount, type_id); 
     addBudgetValue(amount, grand_service_id); 
     addBudgetValue(amount, grand_service_id+"_h"); 
    } 
function addBudgetValue(amount, id) { 
     var current_value = document.getElementById(id).innerHTML; 
     var curtmp = 0; 
     if(current_value == "$0") { 
      current_value = amount; 
     } 
     else { 
      curtmp = parseFloat(current_value.substr(1,current_value.length)); 
      current_value = (curtmp+parseFloat(amount)); 
     } 
     var newVal = "$"+Number(current_value).toFixed(2); 
     if(newVal == "$0.00") 
      newVal = "$0"; 
     document.getElementById(id).innerHTML = newVal; 
    } 

所以問題是這樣的:你如何獲得全部檢查以檢查所有框,並將信息傳遞到calcTotals函數中,以便正確添加值?

+0

您可以通過描述您從當前的「全部檢查」方法中看到的行爲,讓我們更輕鬆地解釋所有上述代碼嗎?你熟悉jQuery嗎? – JellicleCat

+0

當您一次選擇一個複選框時,它會將estimatedCost值添加到當前運行成本中,並將其顯示在頁面上的浮動表中。它會根據選擇和取消選擇項目而上下移動。檢查所有鏈接將檢查所有的框,但不會加起來所有的成本。(作爲副作用,您可以手動取消選擇複選框,並且成本開始變爲負值。) – IceBlueFire

回答

1

這裏有一個的jsfiddle是做什麼(我覺得)你正在尋找:http://jsfiddle.net/kz9gU/1/

我使用一個自定義data-*屬性來存儲估計成本(遵循規範的按照HTML5),所以它的定義複選框的標籤。每個複選框然後在選中/取消選中時調用updateTotal()函數,但不會傳遞任何參數。 updateTotal()然後通過複選框循環,讀取data-cost屬性中的每個金額,並顯示總和。

檢查/取消選中功能則不需要計算任何值;他們只需檢查/取消選中所有內容,然後致電updateTotal()

編輯:嘿,剛剛意識到你沒有使用jQuery。我只是開始認爲jQuery是理所當然的,儘管我實際上並沒有自己使用jQuery。你在小提琴中看到的可能是基於jQuery的最長的JS,我已經寫了:)
無論如何,使用某種類型的庫來消除瀏覽器差異幾乎總是一個好主意,而jQuery現在是堆的王。

但是圖書館與否,代碼應該讓你知道你可以如何繼續。

+0

http://jsfiddle.net/s8L2M/2/​​ - 這個處理負值和小數值,並且不會將點擊處理程序綁定到標記。 ;) –

+0

這兩個都很有幫助,但如果是JavaScript,會更好,因爲我根本不熟悉jQuery。感謝您幫助理解背後的邏輯! – IceBlueFire

+0

@TeslaNick:是的,我也不會''onclick'屬性,但我不想改變OP的原始代碼的周圍:) ---但你說得對,標記中的處理程序並不好。順便說一句,我應該處理負值就好了,但對於十進制值,最好避免使用浮動價格。相反,將所有東西乘以100得到美分,然後在需要時除以100。您不會冒險以任何方式冒險任何時髦的浮點問題。我早些時候更新了小提琴,並對此發表了評論。 – Flambino

0

我希望我能正確理解你,你想檢查/取消選中所有功能? http://jetlogs.org/jquery/jquery_select_all.html之後,獲取複選框數組與PHP並傳遞信息,在PHP中做一個循環來檢查數組的值並執行您的語句。

+0

我必須能夠在不更改頁面的情況下執行此操作。頁面上有一個浮動表格,顯示正在運行的總數。 – IceBlueFire

+0

哦,喜歡提交頁面刷新結果? – Grigor

+0

恩,有點兒。如果您查看複選框的聲明位置,它會定義它自己的javascript函數,該函數傳遞變量$ estimatedCost,這是我在檢查所有按鈕時遇到的變量。 – IceBlueFire