iPhone Safari Webアプリが新しいウィンドウでリンクを開く


155

ホーム画面にアイコンを追加した後、ウェブに問題があります。Webがホーム画面から起動された場合、すべてのリンクがSafariの新しいウィンドウで開きます(フルスクリーン機能が失われます)。どうすれば防ぐことができますか?私は助けを見つけることができず、同じ未回答の質問だけが見つかりました。


3
これで、scopeパラメータをで使用できますmanifest.json。詳細については、私の回答を参照してください。私はそれをiOS 11.3でテストしましたが、動作します。
Amir Raminfar

3
:iOSの11.3開口部のSafariに苦しんで人のために、繰り返しに、ここAmirRaminfarの答え@参照してくださいstackoverflow.com/a/49604315/32055
クリス・ヘインズ

回答:


110

iWebKitフレームワークにJavaScriptソリューションが見つかりました:

var a=document.getElementsByTagName("a");
for(var i=0;i<a.length;i++)
{
    a[i].onclick=function()
    {
        window.location=this.getAttribute("href");
        return false
    }
}

25
明白に述べ、これを明示的にするために:iOSは、Webアプリ内のリンクをSafariで開く必要があるものとして扱い、JavaScriptの場所の変更は、Webアプリでの待機が許可されているアプリ内アクションとして扱います。上記のコードは、デフォルトのリンク動作を妨げ、js nav呼び出しに置き換えるため機能します。
Oskar Austegard 2011

6
反対の例はありますか?JavaScriptの場所の変更であるにもかかわらず、iPhone WebアプリにSafariでページを開くように強制しますか?
tkahn

1
@Pavel iwebkitに言及していただきありがとうございます:)。トラフィックを
増やすのに

3
[].forEach.call(document.links, function(link) { link.addEventListener("click", function(event) { event.preventDefault(); window.location = this.href; }) });
アレックス

1
これには副作用がありますか?
ピングー2013年

94

ここでの他の解決策は、外部リンクを考慮しない(おそらくSafariで外部で開く必要がある)か、相対リンクを考慮しない(ドメインを含まない)かのいずれかです。

html5 mobile-boilerplateプロジェクトは、このトピックについての良い議論があるこの要旨にリンクしています: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>

これは、当社の「お問い合わせ」ページという1つのページを除いて、うまく機能します。ページを表示する代わりに、アプリケーション「マップ」を開き、オフィスを特定します。何が原因で、どうすれば修正できますか?
ジョナサン

@ジョナサン私はわからない。このスクリプトを削除しても起こりませんか?多分あなたのサイトへのリンクを投稿しますか?または、新しい質問を開いてください。
rmarscher

@rmarscherこれは、提供されたコードを実行した場合にのみ発生し、コードなしでは発生しません。私は私自身がWeb開発者であり、リンクがこのように処理される理由がわかりません。現在コードを実行していないので気付かないので、ページURLはありません。また、スタンドアロンだけでなく、通常のSafariにも影響します。ご回答有難うございます!
ジョナサン

これは受け入れられる答えであるはずであり、PHPRunnerで作成したiPad1フルスクリーンクライアントでは、ヘッダーにコードを配置することで魅力的に機能しました。BWオーバーヘッドがあまりなく読みやすいコードの非常に簡潔なコードのように難読化されている理由がわかりません。
sradforth 2013

4
これにより、js関数で使用されるhref = "#"リンクなどのBootstrappyの機能が壊れます
Sean

47

jQueryを使用している場合は、次のことができます。

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

1
.live()の方が良い理由を説明してください。
ajcw '25

8
liveは、まだ存在しないリンクを含むすべてのリンクにイベントをバインドし、クリックは現在存在するリンクにのみバインドします
msaspence

ありがとう!命の恩人。私は何時間もかけて、なぜSafariが常にロードされているのかを理解しようとしました。
スティーブ

1
私からの+1- this.hrefjQueryオブジェクトにキャストするのではなく使用しましたが、この回答に感謝します。iOS6で動作します。
フェントン

17
.live()はjQuery 1.7非推奨になり、1.9で削除されました。代わりに$(document).on( 'click'、 'a'、function(){...})を使用してください。
Tom Davies

21

これは、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;
        }
      });
    }
  });

1
+1。これは実際に、リンクを修正する前にWebアプリケーションを使用しているかどうかをチェックします。
トロリー

1
iOS 8.0.2で動作します!ありがとう
Joel Murphy

