2

私は通常、現在のページですべての作業を行うブックマークレットに取り組んでいますが、新しいウィンドウを開く必要がある場合があります (主にログインフローのため)。これはほとんど機能していますが、クロムは予期しないことをしています。

window.open私が行っている呼び出しは、ほとんどのブラウザーで標準の新しいウィンドウ/タブになりますが、クロムでは別のスタイルのウィンドウで開きます。ウィンドウにはタブがなく、読み取り専用の URL バーがあります。

chrome は、マウス クリックからどれだけ離れて開くかに基づいて動作しているようです。これを示す簡単なコードを次に示します。

<!DOCTYPE html>
<html>
  <head>
    <title>Chrome window.open Test</title>
    <script>
      function startOpen() {
        var delay = Number(document.getElementById('delay').value);
        setTimeout(openWindow, delay);
      }

      function openWindow() {
        window.open('http://www.google.com', '_blank');
      }
    </script>
  </head>
  <body>
    <input type="text" id="delay" value="1000"></input>
    <input type="button" value="Open" onclick="startOpen()"></input>
  </body>
</html>

遅延をそのままにしておくと、1000正常に開きます。ただし、それを3000別のスタイルのウィンドウで開くと、次のようになります。

ここに画像の説明を入力

低速の接続では、ブックマークレットの初期化に 1 秒以上かかることがあるため (いくつかのライブラリをロードして資格情報チェックを実行する必要があります)、この時間枠から外れる場合があり、ブラウザーや試行間で動作に一貫性がなくなります。

標準ウィンドウを開くようにクロムに指示する方法はありますか、それともこれは私が一緒に暮らさなければならない強制的な動作ですか?

4

1 に答える 1

0

このソリューションは Chrome でのみ機能します。アンカーを作成し、要素で Shift+Click イベントをシミュレートすることで機能します。

function openLinkInWindow(url) {
    var anchor = document.createElement("a");
    anchor.href = url;
    document.body.appendChild(anchor);

    var evt = document.createEvent("MouseEvents");
    evt.initMouseEvent("click", true, true, window,
    0, 0, 0, 0, 0, false, false, 

    true, // SHIFT key down

    false, 0, null);
    anchor.dispatchEvent(evt);

    anchor.parentNode.removeChild(anchor);
}

使用法:

  openLinkInWindow("http://www.google.com");

作業例: (2 秒後にリンクが開きます)

http://jsbin.com/ihuwew/1/edit

また、これを遅滞なく(イベントで直接window.onload)テストしましたが、ポップアップブロッカーによってブロックされませんでした

于 2012-11-20T22:24:21.163 に答える