我有两个输入字段。主要思想是,无论何时聚焦到其中一个字段,按钮单击都应在其中打印一个随机数。
我的问题是,当你只是专注于(点击)第一个字段,然后专注于第二个字段(反之亦然)时,按钮单击会打印到两个而不是仅显示到(最后一个)聚焦字段。
您可以尝试在此处重新创建问题:http://jsfiddle.net/sQd8t/3/
JS:
$('.family').focus(function(){
var iD = $(this).attr('id');
$("#sets").one('click',function() {
var ra = Math.floor((Math.random()*10)+1);
$('#'+iD).val(ra);
});
});
HTML:
<center class='mid'>
<input type="text" class="family" id="father" />
<br/><br>
<input type="text" class="family" id="mother" />
<br/>
<br/>
<input type='submit' value='Set text' id="sets"/>
</center>
答案 0 :(得分:2)
在“焦点”处理程序中,取消绑定任何现有的“点击”处理程序:
$('#sets').unbind('click').one('click', function() { ... });
您拥有它的方式,每次字段获得焦点时,都会绑定一个额外的一次性“单击”处理程序,因为jQuery允许您将任意数量的处理程序绑定到事件。换句话说,调用.one()
并不解除其他处理程序的绑定。当实际发生点击时,所有处理程序都会运行。
编辑 - 抱歉 - “unbind”是旧的API;现在.off()
是首选。
答案 1 :(得分:1)
将变量iD放在外面,并将函数分开:
这可以防止在每个输入点击/焦点上添加太多事件。 无需解开。
var iD;
$('.family').focus(function() {
iD = $(this).attr('id');
});
$("#sets").on('click', function() {
var ra = Math.floor((Math.random() * 10) + 1);
if (iD!="")$('#' + iD).val(ra);
iD = "";
});
答案 2 :(得分:1)
请参阅http://jsfiddle.net/sQd8t/11/
$('.family').focus(function(){
$("#sets").attr('data-target',$(this).attr('id'))
});
$("#sets").click(function() {
var target=$(this).attr('data-target');
if(target){
var ra = Math.floor((Math.random()*10)+1);
$('#'+target).val(ra);
}
});
您可以创建一个data-target
属性,其中包含必须修改的字段。