为什么jquery focus()只触发一次?

时间:2018-02-08 21:07:48

标签: javascript jquery google-chrome-extension setfocus

我有一个Chrome扩展程序,可以将iframe添加到特定网址。

我创建了一个快捷键,将焦点移动到iFrame中的输入框。

内容脚本向背景发送消息,该消息向iframe发送消息。

效果很好 - 一次。

  • 以下代码中的控制台消息(在iframe js文件中)总是触发 - 所以我知道消息正在通过
  • 如果我更改代码以在输入中插入值,则每次都可以使用
  • 我添加了$('#searchLibraryTB')。blur();到输入框的成功处理程序...这似乎清除了事情,后续的消息集中在输入上将起作用。只有当你专注于输入时,然后将鼠标移开(不输入任何内容并触发成功处理程序)焦点不起作用。 通过一些试验和错误,我认为问题在于我将焦点设置一次,并且iframe认为元素STILL具有焦点 - 即使在我点击回主窗口之后。所以这条路径有效,因为我以编程方式模糊了输入。所以解决方案必须做一些事情来清除/删除第一次迭代中的焦点集。
    • 我有一个"焦点清除任何价值' iframe JS文件中的行,虽然当消息通过时光标不会保留在输入中,但确实会清除输入中的任何文本,这意味着某些内容正在通过。

我已经阅读了一些关于焦点的旧帖子()只在Chrome上工作一次......我无法相信这是真的。我认为这是由于某种事件加倍或某种原因......

有什么想法吗?

这是iframe JS中的消息接收器。同样,这总是接收消息以将焦点放在输入上。第一次通话后它就不会这样做。刷新页面会重置内容,而消息传递只能工作一次。

谢谢!

  chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
    if (request.method === "focusToolbar"){
      console.log('Receiving message from background to focus toolbar in aSearch.js...');
      // $('#searchLibraryTB').on("focus", function(){
      //   console.log('search already had focus...');
      //   // $('#searchLibraryTB').val("this sux");
      //   $('#searchLibraryTB').off( "focus" );
      //   // $('#searchLibraryTB').focus();
      // });

      $('#searchLibraryTB').focus();
    }
  });

1 个答案:

答案 0 :(得分:0)

有时在StackOverflow中写出你的问题可以帮助你思考......

我在焦点之前添加了一个模糊事件...以确保该元素没有关注第二个和后续的消息传递......

这就是诀窍。

  $('#searchLibraryTB').blur();
  $('#searchLibraryTB').focus();