簡體   English   中英

單擊瀏覽器上的后退按鈕時,“ SelectAll”復選框不起作用

[英]“SelectAll” checkbox not working when back button on the browser is clicked

我有以下html頁面:

<html>
<body>

<script>
    var check = 0;

function doNow()
{
  void(d=document);

  void(el=d.getElementsByTagName('INPUT'));
  for(i=0;i<el.length;i++)
    {
        if(check == 0)
            void(el[i].checked=1)
        else
            void(el[i].checked=0) 
    }
   if(check == 0)
       check = 1;
   else 
       check = 0;
}

</script>
<HR>
<form>
<INPUT TYPE="CHECKBOX" name="DG1">DG1
<INPUT TYPE="CHECKBOX" name="DG2">DG2
<INPUT TYPE="CHECKBOX" name="DG3">DG3
<INPUT TYPE="CHECKBOX" name="DG4">DG4
<INPUT TYPE="CHECKBOX" name="DG5">DG5

<input type=button onclick="doNow()" value="CheckBox All Now">

</form>
</body>
</html>

如果單擊“立即復選框全部”,則選中所有復選框。 然后,如果按下“返回”按鈕或“刷新”按鈕。 必須單擊“立即全部復選框”,以取消選中所有復選框。

請讓我知道在“刷新”或“返回”的情況下如何處理“立即檢查所有復選框”。

在此先感謝,Mahesh。

這是因為當重新加載頁面時,將解析Javascript並聲明

var check = 0;

毫不奇怪,這時將檢查變量重置為零。 因此,在頁面重新初始化后,第一次單擊按鈕將啟用所有復選框。 似乎這里的問題源於表單渲染器如何記住狀態以及Javascript引擎如何記住“狀態”。 后者不能真正按照您想要的方式“修復”,因為腳本實際上每次都需要運行。

您可能會選擇從控件本身中拉出初始“已檢查”狀態。 您當前的代碼明確地假定復選框最初將全部未選中(這基本上就是您所說的“ check = 0”;此變量將存儲JavaScript所知的復選框狀態)。 相反,您可以將行更改為:

var check = document.getElementsByTagName('INPUT')[0].checked;

當然,這在當前位置不起作用,因為它是在定義表單之前聲明的。 您可能需要將其注冊為要在文檔加載后運行的閉包,或者將其拉出並放入文檔中form元素之后的<script>標記中(這不是最干凈的方法)做到這一點,但可用於快速和骯臟的開發;通常在頭腦中進行功能注冊)。

我已經測試了這兩種方法,它們都起作用。 我敢肯定,這個問題還會有其他潛在的解決方案,這些解決方案會與其他人的答案一起出現!

編輯 :考慮一段時間后進行大編輯。 這里的根本問題是check變量與實際的復選框本身不同步-我上面描述的是一種在重新加載/重新初始化頁面時避免這種情況的方法。

但是,您仍然會有其他問題。 如果用戶手動單擊所有復選框會怎樣? 它們現在將處於活動狀態,但您的check變量仍為0 ,因此單擊“ check all”按鈕將全部激活它們(這將無效)。 如果我在選中所有復選框的情況下單擊此按鈕,則我希望它的行為始終如一,無論這些復選框如何達到該狀態(應該無關緊要)。

此外,如果您選中了某些復選框而未選中某些復選框會怎樣? 在這種情況下,該按鈕意味着做什么?

最好的總體解決方案可能是完全刪除check變量,然后在每次doNow調用開始時按需進行處理。 也就是說,檢查復選框數組,讀取其當前值,然后從中導出復選框應設置為的值。 (例如,如果功能證明是每個復選框應簡單地單獨顛倒,則可能真的很簡單,這取決於實際的功能要求。)

(此外,作為編碼樣式問題,您的代碼部分中


if(check == 0)
    void(el[i].checked=1)
else
    void(el[i].checked=0)

可以簡單地替換為

el[i].checked = (1 - check);

並從我們希望擺脫此變量這一事實出發,它應該是布爾值而不是整數,因為它只有兩個狀態。)

我的建議是使用復選框而不是按鈕。 當某人單擊該復選框時,所有其他復選框都將設置為,但是該復選框已設置。

因此,如果選中了“全部檢查”復選框,然后單擊它。 所有其他復選框將被清除。

在您描述的場景中應該會更好一些。

dtsazza是正確的-刷新頁面后,您將從頭開始。

我注意到,“立即檢查全部”按鈕實際上會切換已檢查狀態。 2個按鈕怎么樣(鏈接可能更好); 一個檢查所有,一個取消檢查所有?

您可以將checked變量存儲在隱藏字段中。 這樣,它將與復選框具有相同的壽命。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM