Я использую BrowserWindow для отображения приложения, и я хотел бы заставить внешние ссылки открываться в браузере по умолчанию. Возможно ли это, или мне нужно подойти по-другому?
Как заставить внешние ссылки из окна браузера открываться в браузере по умолчанию от Electron?
Ответ 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
Улучшено из принятого ответа;
- ссылка должна быть
target="_blank"
; добавьте в
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); });