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);
复制步骤
  • 使用Firefox
  • 聚焦文件框:
    • 按tab键直到到达它
    • 或者点击它
  • 聚焦文件框时,尝试从
    $(':focus')
    获取结果
  • 请参阅-使用Firefox进行测试

    是否有人能找到一种解决方案,将焦点/活动元素作为jQuery对象,用于


    解决方案需要完全通用,因为功能是插件的一部分。我将无法控制脚本将在其上运行的页面。

    我能想到的唯一方法是在窗口级别添加捕获焦点侦听器,在其中使用事件目标更新全局变量。(在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);
            });