如何从浏览器窗口强制外部链接在Electron的默认浏览器中打开?

时间:2015-09-04 16:08:31

标签: node.js electron

我使用BrowserWindow来显示应用,我想强制在默认浏览器中打开外部链接。这是可能的还是我必须以不同的方式处理这个问题?

11 个答案:

答案 0 :(得分:66)

在检查上一个答案的解决方案之后,我想出了这个。

mainWindow.webContents.on('new-window', function(e, url) {
  e.preventDefault();
  require('electron').shell.openExternal(url);
});

根据electron spec,点击外部链接时会触发new-window

注意:要求您在锚标记上使用target="_blank"

答案 1 :(得分:5)

如果您未在target="_blank"元素中使用anchor,这可能对您有用:

  const shell = require('electron').shell;

  $(document).on('click', 'a[href^="http"]', function(event) {
    event.preventDefault();
    shell.openExternal(this.href);
  });

答案 2 :(得分:3)

我没有对此进行过测试,但我认为这应该可行:

1)获取BrowserWindow

WebContents
 var wc = browserWindow.webContents;

2)注册WebContent wc.on('will-navigate', function(e, url) { /* If url isn't the actual page */ if(url != wc.getURL()) { e.preventDefault(); openBrowser(url); } } 并截取导航/链接点击次数:

openBrowser

3)使用will-navigate实施var openBrowser(url) { require('child_process').exec('xdg-open ' + url); } 。 Linux桌面的一个示例:

 <div class="container-fluid">
<div class="row">

  <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12">
  <div id="header"><img class="img-responsive" src="images/profile.jpg"></div>
 </div>
 </div>
<div class="row">
    <div class="col-sm-3"></div>
    <div class="col-sm-6"><img class="img-responsive" src="images/helpUs.jpg"></div>
    <div class="col-sm-3"></div>
  </div>
</div>

让我知道这是否适合您!

答案 3 :(得分:3)

对于任何来过的人。

我的用例:

我在我的应用中使用了this answer on arrays vs sets,它的预览模式是在同一个窗口中打开链接。我希望所有链接都在默认的OS浏览器中打开。我把这个片段基于其他答案放在我的main.js文件中。它在创建新的BrowserWindow实例后调用它。我的实例叫做mainWindow

let wc = mainWindow.webContents
wc.on('will-navigate', function (e, url) {
  if (url != wc.getURL()) {
    e.preventDefault()
    electron.shell.openExternal(url)
  }
})

答案 4 :(得分:2)

从接受的答案改进;

  1. 该链接必须为background.js;
  2. 添加window.webContents.on('new-window', function(e, url) { // make sure local urls stay in electron perimeter if('file://' === url.substr(0, 'file://'.length)) { return; } // and open every other protocols on the browser e.preventDefault(); shell.openExternal(url); }); (或您创建窗口的任何位置):

    public class A
    {
        private void PrivateMethod() {  /*can be seen only here */ }
        protected void ProtectedMethod() {  /*can be seen here and by anyone deriving from me (A) */ }
        internal void InternalMethod() {  /*can be seen here and by anyone in the same assembly with me. */ }
        public void PublicMethod() {  /*can be seen here and by anyone else. */ }
    }
    
  3. 注意:为确保在所有应用程序窗口中出现此行为,应在每次创建窗口后运行此代码。

答案 5 :(得分:2)

new-window 现在在 Electron 12 中被弃用,取而代之的是 setWindowOpenHandler(参见 https://github.com/electron/electron/pull/24517)。

所以更新的答案是:

mainWindow.webContents.setWindowOpenHandler(({ url }) => {
  shell.openExternal(url);
  return { action: 'deny' };
});

答案 6 :(得分:1)

检查请求的网址是否为外部链接。如果是,则使用shell.openExternal

mainWindow.webContents.on('will-navigate', function(e, reqUrl) {
  let getHost = url=>require('url').parse(url).host;
  let reqHost = getHost(reqUrl);
  let isExternal = reqHost && reqHost != getHost(wc.getURL());
  if(isExternal) {
    e.preventDefault();
    electron.shell.openExternal(reqUrl);
  }
}

答案 7 :(得分:0)

将其放在renderer side js文件中。它会在用户的默认浏览器中打开httphttps个链接。

没有附加JQuery!不需要target="_blank"

let shell = require('electron').shell
document.addEventListener('click', function (event) {
  if (event.target.tagName === 'A' && event.target.href.startsWith('http')) {
    event.preventDefault()
    shell.openExternal(event.target.href)
  }
})

答案 8 :(得分:0)

对于Electron 5,这对我有用:

  • main.js(您在其中创建浏览器窗口的位置)的主require语句中(通常在文件顶部)添加“ shell”,例如:

    // Modules to control application life and create native browser window const { BrowserWindow, shell } = require('electron');

  • createWindow()函数内部的mainWindow = new BrowserWindow({ ... })函数中,添加以下行:

    mainWindow.webContents.on('new-window', function(e, url) { e.preventDefault(); shell.openExternal(url); });

答案 9 :(得分:0)

我通过以下步骤解决了问题

  1. const {app, BrowserWindow} = require('electron')上添加外壳
const {app, BrowserWindow, shell} = require('electron')

  1. 将nativeWindowOpen设置为true
function createWindow () {
  // Create the browser window.
  const mainWindow = new BrowserWindow({
    width: 1350,
    height: 880,
    webPreferences: {
      nativeWindowOpen: true,
      preload: path.join(__dirname, 'preload.js')
    },
    icon: path.join(__dirname, './img/icon.icns')
})
  1. 添加以下侦听器代码
  mainWindow.webContents.on('will-navigate', function(e, reqUrl) {
    let getHost = url=>require('url').parse(url).host;
    let reqHost = getHost(reqUrl);
    let isExternal = reqHost && reqHost !== getHost(wc.getURL());
    if(isExternal) {
      e.preventDefault();
      shell.openExternal(reqUrl, {});
    }
  })
通过引用进行

引用https://stackoverflow.com/a/42570770/7458156

答案 10 :(得分:0)

我倾向于在外部 .js 脚本中使用这些行:

let ele = document.createElement("a");
let url = "https://google.com";
ele.setAttribute("href", url);
ele.setAttribute("onclick", "require('electron').shell.openExternal('" + url + "')");