【问题标题】:.focus() doesn't work on an input while orher attributes works.focus() 对输入不起作用,而其他属性起作用
【发布时间】:2011-02-15 04:43:23
【问题描述】:

我有一个经典的table / thead / tbody 结构,我在 tbody 的末尾添加了一行。该行仅包含一个input 元素。该代码适用于 Firefox 3.6,但不适用于 Chrome v5 或 IE8。我正在使用 jQuery 1.4.2。

不起作用: $("#" + AJAX_ID).parent().find('tr:last > td:nth-child(2) > input').focus();

有效: $("#" + AJAX_ID).parent().find('tr:last > td:nth-child(2) > input').css('background-color', 'red');

即使在输入上设置 ID 并使用 document.getElementBuId('id').focus() 也不起作用。

谢谢!

* 编辑 *

该网站非常复杂(模板/静态 html 和动态 html 的混合),但表格 看起来像这样(在 chrome 中呈现 html,通过 tidy 布局):http://pastebin.com/PHqxAEVm

* 编辑 2 *

即使是从 ajax 回调调用的 $("#lectures").find("input:last").focus(); 也不会做任何事情。$("#lectures").find("input:last").css('background-color', 'red'); 虽然会变成红色,但焦点会转到地址栏。

这是从选择器返回的对象的转储: http://pastebin.com/Jdw1TZXf

* 编辑 3 *

这是构建表格的 javascript 代码:http://pastebin.com/cbCfi0UY 在页面加载时,oContainer$("#lectures"),而在 ajax 调用之后它是 $("#" + AJAX_ID).parent(),它应该指向表的 tbody

* 编辑 4 *

难题...这是完整的lectures.js 文件:http://pastebin.com/Jkg0DZqa batissescompteurs 是通过模板加载的 json 对象。用户选择batisse,然后选择compteur,然后按下调用buildAjout()的按钮,在本例中调用buildElectric($("#lectures"), compteur);。一旦用户填写了该行,就会调用onBlurLecture(tr_parent),通过AJAX将数据发送到服务器,并在ajax调用完成后调用function callback_compteurs_lecture_add(AJAX_ID)。函数SendCommand是一个使用jquery ajax的自定义函数。

第一个输入行(和焦点)的创建有效,但不是在 ajax 回调中创建的那个。

* 编辑 5 *

完整呈现的页面如下所示:http://pastebin.com/UfBYcjX3 我缩短了batisses 变量。 (完整)页面没有 javascript 错误。 在 chrome 的 javascript 控制台中,我无法集中输入。

* 编辑 6 *

SendCommand 在这个问题中的函数名称错误。固定。

找到的解决方案: http://bit.ly/bHd6nH

【问题讨论】:

  • 我降级到 1.4.1,focus() 在这些浏览器中对我来说工作正常。一些 HTML 会很好。
  • 我在主要问题中添加了渲染 HTML 的转储。哦,对不起,我有 jQuery 1.4.2。
  • 嗯,我有一个答案,给出了两个潜在的解决方案,但它被否决了,没有任何解释。我有一种感觉,这是因为我批评了这里的两个答案是不正确的。所以我删除了我的。对不起。
  • @Patrick:我没有给你投反对票,我会接受任何批评,这是另一种学习方式:)......实际上似乎每个人都得到了 -1 没有任何解释,哦好吧。
  • @Sirber - 我会重新上线。

标签: javascript jquery internet-explorer javascript-events google-chrome


【解决方案1】:

知道了!

我在写入时使用“制表符”(制表)切换到下一个输入。在最后一个,焦点离开了窗口,所以我无法设置它。我将最后一列“状态”转换为input,以便在执行onBlur 时获得焦点。调用 ajax 加载回调时,会添加新行并按应有的方式聚焦输入。

Chrome:有效
火狐:工作
IE8:工作(有修复)

在上面花了 1.5 天,哈哈

谢谢大家!

【讨论】:

  • 在旁注中,IE8 添加了两行,因为.blur() 在输入失去焦点时触发(通过代码)。我必须添加一组“已发送”ID,这样它就不会执行两次。
【解决方案2】:

您的目标是什么 ID?因为如果我用$('table') 替换$("#" + AJAX_ID) 它可以工作-> demo(至少在Chrome 中)

如果我将函数包装在 $(document).ready(function(){...}) 中,它可以在 IE 中运行 -> demo


