Javascript $(“焦点”)不为<;返回任何元素;输入类型=";文件"/&燃气轮机;在Firefox中
如果是Javascript $(“焦点”)不为<;返回任何元素;输入类型=";文件"/&燃气轮机;在Firefox中,javascript,jquery,forms,firefox,file-upload,Javascript,Jquery,Forms,Firefox,File Upload,如果是,我似乎无法在Firefox中将当前关注的/活动的元素作为jQuery对象。它适用于其他输入类型(文本、密码、提交、其他)和其他元素类型(,,其他) HTML Javascript //找不到焦点为的输入类型文件元素, //Firefox中$focused.length始终为0(使用FF 10.0.1测试) var$focusedTest1=$(“:focus”); //这行代码适用于Firefox(使用FF 10.0.1测试) //访问属性“nodeType”的权限被拒绝 // @
,我似乎无法在Firefox中将当前关注的/活动的元素作为jQuery对象。它适用于其他输入类型(文本、密码、提交、其他)和其他元素类型(
,
,其他)
HTML
Javascript
//找不到焦点为的输入类型文件元素,
//Firefox中$focused.length始终为0(使用FF 10.0.1测试)
var$focusedTest1=$(“:focus”);
//这行代码适用于Firefox(使用FF 10.0.1测试)
//访问属性“nodeType”的权限被拒绝
// @ http://code.jquery.com/jquery-1.7.1.js:108
//在jQuery.fn.init中,在“Handle$(DOMElement)”下面
var$focusedTest2=$(document.activeElement);
复制步骤
- 按tab键直到到达它
- 或者点击它
$(':focus')
获取结果
?
解决方案需要完全通用,因为功能是插件的一部分。我将无法控制脚本将在其上运行的页面。我能想到的唯一方法是在窗口级别添加捕获焦点侦听器,在其中使用事件目标更新全局变量。(在Firefox中,文件输入中焦点事件的事件目标是文件输入本身,即使document.activeElement返回“anonymous”按钮。)编辑:此解决方案已在中的何处实施。看
在中断编码后,我自己找到了一个解决方案——但这不是一个非常干净的解决方案。这基本上是我第一次写这篇文章时提出的建议 试试Firefox。它结合了
:focus
、document.activeElement
和文档级焦点侦听器,这些侦听器跟踪最后一个“已知”的焦点元素
查找聚焦元素的函数
我不太喜欢这个解决方案,因为它远没有一行
$(':focus')
那么干净。欢迎其他答案 试试这个-在Firefox 10.0.1中测试过
$(document).ready(function () {
var crtFocus;
$("#id1").focus(function () {
crtFocus = $(this);
});
$("#id2").focus(function () {
crtFocus = $(this);
});
$("#id3").focus(function () {
crtFocus = $(this);
});
$("#click").click(function () {
// $(crtFocus) contains the currently focused element
//alert($(crtFocus));
});
});
...
<input type="file" id="id1" />
<input type="file" id="id2" />
<input type="file" id="id3" />
<input type="button" id="click"/>
我发现了一些有效的方法(至少在测试用例中),但它涉及文档级侦听器和try-catch逻辑。稍后将发布它。嗯,document.activeElement似乎生成了一个没有id的文本字段,这似乎就是问题所在。不知何故,它只是一种不同的元素,不能用它做太多。@Johan:它可能是一种元素,我怀疑这是问题的一部分。“包装器可能会出现在控制台日志中;例如“[object XrayWrapper[object blah]]”。因为这些包装器是包装好的,所以您无法从控制台向下窥视它们的内部。”有过这样的解决方案。不久前实现了它-看看更新的代码,让我知道它是否有效@Joel我不习惯focusin/focusout,但它在本地使用一个普通的旧焦点事件处理程序对我有效。如果它有效(气泡);/是/的规范化冒泡版本。所以,最好马上使用冒泡版本。@Joel啊,但不幸的是,它们还没有在Firefox上真正实现;看见该页面还可以通过取消传播来混淆冒泡处理程序……使用jQuery的众多原因之一是所有浏览器规范化都是在后台完成的。参见第3649行,创建“气泡”聚焦和模糊事件。我认为jQuery假设了这一点,但已经为将来的浏览器支持检查做好了准备。在这两种情况下,jQuery都支持focusin/focusout=),这与类似,但每个文件输入有一个侦听器。因为我不知道页面上可以添加/删除哪些元素(这是一个插件),所以我更喜欢使用固定数量(两个)的文档/窗口/正文级侦听器。谢谢你的回答!请参阅我编辑的回复,以了解简化版,其中所有文件元素都只有一个选择器。但是,当开发人员动态添加更多文件输入时(如gmail的“添加附件”)将无法工作
.live(“focus”,…)
效果更好。$('input[type=file]').live(“focus”,focusineelement)。live(“blur”,focusOutElement)代码>似乎有效。谢谢
// Keep a reference to the last focused element, use as a last resort.
var lastFocusedElement = null;
function focusInElement(event) {
lastFocusedElement = event.target;
}
function focusOutElement(event) {
lastFocusedElement = null;
}
// Start listeners.
$(function() {
// Start listeners that keep track of the last focused element.
$(document).on("focusin", focusInElement);
$(document).on("focusout", focusOutElement);
});
$(document).ready(function () {
var crtFocus;
$("#id1").focus(function () {
crtFocus = $(this);
});
$("#id2").focus(function () {
crtFocus = $(this);
});
$("#id3").focus(function () {
crtFocus = $(this);
});
$("#click").click(function () {
// $(crtFocus) contains the currently focused element
//alert($(crtFocus));
});
});
...
<input type="file" id="id1" />
<input type="file" id="id2" />
<input type="file" id="id3" />
<input type="button" id="click"/>
$(':input[type=file]').focus(function () {
crtFocus = $(this);
});