2013-04-11 105 views
-1

我确实有以下脚本。它只在Chrome中运行。我无法检查或激活复选框。我怎样才能让它在FF和IE中运行?Javascript FF和IE

<script type="text/javascript"> 
    function checkHoverButton() { 
     var lis = document.getElementsByTagName('li'); 
     for(var i = 0, l = lis.length; i < l; i++) { 
      lis[i].onclick = function() { 

       var c = this.getElementsByTagName('input')[0]; 

       if (c.checked){ 
        c.checked = 0; 
        this.style.background = 'white';  
       } 
       else{ 
        c.checked = 1; 
        this.style.background = '#eceff5'; 
       } 
      }; 
     } 
    } 
</script> 

<li class="friends-li"> 
    <span class="green"> 
    <input type="checkbox" value="<?php echo $value; ?>" id="form_friend_<?php echo $value; ?>" name="form[friend][]" /> 
    </span> 
    <span class="pink"> 
    <img id="img_friend_<?php echo $value; ?>" src=""> 
    </span> 
    <span class="blue"> 
    <label for="form_friend_<?php echo $value;?>" ><?php echo $label;?></label> 
    </span> 
</li> 
+3

你试过c.checked'设置'来TRUE'和'FALSE'的'他们正确的价值观? – 2013-04-11 19:07:11

+0

请告诉我们在IE中发生了什么问题... – kay 2013-04-11 19:07:17

+0

期望的行为是什么?什么不在IE/Firefox中工作? – 2013-04-11 19:07:43

回答

3

首先,我假定您在代码的某处调用了checkHoverButton

问题是事件冒泡。

当您点击复选框或标签时,您基本上会取消该操作。你需要确保你没有点击这些元素。

lis[i].onclick = function(e) { 

    var clickedOn = (e.srcElement || e.target).nodeName; 
    if(clickedOn==="INPUT"||clickedOn==="LABEL") return;  
    var c = this.getElementsByTagName('input')[0]; 

- 编辑 -

lis[i].onclick = function(e) { 

    var clickedOn = (e.srcElement || e.target).nodeName; 
    var setState = clickedOn!=="INPUT" && clickedOn!=="LABEL";  
    var c = this.getElementsByTagName('input')[0]; 
    if (setState) { 
     c.checked = !c.checked; 
    } 
    this.style.background = c.checked ? "#eceff5" : "#fff"; 
}; 
+0

如果点击复选框或标签,背景颜色不会改变(因为'if'没有得到执行) - http://jsfiddle.net/t7RmF/3/。如果你在“li”之外点击,那么它就可以工作。我认为它需要更多的逻辑。我觉得哑巴,但我不明白哈哈 – Ian 2013-04-11 19:48:27

+0

不要设置复选框的选中状态。上面的基本想法,我想我得到了正确的顺序的颜色。 – epascarello 2013-04-11 19:50:18

+0

供参考:我编辑了代码以向您展示基本想法。 – epascarello 2013-04-11 19:57:53

1

@epascarello的做法是非常好的。

我做了一个例子,也许它有帮助。

JSFiddle

var lis = document.getElementsByTagName('li'), 
     checkHandler = function(event){ 
      event.stopPropagation(); 
     }, 
     clickHandler = function (event) { 
      var c = this.getElementsByTagName('input')[0]; 
        c.onclick = checkHandler; 
      if (c.checked) { 
        c.checked = 0; 
        this.classList.remove('darker'); 
        this.classList.add('white'); 
      } else { 
        c.checked = 1; 
        this.classList.remove('white'); 
        this.classList.add('darker'); 
      } 
      return false; 
     }; 

for (var i = 0, l = lis.length; i < l; i++) { 
     lis[i].onclick = clickHandler; 
}