iPhone Safari Web App открывает ссылки в новом окне - PullRequest
151 голосов
/ 24 мая 2010

У меня проблема с Интернетом после добавления значка на главный экран. Если веб-сайт запускается с главного экрана, все ссылки открываются в новом окне в Safari (и теряют полноэкранный режим). Как я могу предотвратить это? Я не смог найти никакой помощи, только тот же вопрос без ответа.

Ответы [ 20 ]

107 голосов
/ 24 мая 2010

Я нашел решение JavaScript в iWebKit framework:

var a=document.getElementsByTagName("a");
for(var i=0;i<a.length;i++)
{
    a[i].onclick=function()
    {
        window.location=this.getAttribute("href");
        return false
    }
}
92 голосов
/ 17 ноября 2011

Другие решения здесь не учитывают внешние ссылки (которые вы, вероятно, хотите открывать внешне в Safari) или не учитывают относительные ссылки (без домена в них).

html5Мобильный шаблонный проект ссылается на эту суть, которая хорошо обсуждает эту тему: https://gist.github.com/1042026

Вот окончательный код, который они придумали:

<script>(function(a,b,c){if(c in b&&b[c]){var d,e=a.location,f=/^(a|html)$/i;a.addEventListener("click",function(a){d=a.target;while(!f.test(d.nodeName))d=d.parentNode;"href"in d&&(d.href.indexOf("http")||~d.href.indexOf(e.host))&&(a.preventDefault(),e.href=d.href)},!1)}})(document,window.navigator,"standalone")</script>
46 голосов
/ 01 апреля 2011

Если вы используете jQuery, вы можете сделать:

$("a").click(function (event) {
    event.preventDefault();
    window.location = $(this).attr("href");
});
20 голосов
/ 08 февраля 2013

Это работает для меня на iOS 6.1 и со ссылками Bootstrap JS (т.е. выпадающие меню и т. Д.)

$(document).ready(function(){
    if (("standalone" in window.navigator) && window.navigator.standalone) {
      // For iOS Apps
      $('a').on('click', function(e){
        e.preventDefault();
        var new_location = $(this).attr('href');
        if (new_location != undefined && new_location.substr(0, 1) != '#' && $(this).attr('data-method') == undefined){
          window.location = new_location;
        }
      });
    }
  });
9 голосов
/ 02 апреля 2018

Это старый вопрос, и многие решения здесь используют javascript.С тех пор iOS 11.3 была выпущена, и теперь вы можете использовать элемент scope .Членом области является URL-адрес типа "/", где все пути в этой области не открывают новую страницу.

Член области - это строка, представляющая область навигации контекста приложения этого веб-приложения.

Вот мой пример:

{
  "name": "Test",
  "short_name": "Test",
  "lang": "en-US",
  "start_url": "/",
  "scope": "/",
  ...
}

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

Если вы укажете область действия, все будет работать так, как ожидается, аналогично Android, в Safari откроются пункты назначения вне области действия - с кнопкой «Назад» (маленькая в строке состояния) для вашего PWA.

5 голосов
/ 07 августа 2012

Если вы используете jQuery Mobile, вы увидите новое окно при использовании атрибута data-ajax = 'false'. Фактически, это будет происходить всякий раз, когда ajaxEnabled отключается, используя внешнюю ссылку, настройку $ .mobile.ajaxEnabled или имея атрибут target = ''.

Вы можете исправить это, используя:

$("a[data-ajax='false']").live("click", function(event){
  if (this.href) {
    event.preventDefault();
    location.href=this.href;
    return false;
  }
});

(Спасибо Ричарду Пулу за метод live () - не работал с bind ())

Если вы отключили ajaxEnabled глобально, вам нужно удалить [data-ajax = 'false'].

Это заняло у меня довольно много времени, чтобы понять, как я ожидал, что это будет специфическая проблема jQuery Mobile, где на самом деле это было соединение с Ajax, которое фактически запретило новое окно.

5 голосов
/ 24 октября 2011

На основании ответа Дэвидса и комментария Ричардса, вы должны выполнить проверку домена.В противном случае ссылки на другие веб-сайты также будут открыты в вашем веб-приложении.

$('a').live('click', function (event)
{      
    var href = $(this).attr("href");

    if (href.indexOf(location.hostname) > -1)
    {
        event.preventDefault();
        window.location = href;
    }
});
3 голосов
/ 14 июля 2015

Я нашел один, который является очень полным и эффективным, потому что он проверяет работу только под автономным WebApp, работает без jQuery и также прост, только что протестирован под iOS 8.2:

Оставайтесь автономными: не открывайте ссылки в автономных веб-приложениях, открывая Mobile Safari

3 голосов
/ 26 апреля 2012

Возможно, вам следует разрешить открывать ссылки в новом окне, когда для цели также явно задано значение "_blank":

$('a').live('click', function (event)
{      
    var href = $(this).attr("href");

    // prevent internal links (href.indexOf...) to open in safari if target
    // is not explicitly set_blank, doesn't break href="#" links
    if (href.indexOf(location.hostname) > -1 && href != "#" && $(this).attr("target") != "_blank")
    {
        event.preventDefault();
        window.location = href;
    }

});
3 голосов
/ 07 апреля 2012

Этот код работает для iOS 5 (он работал для меня):

В заголовке тега:

<script type="text/javascript">
    function OpenLink(theLink){
        window.location.href = theLink.href;
    }
</script>

В ссылке, которую вы хотите открыть в том же окне:

<a href="(your website here)" onclick="OpenLink(this); return false"> Link </a>

Я получил этот код из этого комментария: метатеги веб-приложения iphone

...