2011-07-27 41 views
0

我有一个动态创建的复选框的列表。当复选框的状态改变时,执行一个功能。无论用户点击复选框还是使用键盘输入来更改复选框,该功能都可以在Firefox 3.6中完美运行。在Chrome或Safari浏览器中,该功能可以使用键盘正常运行,但通过点击鼠标即可出错。我似乎无法找到为什么代码行为不同于鼠标点击与键盘输入。复选框事件处理程序抛出错误的Chrome浏览器中的点击事件,Safari浏览器与键盘事件正常工作

以下是我认为这是相关代码:

var q_id = $j('label:contains("SCORP Statewide Need ")').attr('for'); 
console.log(q_id); //writes out answer id a_721 

一个ajax后会创建的复选框列表:

if(found == true){ 
    output+="<div name='"+q_id+"'><input type='checkbox' name='"+q_id+"' id='"+q_id+"."+i+"' class='check' checked='checked' onChange='saveStateNeed("+q_id+")' value='"+list[i]+"'/>"; 
}else{ 
    output+="<div name='"+q_id+"'><input type='checkbox' name='"+q_id+"' id='"+q_id+"."+i+"' class='check' onChange='saveStateNeed("+q_id+")' value='"+list[i]+"'/>"; 
} 
output+=" <label name='l_"+q_id+"' for='"+q_id+"."+i+"' id='l_"+q_id+"."+i+"'>"+ list[i] +"</label></div>"; 
output+="<div class='clearboth'></div><br/>"; 
$j('##div_'+q_id).append(output); 

这一切是在所有的浏览器完全产生。 错误在回调saveStateNeed();

function saveStateNeed(list){ 

    console.log('in saveStateNeed'); 


    console.log(list);// prints out an array of the checkboxes [input#a_721.0.check Non-motorized trails, input#a_721.1.check Sports a...ayfields, input#a_721.2.check Land Acq...projects, input#a_721.3.check Picnicki...cilities, input#a_721.4.check Nature s...wildlife] 

      // **in safari i get function()** but it still works with keyboard, fails with click 
      // the next assignment $me fails. 

    var $me = $j('input [name="'+list+'"]'); 
    var isChecked = $me.context.activeElement.checked; 
    var $value = $me.context.activeElement.attributes['value'].nodeValue; 


    console.log($me); out puts the object selected as an expandable firebug object [] 



    console.log($value); outputs label for object: Picnicking/day use facilities 


    console.log(isChecked); outputs true false 

    if(isChecked){ 
    }else{ 

    } 

    $j.ajax({ 
     type: "POST", 
     url:  }); 

} 

这是所有类型的令人费解的,我只是希望有人知道我为什么会从一个点击,然后在键盘上输入,实际上是被执行相同的代码时,得到不同的结果。 我真的希望这不是太复杂。 感谢您看看这个,我真的很感谢您可能有任何意见或建议。 欢呼声。

+0

你在Chrome/Safari中究竟遇到什么错误? – Remi

+0

仅供参考:在其他浏览器中测试时,您可能想要移除console.log语句。有些人根本不支持它,其他人只有在他们的控制台可见时才支持它。我不认为这是罪魁祸首。 – Tom

+0

heh,我从chrome开发工具中得到的实际错误是:Uncaught TypeError:无法读取未定义的属性'nodeValue'。但是再次,我只能通过点击鼠标来获得这个效果,它可以很好地点击空格键来更改复选框。感谢您的期待。 – lowgas

回答

0

如果您将复选框行为作为委托事件而不是显式分配,那么您可能会有更好的运气。

它看起来像你使用jQuery,所以你能做到这一点,像这样:

$j('input.check').live('change', function(event) { 
    var jThis = $j(this); 
    // grab id from checkbox 
    var ID = jThis.attr('id').split('.')[0]; 
    saveStateNeed(ID, jThis.attr('checked')); 
    return true; 
}); 

另外:你一定错误是在事件处理程序,而不是在saveStateNeed功能?

编辑:根据您的更新,这里是我得到的。首先,注意上面函数的小改动;现在它传递了两个值。其次,如果您想对正在切换的复选框执行操作,请修改saveStateNeed以接受两个值:一个ID和一个布尔值。像这样:

function saveStateNeed(ID, bChecked) { 
    console.log('checkbox ' + ID + ' is ' + (bChecked) ? 'checked' : 'not checked'); 

    if(bChecked) { 
     // do something 
    } else { 
     // do something else 
    } 
} 
+0

是的,它们实际上是在saveStateNeed函数中。我误用了术语。我会看到我能用这个方法来做什么。谢谢你的时间,如果这是一个解决方案,我一定会回报给予信贷。thx – lowgas

+0

与此一起工作改变了我到达函数saveStateNeed的方式,但不改变函数内部正在发生的事情。所以,在safari中,代码行 var isChecked = $ me.context.activeElement.checked; var $ value = $ me.context.activeElement.attributes ['value']。nodeValue; 都会在用户通过鼠标单击触发更改时返回'未定义',但当用户通过键盘上的空格键触发更改时,它们会返回正确的值。 – lowgas

+0

这没有解决最初的问题,但一旦我设置我的代码这种方式,我只是通过$ j(this)的功能,然后能够使用通常的jquery方法和属性来获取我需要的所有信息一次功能。谢谢您的帮助。 – lowgas

相关问题