Javascript jQuery中的focus方法没有';行不通
以下代码用于检查模糊字段中是否输入了4个数字。否则,将删除字段值,并聚焦该字段。删除工作正常,但调用focus()不起作用Javascript jQuery中的focus方法没有';行不通,javascript,jquery,Javascript,Jquery,以下代码用于检查模糊字段中是否输入了4个数字。否则,将删除字段值,并聚焦该字段。删除工作正常,但调用focus()不起作用 $('input.dateValue').live('blur',function(event){ if (!(/(\d){4}$/.test($(this).attr('value')))) $(this).attr('value','').focus(); }); 为什么对focus()的调用不聚焦字段?演示 尝试使用this.value而不是$(this.att
$('input.dateValue').live('blur',function(event){
if (!(/(\d){4}$/.test($(this).attr('value')))) $(this).attr('value','').focus();
});
为什么对focus()的调用不聚焦字段?演示
尝试使用this.value
而不是$(this.attr(…)
希望这有助于解决问题,:)
哦,如果您使用的是Jquery 1.7及更高版本,我已经在事件中使用了
请阅读以下内容:
阅读此处
还有另一个已知的带有SetTimeOut的论坛解决方案见下文
代码
$('input.dateValue').on('blur', function(event) {
if (!(/(\d){4}$/.test(this.value))) {
$(this).val('').focus();
};
});
使用focusout代替模糊
提示:
缩进你的代码
使用$.val(“”)代替attr值
在使用IF()时,请使用brakets{}
写得更干净,尽可能简单,这样你以后就不会感到困惑了
快乐编码:)由于模糊事件在实际失去焦点之前触发,因此不能立即使用.focus()
。您必须将其下推堆栈,以便在输入
失去焦点后执行。将.focus()
放入计时器(无需延迟):
这是小提琴:
更新:为了证明这在Chrome中确实有效,我做了另一个小提琴:小细节
大多数时候我读到这样的问题。
这通常是因为事件不正确。
在要求系统设置焦点之前,请确保页面已被处理
这里是一个示例,其中事件页面显示比页面预览显示更好
不是这样工作的
/**
*** a hook to handle list drawing. DOES NOT WORK**
*/
$(document).delegate('#dropdownPopupWindow', "pagebeforeshow", function() {
console.log(UIPopup.TAG+"pagebeforeshow on popup dropdownPopupWindow is setting focus on field field_dropdown_label");
$('#field_dropdown_label').focus();
});
/**
*** a hook to handle list drawing.**
*/
$(document).delegate('#dropdownPopupWindow', "pageshow", function() {
console.log(UIPopup.TAG+"pageshow on popup dropdownPopupWindow is setting focus on field field_dropdown_label");
$('#field_dropdown_label').focus();
});
像这样工作
/**
*** a hook to handle list drawing. DOES NOT WORK**
*/
$(document).delegate('#dropdownPopupWindow', "pagebeforeshow", function() {
console.log(UIPopup.TAG+"pagebeforeshow on popup dropdownPopupWindow is setting focus on field field_dropdown_label");
$('#field_dropdown_label').focus();
});
/**
*** a hook to handle list drawing.**
*/
$(document).delegate('#dropdownPopupWindow', "pageshow", function() {
console.log(UIPopup.TAG+"pageshow on popup dropdownPopupWindow is setting focus on field field_dropdown_label");
$('#field_dropdown_label').focus();
});
如果您使用的是引导模式,则这不起作用:
$('#modalID').modal('show');
$('#modalID #fieldID').focus();
因为需要一点时间才能画出模态,并可用于聚焦。。。我发现400毫秒的超时足够快,用户不会受到影响,并且足够慢,它总是关注元素
$('#modalID').modal('show');
setTimeout(function(){ $('#modalID #fieldID').focus(); }, 400);
实际上,使用可执行注释不会有什么坏处:
function wait_for_modal_to_be_drawn_then( fn )
{
setTimeout( fn, 400 );
}
$('#modalID').modal('show');
wait_for_modal_to_draw_then(
function(){ $('#modalID #fieldID').focus(); }
);
你确定你的函数真的被执行了吗?添加警报(“测试”)代码>就在if
语句之前。这样,每当函数执行时,您就会在屏幕上看到一条消息。@Jocelyn正则表达式确实有效(在blur中,它确实会删除任何不是四位数的值),因此链的一部分会被执行,而focus()部分不会。请注意,正则表达式在字段末尾测试了4位数。(例如,“asdf1234”将通过。)如果您想要4位数字而不需要其他任何内容,请将其设置为/^\d{4}$/
。@nnnnnn谢谢这是一个很好的提示当我在Chrome中时,我注意到如果我向前或向后切换到另一个输入,它确实会将焦点设置回原位,但如果我单击文档或从最后一个字段向前切换,则不会。奇怪。为什么$(this.attr('value','')
?为什么不干脆$(this).val(“”)
?当我尝试演示时,键入'asdf',它会删除它,但字段仍然没有聚焦(即我无法在字段中键入而不手动重新聚焦)@JosephSilber确实会很快更新,尽管我也会给你一个细微的区别,谢谢:)
@JosephSilber我只是在学习jquery,我不知道最好的方法。使用$(this.val('')更好吗?@jela请看这里::)
这对我来说没有任何区别。如果您尝试将焦点设置为另一个字段,则“模糊”和“聚焦输出”都有效,但如果您单击该文档或该文档是最后一个字段(例如,使用制表符将焦点向上移动到地址栏),则它们都无效;在您的案例中,我在Chrome中尝试了您的演示,当我从该字段按tab键时,焦点会移到地址栏并停留在那里。@nnnnnnnn-在演示中-因为没有其他字段可供关注-按tab
键会将您带出窗口上下文,Javascript的统治已经消失。如果页面上还有其他可聚焦的元素,。你在这方面击败了我,有趣的是,这些替代元素似乎只在Chrome中失败。添加了可执行注释位。