我仍在寻找问题可能是什么,但到目前为止我对您的代码有一些 cmet。

  1. 我没有对此进行测试,但我创建了一个 jQuery 对象,然后在其中附加另一个对象,由于函数调用的数量,最终会花费大量时间。我发现只构建一个字符串并且只使用一个追加更容易。这个例子很容易阅读:

    var table = '\
     <table style="width: 100%">\
      <thead>\
       <tr>\
        <th>Numéro</th>\
        <th>litre</th>\
        <th style='width: 100px;'>Status</th>\
       </tr>';
    
    // append more to the string
    table += '<tbody>.....</tbody></table>';
    $('body').append(table);
    
  2. 我找到了这段代码,我只是想告诉你你可以缩短它:

    $("#no_batisse").css('display', 'none');
    $("#lectures").html("");
    $("#lectures").css('display', '');
    

    缩短为:

    $("#no_batisse").hide();
    $("#lectures").empty().hide();
    
  3. 您可以尝试添加一个live 函数,而不是在每行添加后调用此函数:

    $(oLigne).find("input").blur(function() { onBlurLecture(oLigne); });
    

    在初始化脚本时尝试运行它(仅一次)

    $('#lecture').find('input').live('blur', function(){
     onBlurLecture( $(this).closest('tr') );
    })
    

我会继续寻找!

【讨论】:

  • 在页面加载时,javascript 创建表,然后添加一行(id=AJAX_ID)与空输入,并关注第二个字段(工作)。填写完所有输入后,它们将使用行 ID (AJAX_ID) 发送到服务器,服务器保存请求,并将 AJAX_ID 发回,以便我可以更新最后一个字段(状态)并在其上方添加新行。然后,关注第二个字段(失败)。我很确定只使用 html 转储就可以了,但在实际代码中却不行。
  • 如果你是用ajax动态加载行,那么你应该在加载回调函数中设置焦点。
  • 我在加载回调函数中。无论我做什么,我都只能改变输入的 CSS,我无法集中注意力,即使有帕特里克的回答。
  • 我唯一能想到的是,您可能无意中将注意力集中在另一个元素上。我设置了第三个演示 (jsfiddle.net/QPJhq/3),它适用于 FF、IE 和 Chrome……所以我不知道为什么它不起作用。
【解决方案3】:

编辑:

如果您的代码是通过某些具有默认行为的元素(如&lt;a&gt; 元素)触发的,请尝试将return false; 添加到其回调的末尾。

或者,如果你给事件处理函数一个参数,比如function(e) {...},你可以在回调中调用e.preventDefault()而不是return false;


首先,我不知道这是否是问题所在,但 ID 不能以数字开头。

其次,哪个元素有你使用的 AJAX ID?你会得到不同的结果。

为避免任何 ID 问题,您可以这样做:

$("#lectures").find('tr:last > td:nth-child(2) > input').focus();

或者如果您希望它是相对的,请执行以下操作:

$("#" + AJAX_ID).closest('tbody').find('tr:last > td:nth-child(2) > input').focus();

【讨论】:

  • 投反对票的原因是什么?我真的非常希望这是因为我的答案有错误,而不是因为我指出了为什么其他两个答案是错误的。
  • 为了澄清我的评论,现在删除了两个错误答案之一。 fudgey 似乎走在了正确的轨道上。
  • 我在号码前加了“ID”。两者都不起作用。也许我在创建第二行时出了点问题.. 但 DOM 似乎很好。
  • 代码是通过每个input 上的blur() 触发的,模糊调用jquery/ajax 和ajax 调用我的回调函数。 return false; 没有帮助:(
  • @Sirber:但是你说用户按下了一个按钮。那个按钮是什么?我是否正确理解 ajax 正在工作并且您正在收到预期的响应?
【解决方案4】:

尝试触发.focusin()(这是在jQuery的1.4中添加的)See documentation

【讨论】:

  • 同样的事情,它不关注输入:(
  • 对此我很抱歉,我现在将 focusin 处理可能是问题的代码的另一部分 :)
  • focusin() 不给元素焦点,而是检测是否收到焦点。来自文档:当一个元素或其中的任何元素获得焦点时,focusin 事件被发送到该元素。这里的问题首先是获得焦点。
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2017-06-21
  • 2014-06-09
  • 1970-01-01
  • 2017-12-01
相关资源
最近更新 更多