Comment puis-je forcer les liens externes depuis la fenêtre du navigateur à s’ouvrir dans un navigateur par défaut d’Electron?

J’utilise BrowserWindow pour afficher une application et j’aimerais forcer l’ouverture des liens externes dans le navigateur par défaut. Est-ce même possible ou dois-je aborder la question différemment?

    Je suis venu avec cela, après avoir vérifié la solution de la réponse précédente.

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

    Selon les spécifications de l’ électron , la new-window est déclenchée lorsque l’utilisateur clique sur des liens externes.

    REMARQUE: vous devez utiliser target="_blank" sur vos balises d’ancrage.

    Si vous n’utilisez pas target="_blank" dans vos éléments d’ anchor , cela pourrait fonctionner pour vous:

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

    Je n’ai pas testé cela, mais je suppose que cela devrait fonctionner:

    1) Obtenez des WebContents de votre BrowserWindow

      var wc = browserWindow.webContents; 

    2) Inscrivez-vous pour will-navigate dans WebContent et intercepter les clics de navigation / lien:

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

    3) Implémentez openBrowser utilisant child_process . Un exemple pour les bureaux Linux:

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

    laissez-moi savoir si cela fonctionne pour vous!

    Pour quiconque passe.

    Mon cas d’utilisation:

    J’utilisais SimpleMDE dans mon application et son mode de prévisualisation ouvrait des liens dans la même fenêtre. Je voulais que tous les liens s’ouvrent dans le navigateur par défaut du système d’exploitation. Je mets cet extrait, basé sur les autres réponses, dans mon fichier main.js. Il l’appelle après avoir créé la nouvelle instance de BrowserWindow. Mon instance s’appelle mainWindow

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

    Vérifiez si l’URL demandée est un lien externe. Si oui, utilisez 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); } } 

    Amélioré de la réponse acceptée;

    1. le lien doit être target="_blank" ;
    2. ajoutez dans background.js (ou n’importe où vous avez créé votre fenêtre):

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

    Remarque: pour garantir ce comportement dans toutes les fenêtres de l’application, ce code doit être exécuté après chaque création de fenêtre.

    Mettez ceci dans le fichier renderer side js de renderer side js . Il va ouvrir les liens http , https dans le navigateur par défaut de l’utilisateur.

    Pas de JQuery attaché! no target="_blank" requirejs!

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