Подтвердить что ты не робот

Как заставить внешние ссылки из окна браузера открываться в браузере по умолчанию от Electron?

Я использую BrowserWindow для отображения приложения, и я хотел бы заставить внешние ссылки открываться в браузере по умолчанию. Возможно ли это, или мне нужно подойти по-другому?

4b9b3361

Ответ 1

Я придумал это, проверив решение из предыдущего ответа.

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

Согласно электронной спецификации, new-window срабатывает при нажатии на внешние ссылки.

ПРИМЕЧАНИЕ. Требуется, чтобы вы использовали target="_blank" в своих тегах привязки.

Ответ 2

Если вы не используете target="_blank" в своих anchor элементах, это может сработать для вас:

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

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

Ответ 3

Я не тестировал это, но я предполагаю, что это должно работать:

1) Получите WebContents вашего BrowserWindow

 var wc = browserWindow.webContents;

2) Зарегистрируйтесь для will-navigate WebContent и перехватите навигационные/ссылки:

wc.on('will-navigate', function(e, url) {
  /* If url isn't the actual page */
  if(url != wc.getURL()) {
    e.preventDefault();
    openBrowser(url);
  } 
}

3) Внесите openBrowser с помощью child_process. Пример для настольных компьютеров Linux:

var openBrowser(url) {
  require('child_process').exec('xdg-open ' + url);
}

сообщите мне, если это сработает для вас!

Ответ 4

Для всех, кто приходит.

Мой прецедент:

Я использовал SimpleMDE в своем приложении, и в режиме предварительного просмотра открывались ссылки в том же окне. Я хотел, чтобы все ссылки открывались в браузере ОС по умолчанию. Я помещаю этот фрагмент, основываясь на других ответах, внутри моего файла 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)
  }
})

Ответ 5

Улучшено из принятого ответа;

  1. ссылка должна быть target="_blank";
  2. добавьте в background.js (или в любом месте, где вы создали свое окно):

    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);
    });
    

Примечание: Чтобы обеспечить такое поведение во всех окнах приложения, этот код следует запускать после каждого создания окна.

Ответ 6

Проверьте, является ли запрошенный URL-адрес внешней ссылкой. Если да, то используйте 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

Поместите это в файл renderer side js. Он откроет ссылки http, https в браузере по умолчанию пользователя.

Нет подключенного JQuery! no 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

Для Electron 5 это то, что у меня сработало:

  • В main.js (где вы создаете окно браузера), включите "shell" в свой основной оператор require (обычно вверху файла), например:

    // 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); });