2012-12-07 212 views
1

我正在創建審閱控件,並使用單選按鈕來選擇等級。我寫了一些簡單的js來添加一個不同的類,當一個單選按鈕被選中時。我怎樣才能只選擇一個單選按鈕?

問題是您可以檢查每個單選按鈕,我希望用戶只檢查一個值。我用javascript編寫這個,但歡迎jQuery或smartare解決方案。

演示http://jsfiddle.net/cbqt8/5/

HTML:

<div class="reviews"> 
<label class="input-check"> 
    <input onchange="change_state(this)" type="radio" value="1" name="review[rating]" /> Bad 
</label> 
<label class="input-check"> 
    <input onchange="change_state(this)" type="radio" value="2" name="review[rating]" /> Its okey 
</label> 
<label class="input-check"> 
    <input onchange="change_state(this)" type="radio" value="3" name="review[rating]" /> Great 
</label> 
<label class="input-check"> 
    <input onchange="change_state(this)" type="radio" value="4" name="review[rating]" /> Awesome 
</label> 
<label class="input-check"> 
    <input onchange="change_state(this)" type="radio" value="5" name="review[rating]" />Super 
</label> 
</div> 

的JavaScript:

function change_state(obj) { 
    if (obj.checked) { 
     //if radiobutton is being checked, add a "checked" class 
     obj.parentNode.classList.add("checked"); 
    } 
    else { 
     //else remove it 
     obj.parentNode.classList.remove("checked"); 
    } 
} 

CSS:

/*reviews box*/ 
.reviews{ 
    padding: 25px; 
    margin:0; 
} 
/*this is the style of an radio "button"*/ 
.input-check { 
    display: inline-block; 
    height:20px; 
    padding:5px 8px; 
    background:green; 
    width:90px; 
    color:white; 
    text-align: center; 
} 
/* This is the style for a radio "button" */ 
.input-check.checked{ 
    background:red; 
    color:black; 
    font-weight:bold; 
} 
/*Hide the radiobutton*/ 
.input-check input { 
    display:none; 
} 
+0

第一輸入是一個複選框? – Mate

+0

不jQuery的UI有這個東西? –

+0

@Mate錯過了,謝謝! – SHUMAcupcake

回答

0

你必須刪除checked類先前檢查項目。

的jsfiddle:http://jsfiddle.net/P8jB8/

function change_state(obj) { 

    if (obj.checked) { 
     var checkedNodes = getElementsByClassName(document, "checked"); 
     for (var i=0;i<checkedNodes.length;i++) { 
      checkedNodes[i].classList.remove("checked"); 
     } 

     //if radiobutton is being checked, add a "checked" class 
     obj.parentNode.classList.add("checked"); 
    } 
    else { 
     //else remove it 
     obj.parentNode.classList.remove("checked"); 
    } 
} 

function getElementsByClassName(node,classname) { 
    if (node.getElementsByClassName) { // use native implementation if available 
    return node.getElementsByClassName(classname); 
    } else { 
    return (function getElementsByClass(searchClass,node) { 
     if (node == null) 
      node = document; 
     var classElements = [], 
      els = node.getElementsByTagName("*"), 
      elsLen = els.length, 
      pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"), i, j; 

     for (i = 0, j = 0; i < elsLen; i++) { 
      if (pattern.test(els[i].className)) { 
       classElements[j] = els[i]; 
       j++; 
      } 
     } 
     return classElements; 
    })(classname, node); 
    } 
} 

+0

謝謝,你能解釋一下正則表達式部分..如果你喜歡 – SHUMAcupcake

+0

所有瀏覽器都不支持'getElementsByClassName()',Mabye會爲我的理解註釋一段代碼。該函數檢查是否本地支持'getElementsByClassName'。如果不是,使用Dustin Diaz的方法搜索元素。它遍歷所有節點並使用正則表達式來匹配CSS類名。 [http://www.dustindiaz.com/getelementsbyclass/](http://www.dustindiaz.com/getelementsbyclass/) – Stanley

+0

感謝您的解釋兄弟^^ – SHUMAcupcake

相關問題