$window.focus()在iOS Safari中的现有标签页上不起作用

mdfafbf1  于 2023-06-07  发布在  iOS
关注(0)|答案(3)|浏览(351)

当我用var win = window.open("", "name")打开一个新窗口,然后用win.focus()聚焦窗口时,这是iOS Safari中第一次有效。
但是,当使用www.example.com通过名称再次引用现有窗口时window.open我无法在iOS Safari中再次聚焦。在Chrome中,这很好用。
有没有什么方法可以让我专注于一个已经存在的标签,只知道它的名字?
我创造了一个小提琴测试:https://jsfiddle.net/szqnu38f/

nbysray5

nbysray51#

这似乎是iOS Safari中的一个bug。
通常,不可能在现有的命名选项卡上再次设置焦点。当打开标签后再次单击目标设置为名称的链接时也是如此-->参见https://jsfiddle.net/g3bk1v5a/4/

<a href="http://www.google.com" target="test">Test</a>

因此,我在Apple打开了一个bug报告。

crcmnpdw

crcmnpdw2#

在Apple修复此错误之前,您可以使用以下解决方法:

// replace win.focus() by:
win.close();
win = win.open("", "name");
neskvpey

neskvpey3#

您可以检查活动选项卡是否失去焦点,并在可能的情况下重新使用打开的窗口:

const references = {};

const openReference = (href) => {
  references[href] = open(href, href);
  if (!references[href]) return;

  references[href].addEventListener('load', () => {
    references[href].addEventListener('beforeunload', () => {
      delete references[href];
    });
  });
};

const handleNoBlur = (callback) => {
  let blurTimeout;

  const handleBlur = () => {
    clearTimeout(blurTimeout);
    removeEventListener('blur', handleBlur);
  };

  blurTimeout = setTimeout(() => {
    removeEventListener('blur', handleBlur);

    callback();
  }, 100);

  addEventListener('blur', handleBlur);
};

const openOrFocus = (href) => {
  const reference = references[href];

  if (reference && reference.closed === false) {
    handleNoBlur(() => {
      reference.close();
      openReference(href);
    });

    reference.focus();
  } else {
    openReference(href);
  }
};

openOrFocus('https://stackoverflow.com/');

相关问题