Make a link from Electron open in browser

前端 未结 6 1386
庸人自扰
庸人自扰 2020-12-15 15:21

Is there any (simple/built-in way) to open a new browser (I mean default OS browser) window for a link from Electron instead of visiting that link inside your Electron app ?

相关标签:
6条回答
  • 2020-12-15 16:02

    To make all Electron links to open externally in the default OS browser you will have to add an onclick property to them and change the href property so it doesn't load anything in the Electron app.

    You could use something like this:

    aTags = document.getElementsByTagName("a");
    for (var i = 0; i < aTags.length; i++) {
      aTags[i].setAttribute("onclick","require('shell').openExternal('" + aTags[i].href + "')");
      aTags[i].href = "#";
    }
    

    But make sure the entire document has loaded before doing this otherwise it is not going to work. A more robust implementation would look like this:

    if (document.readyState != "complete") {
      document.addEventListener('DOMContentLoaded', function() {
        prepareTags()
      }, false);
    } else {
      prepareTags();
    }
    
    function prepareTags(){
      aTags = document.getElementsByTagName("a");
      for (var i = 0; i < aTags.length; i++) {
        aTags[i].setAttribute("onclick","require('shell').openExternal('" + aTags[i].href + "')");
        aTags[i].href = "#";
      }
      return false;
    }
    

    Remember that if you load external files you will have to make them go through this process as well after they are fully loaded.

    0 讨论(0)
  • 2020-12-15 16:06

    To run an Electron project in your actual browser (Chrome, Mozilla, etc), add this to your script are external script:

    aTags = document.getElementsByTagName("a");
    for (var i = 0; i < aTags.length; i++) {
         aTags[i].setAttribute("onclick","require('shell').openExternal('" + aTags[i].href + "')");
         aTags[i].href = "#";
    }
    
    0 讨论(0)
  • 2020-12-15 16:07

    You can simply use :

    require("shell").openExternal("http://www.google.com")
    
    0 讨论(0)
  • 2020-12-15 16:12

    Some handy solutions can be found in this gist.

    By listening on the body, the following solutions will work on <a> tags that may not yet exist when the JavaScript runs, but only appear in the DOM at a later time.

    This one by luizcarraro requires jQuery:

    $('body').on('click', 'a', (event) => {
      event.preventDefault();
      require("electron").shell.openExternal(event.target.href);
    });
    

    You can change the selector to target only certain links, e.g. '#messages-view a' or 'a.open-external'.

    Here is an alternative without any library (derived from zrbecker's):

    document.body.addEventListener('click', event => {
      if (event.target.tagName.toLowerCase() === 'a') {
        event.preventDefault();
        require("electron").shell.openExternal(event.target.href);
      }
    });
    

    Consult the gist for more examples.

    0 讨论(0)
  • 2020-12-15 16:18
    mainWindow.webContents.on('new-window', function(e, url) {
      e.preventDefault();
      require('electron').shell.openExternal(url);
    });
    

    Requires that you use target="_blank" on your anchor tags.

    0 讨论(0)
  • 2020-12-15 16:23

    There's a much better and simpler way, than what @Marcelo proposed, yet easier to implement for all links at once to what @zianwar proposed.

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

    NOTE: Requires jQuery.

    0 讨论(0)
提交回复
热议问题