Как мне сделать так, чтобы в системном браузере открывались только * некоторые * ссылки, а не NW.js окна браузера?

#javascript #hyperlink #node-webkit

#javascript #гиперссылка #узел-webkit

Вопрос:

Я кое-что сделал в NW.js . По умолчанию любые гиперссылки, по которым пользователь может щелкнуть, открываются в новом NW.js окно браузера.

Я пытаюсь сделать так, чтобы некоторые (не все или ни один!) Из них открывались в системном браузере. Важно, чтобы это были <a> элементы, а не вызовы функций JavaScript.

Чтение на этой странице: https://nwjs.readthedocs.io/en/latest/References/Window/#event-new-win-policy-frame-url-policy

… Я смог сделать так, чтобы все гиперссылки открывались в системном браузере. Но я хочу этого только для некоторых. Я хочу указать атрибут или что-то в этом роде, например, <a some-attribute="open-in-system-browser"...> который можно проверить в коде:

 nw.Window.get().on('new-win-policy', function(frame, url, policy)
{
    policy.ignore();
    nw.Shell.openExternal(url);
});
 

Чего мне не хватает? Если этого можно избежать, я не хочу «анализировать URL», чтобы определить это, так как это некрасиво и грязно. И «фрейм», и «политика» кажутся бесполезными параметрами.

Ответ №1:

Вам не нужно делать ничего особенного, это работает так по умолчанию. Все открывается в NW.js напрямую, если только вы специально не укажете ему открываться в браузере по умолчанию.

Есть много способов сделать это, но простым примером может быть

 <div>
  <a href="about.html">About</a>
  <a href="thing.html">Thing</a>
  <a href="https://example.com" data-external-link>Example</a>
  <a href="https://stackoverflow.com" data-external-link>Stackoverflow</a>
</div>
 

Ванильный JS

 // Find all elements on the page
var externalLinks = document.querySelectorAll('[data-external-link]');
// Convert the node list to an array
externalLinks = Array.from(externalLinks);
// loop over each link
externalLinks.forEach(function (link) {
  // add a click event listener to each link
  link.addEventListener('click', function (evt) {
    // Do not navigate to the link in NW.js
    evt.preventDefault();
    // get the URl for the clicked link
    var url = evt.currentTarget.href;
    // Open the url in the default browser
    nw.Shell.openExternal(url);
  });
});
 

или версия jQuery

 $('[data-external-link]').click(function (evt) {
  evt.preventDefault();
  nw.Shell.openExternal(evt.currentTarget.href);
});
 

Комментарии:

1. Спасибо. Работает. Я просто хотел бы, чтобы это было встроено в NW.js . Я не могу объяснить, почему… Мне кажется «хакерским», что в моем коде всегда есть такие маленькие фрагменты, как этот. NW.js это действительно классная идея, но мне интересно, почему это такой «бардак»?