λ΄ μ€μ μμ shell.openExternal('http://example.com')
λ° shell.openItem('http://example.com')
λ₯Ό λͺ¨λ μλνκ³ λ λ€ λ°±κ·ΈλΌμ΄λμμ μΉ μ¬μ΄νΈλ₯Ό μ΄μμ΅λλ€.
λ΄κ° μ¬μ©νλ κ²°κ΅ child_process.execSync('start http://example.com')
λ Win32μμμ child_process.execSync('open http://example.com')
λΈλΌμ°μ κ° μ€μ λ‘ λνλκ³ ν¬μ»€μ€λ₯Όλ°μ μ μλλ‘ λ€μμ.
Linuxμμλ xdg-openμ μ¬μ©ν μ μμ΅λλ€.
child_process.execSync('xdg-open http://example.com')
μ€μ λ‘ node-open μ μ¬μ©νκΈ°λ‘ κ²°μ νμ΅λλ€. νμΆ λ±μ μλ§μΌλ‘ λ§λ€κ³ μΆμ§ μλ€λ©΄ μλν΄μΌν©λλ€.
μ¬λ¬λΆ, νμ§λ§ κ·νμ μ루μ
μ νλ₯νμ§λ§ " http://someurl.com "κ³Ό κ°μ URLμ μ¬λ λ°©λ²μ κ°λ‘μ±μ shell.openExternal
λ‘ μ¬λ λ°©λ²μ΄ κΆκΈν©λλ€. μλΉμ€ μ컀λ λμΌν λλ©μΈμ μλ νμΌμ λν μμ²λ§ μ‘μ μ μμ΅λλ€. μ΄κ²μ ν μ μλ λ₯λ ₯μ΄ μμ΅λκΉ? /cc @maxogden @AlicanC
@havenchyk μ κ°μ μ§λ¬Έμ λλ€. μ μμκ² κΈ°λ³Έμ μΌλ‘ μΈλΆ λ§ν¬λ₯Ό μ΄λλ‘ μ§μνλ λ°©λ²μ΄ μμ΅λκΉ?
μ±μ΄ νλμ μ°½λ§ μ¬μ©νκ³ μ±μ λͺ¨λ μΈλΆ λ§ν¬κ° μ μ°½μμ μ΄λ¦¬λλ‘ λ³΄μ₯ν μ μλ κ²½μ°(μ: target="_blank"
), λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€.
webContents.on('new-window', function(event, url){
event.preventDefault();
open(url);
});
μ¬κΈ°μ webContents
λ κΈ°λ³Έ BrowserWindowμ webContentsμ΄κ³ open
λ λΈλΌμ°μ μμ URLμ μ¬λ κΈ°λ₯μ
λλ€(μ λ AlicanCμμ κΆμ₯νλ λλ‘ node-open μ μ¬μ©
_any_ λ§ν¬λ₯Ό ν΄λ¦ν λ μ΄λ²€νΈκ° λ°μνμ¬ μ±μ΄ λΈλΌμ°μ μμ μ΄μ΄μΌ νλμ§ μ¬λΆλ₯Ό κ²°μ ν μ μμΌλ©΄ μ’κ² μ§λ§ κ·Έλ° μ΄λ²€νΈκ° μμΌλ©΄ μ°Ύμ§ λͺ»νμ΅λλ€.
SOμμ μ΄ μ½λ μ€λν«μ μ°Ύμμ΅λλ€.
var shell = require('electron').shell;
//open links externally by default
$(document).on('click', 'a[href^="http"]', function(event) {
event.preventDefault();
shell.openExternal(this.href);
});
λ΄ κΈ°λ³Έ μμΈ νμΌμ μμ νλλ° λμ μΌλ‘ μμ±λ λ§ν¬μ λν΄μλ λ΄κ° λ§ν μ μλ ν μλνλ κ² κ°μ΅λλ€. λλ μ μμ λν΄ λ무 λ©μ²ν΄μ λ΄κ° μ£Όμν΄μΌ ν λ¨μ μ΄ μλμ§ μμ§ λͺ»ν©λλ€. μκ°?
μ΄ μ½λλ₯Ό μ¬μ©νκ³ μμ΅λλ€.
var handleRedirect = (e, url) => {
if(url != webContents.getURL()) {
e.preventDefault()
require('electron').shell.openExternal(url)
}
}
webContents.on('will-navigate', handleRedirect)
webContents.on('new-window', handleRedirect)
λ¨Όμ μ€ν° νλ‘μΈμ€λ₯Ό μ μΈνμμμ€.
`app.controller('GuideCtrl', ['$scope', ($scope)=>{
const μ€ν° = require('child_process').spawn;
$scope.openBrowser=(url)=>{
let exec = spawn('explore', [url], {});
exec.stdout.on('data', (data)=> {
console.log('stdout: ' + data)
});
}
}])`
κ·Έλ¦¬κ³ λ©μλλ₯Ό νΈμΆνκΈ° μ μ
<a ng-click="openBrowser('https://google.com')">Goto google</a>
shell.openExternal
보μ λ¬Έμ κ° μμ΅λκΉ? μλ₯Ό λ€μ΄ λ§ν¬κ° λ€νΈλ₯Ό λ²μ΄λλ©΄ μμ λ€νΈ λ°μ΄ν°κ° shell.openExternal
λλ μμ λ€λ₯Έ κΈ°λ₯μΌλ‘ μ λ¬λ©λλ€. shell.openExternal
κ°) λμ μΌμ΄ μΌμ΄λμ§ μλλ‘ ν©λκΉ? μ€ν€λ§λ₯Ό νν°λ§ν΄μΌ ν©λκΉ?
@rubencodes μ μ½λλ₯Ό κΈ°λ°μΌλ‘ λ€μμ μ¬μ©νμ΅λλ€.
const shell = require('electron').shell;
$('.open-in-browser').click((event) => {
event.preventDefault();
shell.openExternal(event.target.href);
});
κ·Έλ° λ€μ λΈλΌμ°μ μμ μ΄λ €λ κ° μμμ 'λΈλΌμ°μ μμ μ΄κΈ°' ν΄λμ€λ₯Ό λλ‘νκΈ°λ§ νλ©΄ λ©λλ€.
λ€μμ λ€λ₯Έ μ¬λμ΄ μ°Ύκ³ μλ κ²½μ°λ₯Ό λλΉνμ¬ JQueryκ° νμνμ§ μμ κ²μ λλ€. μΈλΆ λΈλΌμ°μ μμ 'http'λ‘ μμνλ λͺ¨λ λ§ν¬κ° μλμΌλ‘ μ΄λ¦½λλ€.
μ΄κ²μ λ λλ¬ νλ‘μΈμ€μ λ£μΌμμμ€.
// Open all links in external browser
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)
}
})
λͺ¨λ <a>
νκ·Έκ° κΈ°λ³Έ λΈλΌμ°μ μμ μ΄λ¦¬λλ‘ νλ €λ©΄ main.tsμμ λ€μμ μλνμΈμ.
const shell = require('electron').shell;
mainWin.webContents.on('will-navigate', (event, url) => {
event.preventDefault()
shell.openExternal(url)
});
μ΄κ²μ λμ κ°μ λ¨μΌ νμ΄μ§ μ±μ΄ μλ€κ³ κ°μ ν©λλ€. κ·Έλ μ§ μμ κ²½μ° μΆκ° μλ μ μνν΄μΌ ν©λλ€.
νμ΄νΈλ¦¬μ€νΈκ° μλ μ¬μ©μ μ½ν μΈ μ ν¨κ» μ΄κ²μ μ¬μ©νλ κ²μ μλ§λ 보μμμ νμ μ΄ λ μ μλ€λ μ μ λ°λ³΅νκ³ μΆμ΅λλ€. λ€μν ꡬμ±νκ° λͺ¨λ 무μμ νλμ§, μ λ ₯κ°μ΄ 무μμΈμ§λ λͺ¨λ₯΄κ² μ§λ§ λ€μκ³Ό κ°μ κ°λ¨ν μμ λλ€.
<a href="imessage:hello">click me</a>
macOSμ Chrome λ° Safariμμ μ¬μ©μμκ² λ©μμ§λ₯Ό νμνμ§λ§ Electron μμ μ½λλ₯Ό μ¬μ©νλ©΄ μ±μ΄ μ΄λ¦½λλ€.
Electron μμ²΄κ° λͺ¨λ κ°λ³ νλ‘κ·Έλλ¨Έμκ² μ€μ€λ‘ 보μμ μ μ§νλ λ°©λ²μ μμλ΄λλ‘ λ§‘κΈ°κΈ°λ³΄λ€λ μ¬κΈ°μμ λ μμ ν κΈ°λ³Έ μ€μ μ ν΄μΌ νλ κ²μ²λΌ λκ»΄μ§λλ€.
μ΅μν λ€μκ³Ό κ°μ κ²μ μν κ²μ λλ€.
function isSafeishURL(url) {
return url.startsWith('http:') || url.startsWith('https:');
}
mainWin.webContents.on('will-navigate', (event, url) => {
event.preventDefault();
if (isSafeishURL(url)) {
shell.openExternal(url);
}
});
@greggman https://electronjs.org/docs/api/session#sessetpermissionrequesthandlerhandler μμ κ³΅κ° μΈλΆ κΆν μ νμ
μ°¨λ¨ν μ μμ΅λλ€ π
μλ νμΈμ, μ λ vue.jsλ₯Ό μ¬μ©νκ³ μμΌλ©° μμ λ Όμμμ μκ°μ λ°μ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€. vueλ₯Ό μ¬μ©νλ λμ κ°μ λ¬Έμ κ° μλ κ²½μ°λ₯Ό λλΉνμ¬ μ¬κΈ°μ μ μ½λλ₯Ό λΆμ¬λ£μ΅λλ€.
<template>
<div class="board-item" v-for="element in list" :key="element.id">
<span><a class='board-item-a' :href='element.url' target='_blank'>{{element.title}}</a></span>
</div>
</template>
<script>
mounted () {
this.$el.querySelectorAll('.board-item-a').forEach(a => {
a.addEventListener('click', (e) => {
e.preventDefault()
require('electron').shell.openExternal(e.target.href)
})
})
},
</script>
@alangrainer - ts λ²μ μ μ견μ κΈ°λ°μΌλ‘ ν©λλ€.
const {app, shell, BrowserWindow} = require('electron');
...
mainWindow.webContents.on('new-window', function(event, url){
event.preventDefault();
shell.openExternal(url);
});
λ°μ΄ν° URLμ μ΄λ»μ΅λκΉ?
Angular 7 λ²μ (λΌμ΄λΈ λ€μ λ‘λ ν¬ν¨):
const openExternalLinksInOSBrowser = (event, url) => {
if (url.match(/.*localhost.*/gi) === null && (url.startsWith('http:') || url.startsWith('https:'))) {
event.preventDefault();
shell.openExternal(url);
}
};
win.webContents.on('new-window', openExternalLinksInOSBrowser);
win.webContents.on('will-navigate', openExternalLinksInOSBrowser);
url.match(/.*localhost.*/gi) === null
λΆλΆμ΄ νμν©λλ€. κ·Έλ μ§ μμΌλ©΄ κ°λ μμ© νλ‘κ·Έλ¨μμ 무μΈκ°λ₯Ό λ³κ²½ν λ μ μ μ±μμ λ€μ λ‘λνλ λμ OS λΈλΌμ°μ μμ μ μ°½/νμ΄ μ΄λ¦¬κΈ° λλ¬Έμ
λλ€.
λͺ¨λ λ°©λ²μ μ μλνμ§λ§ 루νΈκ° μλ μ μ μ±μμλ§ μλν©λλ€. λ£¨νΈ μμΉ νλ‘μΈμ€μ κΈ°λ³Έ OS λΈλΌμ°μ μμ μΈλΆ URLμ μ¬λ λ° λ¬΄μμ μ¬μ©ν μ μμ΅λκΉ?
λ€λ₯Έ Vue.js μ¬μ©μλ₯Ό μν λ΅λ³μ κ²μνκ³ μΆμμ΅λλ€.
<template>
<div>
<a href="https://google.com" target="_blank" @click.prevent="openExternalBrowser">Google.com Status</a>
</div>
</template>
<script>
const { remote } = require('electron');
export default {
name: 'HelloWorld',
methods: {
openExternalBrowser(e) {
remote.shell.openExternal(e.target.href);
},
},
};
</script>
λ€λ₯Έ Vue.js μ¬μ©μλ₯Ό μν λ΅λ³μ κ²μνκ³ μΆμμ΅λλ€.
<template> <div> <a href="https://google.com" target="_blank" @click.prevent="openExternalBrowser">Google.com Status</a> </div> </template> <script> const { remote } = require('electron'); export default { name: 'HelloWorld', methods: { openExternalBrowser(e) { remote.shell.openExternal(e.target.href); }, }, }; </script>
κ°μ¬ν©λλ€.
main.js
:app.on('web-contents-created', (e, contents) => {
contents.on('new-window', (e, url) => {
e.preventDefault();
require('open')(url);
});
contents.on('will-navigate', (e, url) => {
if (url !== contents.getURL()) e.preventDefault(), require('open')(url);
});
});
npm i open --save
λ€λ₯Έ Vue.js μ¬μ©μλ₯Ό μν λ΅λ³μ κ²μνκ³ μΆμμ΅λλ€.
@travis5491811 κ·Έλ¬λ©΄ μ¬λ°λ₯Έ νμ΄μ§κ° μλ λ λ€λ₯Έ Electron μ°½μ΄ μ΄λ¦½λλ€. μ΄κ²μ΄ μμλ λμμ λκΉ?
μλμ, μ λλ‘ κ΅¬νλλ©΄ λ΄ κ²μλ¬Όμ " κΈ°λ³Έ OS λΈλΌμ°μ μμ URLμ μ¬λ λ°©λ²"μ΄λΌλ μ€λ λ ν°μΌμ μλ΅ν΄μΌ λ΄κ° μ 곡ν λ΅λ³μ λ΄ μ± Electron v5.0.11
, Vue v2.6.10
μμ μλνλ©° μ¬λ¬ Windows 10 λ° Linux λ°μ€ν¬ν± μ»΄ν¨ν°μμ νλ‘λμ
νκ²½μμ ν
μ€νΈλμμ΅λλ€.
λ€λ₯Έ Vue.js μ¬μ©μλ₯Ό μν λ΅λ³μ κ²μνκ³ μΆμμ΅λλ€.
@travis5491811 κ·Έλ¬λ©΄ μ¬λ°λ₯Έ νμ΄μ§κ° μλ λ λ€λ₯Έ Electron μ°½μ΄ μ΄λ¦½λλ€. μ΄κ²μ΄ μμλ λμμ λκΉ?
κ°μ₯ μ μ©ν λκΈ
SOμμ μ΄ μ½λ μ€λν«μ μ°Ύμμ΅λλ€.
λ΄ κΈ°λ³Έ μμΈ νμΌμ μμ νλλ° λμ μΌλ‘ μμ±λ λ§ν¬μ λν΄μλ λ΄κ° λ§ν μ μλ ν μλνλ κ² κ°μ΅λλ€. λλ μ μμ λν΄ λ무 λ©μ²ν΄μ λ΄κ° μ£Όμν΄μΌ ν λ¨μ μ΄ μλμ§ μμ§ λͺ»ν©λλ€. μκ°?