1
@sean iPadで実行されている別のウェブアプリで、hrefとしてイメージマップを使用していますが、このコードは機能しません。他のすべてのリンクでは正常に機能します。このコードをイメージマップで機能させる方法はありますか?チャンク全体をコピーして$('a').on('click'、function(e){`を$('area').on('click'、function(e){`に置き換えてみましたが、それもうまくいかないようです。何か案は?
2015

ですでにクリック関数が定義されaているhref="#"場合は、jqueryセレクターでより具体的にすることができます。例:$('a[href!="#"]')
cjk

13

これは古い質問であり、ここでのソリューションの多くはJavaScriptを使用しています。それ以降、iOS 11.3がリリースされ、スコープメンバーを使用できるようになりました。スコープメンバーは、"/"そのスコープの下のすべてのパスが新しいページを開かないようなURL です。

スコープメンバーは、このWebアプリケーションのアプリケーションコンテキストのナビゲーションスコープを表す文字列です。

これが私の例です:

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

詳細については、こちらをご覧ください。この機能を提供するジェネレータを使用することもお勧めします。

スコープを指定すると、Androidと同様にすべてが期待どおりに機能し、スコープ外の宛先がPWAへの戻るボタン(ステータスバーにある小さなボタン)を使用してSafariで開きます。


7
残念ながら、他のウェブサイト(別のドメインでのOAuthログインなど)をスコープに含めることはできないと思います。
bhollis

@Amirさん、Angularを使用してPWAを作成しました。Androidでは、manfest.jsonを正しく読み取っているように見えますが、「ホーム画面に追加」というプロンプトが表示されます。ただし、IOs Chrome / Safariではプロンプトは表示されません...何かアイデアはありますか?
ustad

5

Davidsの回答とRichardsのコメントに基づいて、ドメインチェックを実行する必要があります。それ以外の場合、他のWebサイトへのリンクもWebアプリで開かれます。

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

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

上記のソリューションへの良い追加。アプリで外部サイトを開かないようにするためのドメインチェックが必要でした。また、iOS 5でも動作します
Ian

私もiOS 5で動作します。キャッシュに問題がある場合があります。さまざまなアプローチをテストしている間、私はiOSにそのキャッシュを無効にして新しいバージョンのJSファイルを取得するように強制することができませんでした(Safariは変更を取得しましたが、ホーム画面にアプリを追加した後はそれ以上です)。私の開発サーバーのポートを変更するのに役立ちました。max-age = 0を設定している場合(または同等の場合)、おそらく影響はありません。
Lukasz Korzybski、2012

5

jQuery Mobileを使用している場合、data-ajax = 'false'属性を使用すると、新しいウィンドウが表示されます。実際、これは、外部リンク、$。mobile.ajaxEnabled設定、またはtarget = ''属性を持つことでajaxEnabledがオフになっているときに必ず発生します。

これを使用して修正できます:

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

(live()メソッドを提供してくれたRichard Pooleに感謝-bind()では機能していませんでした)

ajaxEnabledをグローバルにオフにしている場合は、[data-ajax = 'false']を削除する必要があります。

新しいウィンドウを実際に禁止したのは実際にはAjaxリンクだったjQuery Mobile固有の問題であると予想していたため、これにはかなり時間がかかりました。


パーフェクト、あなたは私を救った:)
saulob

3

このコードは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 Webアプリのメタタグ


なんらかの理由で、これが最も理解しやすいと思います。
ジェリービボ2016

3

ターゲットが明示的に "_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;
    }

});

どうもありがとう!これは、iOS 5 for Twitter Bootstrapで機能する唯一のコードです。ただし、プロダクションでは機能しません。
Chim Kan

うーん、なぜ本番環境で機能しないのかはわかりませんが、それは別の問題だと思います。教えてください!
daformat


2

ほぼ通常どおりにリンクすることもできます。

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

そして、ハッシュタグとhrefを削除することができます、それが行うすべてのことは外観に影響します。


2

これは私にとって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>

2

これは、戻るボタンを妨げていたショーンのわずかに適応されたバージョンです

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

});


1

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

削除リンクはまだこの方法で機能しています。


1

私は、target = "_ blank"があるものを除いて、スタンドアロンWebアプリモード内のすべてのリンクを開くことを好みます。もちろんjQueryを使用します。

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

1

私がiOS Webアプリに使用した回避策の1つは、すべてのリンク(CSSのボタン)から送信ボタンを作成することでした。そのため、リンク先に投稿するフォームを開いて、type = "submit"と入力しましたが、最善の方法ではありませんが、このページを見つける前に理解しました。



1

を使用する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');     
});

0

これが、ページ上のすべてのリンクに使用するものです...

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

-3

このメタタグを削除するだけです。

<meta name="apple-mobile-web-app-capable" content="yes">
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.