IPhone Safari Web App открывает ссылки в новом окне

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

Ответ 1

Я нашел решение для 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
    }
}

Ответ 2

Другие решения здесь либо не учитывают внешние ссылки (которые вы, вероятно, хотите открыть извне в 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>

Ответ 3

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

$("a").click(function (event) {
    event.preventDefault();
    window.location = $(this).attr("href");
});

Ответ 4

Это работает для меня на 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;
        }
      });
    }
  });

Ответ 5

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

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

    if (href.indexOf(location.hostname) > -1)
    {
        event.preventDefault();
        window.location = href;
    }
});

Ответ 6

Если вы используете 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 фактически запретила новое окно.

Ответ 7

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

В теге head:

<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 для веб-приложений

Ответ 8

Возможно, вы должны разрешить открывать ссылки в новом окне, когда цель явно установлена ​​на "_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;
    }

});

Ответ 9

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

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

Ответ 10

Это то, что сработало для меня на iOS 6 (очень небольшая адаптация ответа rmarscher):

<script>                                                                
    (function(document,navigator,standalone) {                          
        if (standalone in navigator && navigator[standalone]) {         
            var curnode,location=document.location,stop=/^(a|html)$/i;  
            document.addEventListener("click", function(e) {            
                curnode=e.target;                                       
                while (!stop.test(curnode.nodeName)) {                  
                    curnode=curnode.parentNode;                         
                }                                                       
                if ("href" in curnode && (curnode.href.indexOf("http") || ~curnode.href.indexOf(location.host)) && curnode.target == false) {
                    e.preventDefault();                                 
                    location.href=curnode.href                          
                }                                                       
            },false);                                                   
        }                                                               
    })(document,window.navigator,"standalone")                          
</script>

Ответ 11

Это слегка адаптированная версия Шона, которая предотвращала обратную кнопку

// this function makes anchor tags work properly on an iphone

$(document).ready(function(){
if (("standalone" in window.navigator) && window.navigator.standalone) {
  // For iOS Apps
  $("a").on("click", function(e){

    var new_location = $(this).attr("href");
    if (new_location != undefined && new_location.substr(0, 1) != "#" && new_location!='' && $(this).attr("data-method") == undefined){
      e.preventDefault();
      window.location = new_location;
    }
  });
}

});

Ответ 12

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

<a href="#" onclick="window.location='URL_TO_GO';">TEXT OF THE LINK</a>

И вы можете удалить хэш-тег и href, все, что он делает, влияет на внешний вид.

Ответ 13

Для тех, у кого есть Twitter Bootstrap и Rails 3

$('a').live('click', function (event) {
  if(!($(this).attr('data-method')=='delete')){
    var href = $(this).attr("href");
    event.preventDefault();
    window.location = href; 
  }   
});

Удалить ссылки по-прежнему работают таким образом.

Ответ 14

Я предпочитаю открывать все ссылки в автономном режиме веб-приложения, кроме тех, у которых есть target = "_ blank". Использование jQuery, конечно.

$(document).on('click', 'a', function(e) {
    if ($(this).attr('target') !== '_blank') {
        e.preventDefault();
        window.location = $(this).attr('href');
    }
});

Ответ 15

Один обходной путь, который я использовал для веб-приложения iOS, состоял в том, что я создал кнопки отправки ссылок (которые были кнопками с помощью CSS). Поэтому я открыл форму, которая была отправлена ​​по ссылке назначения, затем input type="submit" Не лучший способ, но это то, что я выяснил до того, как я нашел эту страницу.

Ответ 16

Я создал пакет установки bower из ответа @rmarscher, который можно найти здесь:

http://github.com/stylr/iosweblinks

Вы можете легко установить фрагмент с помощью беседки с помощью bower install --save iosweblinks

Ответ 17

Для тех, кто использует JQuery Mobile, вышеупомянутые решения ломают всплывающее диалоговое окно. Это будет поддерживать ссылки в webapp и разрешать всплывающие окна.

$(document).on('click','a', function (event) {
    if($(this).attr('href').indexOf('#') == 0) {
        return true;
    }
    event.preventDefault();
    window.location = $(this).attr('href');     
});

Также можно сделать это:

$(document).on('click','a', function (event){
    if($(this).attr('data-rel') == 'popup'){
        return true;
    }
    event.preventDefault();
    window.location = $(this).attr('href');     
});

Ответ 18

Вот что я использовал бы для всех ссылок на странице...

document.body.addEventListener(function(event) {
    if (event.target.href && event.target.target != "_blank") {
        event.preventDefault();
        window.location = this.href;                
    }
});

Если вы используете jQuery или Zepto...

$("body").on("click", "a", function(event) {
   event.target.target != "_blank" && (window.location = event.target.href);
});