2016-12-24 41 views
1

我试图创建一个触发时,任何一类元素失去焦点的功能:组类成员的形式元素事件的内容()

<h5>ON Time</h5> 
<div class = 'timeSetting'><form id = 'weekendStart'> 
<input type='number' inputmode= 'numeric' pattern='[0-9]*' id = 'onHour' value='6' name = 'value' min='1' max='12'><input type='number' inputmode= 'numeric' pattern='[0-9]*' id = 'onMinute' value='30' name = 'value' min='0' max='59'> 
<select id = 'weekendStartAmPm'> 
<option value = 'weekendStartAm'>am</option> 
<option value='weekendStartPm'>pm</option> 
</select> 
</form></div> 
<h5>OFF Time</h5> 
<div class = 'timeSetting'><form> 
<input type='number' inputmode= 'numeric' pattern='[0-9]*' id = 'onHour' value='10' name = 'value' min='1' max='12'><input type='number' inputmode= 'numeric' pattern='[0-9]*' id = 'onMinute' value='00' name = 'value' min='0' max='59'> 
<select id = 'weekdayStartAmPm'> 
<option value='wkdayStartPm'>pm</option> 
<option value = 'wkdayStartAm'>am</option> 
</select> 
</form></div> 

我知道这是不对的,但我想类似的东西:

$('.timeSetting').focusout(function(){ 
    console.log('lost focus'); 
}); 

,其中用户可以表单元素和编辑转移焦点之间,一旦失去类重点任何(和所有)的成员,则函数火灾标签...

+0

您必须匹配所有元素,请为您的jQuery选择器尝试类似'.timeSetting input,.timeSetting select'。 – PaulBGD

+0

对你有几点提示:我们创建了一个名为focusgroup的jQuery插件来完成这个任务。基本原理是监听焦点事件并检测何时剩下一个组(“document.activeElement”不再在组中)。关键是要触发自定义事件并听取他们的意见,例如“groupfocus”和“groupblur”事件代替高级代码。需要的另一个技巧是在检测到新的activeElement之前等待模糊事件的1帧。 –

+0

找到并回答了我的问题,并将它更新为您的HTML。希望它有帮助。圣诞快乐:) –

回答

0

下面是一个例子基础上的东西,我写了几年前在SO中处理焦点组:http://jsfiddle.net/TrueBlueAussie/0y2dvxpf/6/

$('div.timeSetting').on('focus focusin', 'input,select', function() { 
    var $editor = $(this).closest('.timeSetting'); 
    $editor.addClass("focused"); 

}).on('blur focusout','input,select', function() { 
    var $editor = $(this).closest('.timeSetting'); 
    // wait for the new element to be focused 
    setTimeout(function() { 
    // See if the new focused element is in the editor 
    if (!$.contains($editor[0], document.activeElement)) { 
     $editor.removeClass("focused"); 
    } 
    }, 0); 
}); 

现在它只是说明了类变化的焦点,但是你可以很容易触发自定义事件,并抓住祖先的人。

+0

我喜欢这种方式,但绑定到'模糊'和'聚焦'导致两个事件在失去焦点时被触发(以及模拟焦点)。显然,我删除一个,它运作良好;那里是否提供多种浏览器支持?另外,你能告诉我为什么我需要两次点击一个'select'对象来失去对该对象和相应的div的焦点? –

+0

@JimfromPrinceton:随意修改事件。大部分来自记忆。你不应该需要2次点击,除非可能如果选择是打开的,所以不得不看一下。应该在所有浏览器上工作,因为我们在生产中使用类似的东西。 –

0

试试这个:

$("[class] input").focusout(function(){ 
    console.log('lost focus'); 
}); 

这将选择任何具有class属性设置为任何值的元素中存在的任何输入。

空字符串:

如果ATTR必须存在&可以有任意数值(或根本没有)

jQuery("[href]"); 

编辑:但是,如果你要检测的时刻焦点从class1的div到class2的另一个div,您可以使用以下代码:

var currentClass = false; 
var leftClass = false; 
$("[class]").focusout(function(){ 
    leftClass = $(this).attr('class'); 
    console.log('lost focus ' + leftClass); 
}); 

$("[class]").focusin(function(){ 
    currentClass = $(this).attr('class'); 

    if(leftClass && leftClass != currentClass) { 
     // Put your code here 
     console.log(" div left " + leftClass); 
    } 
    console.log('in focus ' + currentClass); 
}); 
+0

这将检测每个模糊事件。 OP想知道重点何时离开包装表格的div。 –

+0

这将检测任何具有class属性的div中每个输入的丢失焦点:他说:**并且一旦该类的任何(和所有)成员失去焦点,则该函数将触发** –

+1

@GoneCoding正确。一旦班级成员失去焦点,我想要执行这个功能。我的第一篇文章写得不好。 –