ホーム画面にアイコンを追加した後、ウェブに問題があります。Webがホーム画面から起動された場合、すべてのリンクがSafariの新しいウィンドウで開きます(フルスクリーン機能が失われます)。どうすれば防ぐことができますか?私は助けを見つけることができず、同じ未回答の質問だけが見つかりました。
ホーム画面にアイコンを追加した後、ウェブに問題があります。Webがホーム画面から起動された場合、すべてのリンクがSafariの新しいウィンドウで開きます(フルスクリーン機能が失われます)。どうすれば防ぐことができますか?私は助けを見つけることができず、同じ未回答の質問だけが見つかりました。
回答:
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
}
}
[].forEach.call(document.links, function(link) { link.addEventListener("click", function(event) { event.preventDefault(); window.location = this.href; }) });
ここでの他の解決策は、外部リンクを考慮しない(おそらく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>
jQueryを使用している場合は、次のことができます。
$("a").click(function (event) {
event.preventDefault();
window.location = $(this).attr("href");
});
this.href
jQueryオブジェクトにキャストするのではなく使用しましたが、この回答に感謝します。iOS6で動作します。
これは、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;
}
});
}
});
$('a').on('click'
、function(e){`を$('area').on('click'
、function(e){`に置き換えてみましたが、それもうまくいかないようです。何か案は?
a
ているhref="#"
場合は、jqueryセレクターでより具体的にすることができます。例:$('a[href!="#"]')
これは古い質問であり、ここでのソリューションの多くはJavaScriptを使用しています。それ以降、iOS 11.3がリリースされ、スコープメンバーを使用できるようになりました。スコープメンバーは、"/"
そのスコープの下のすべてのパスが新しいページを開かないようなURL です。
スコープメンバーは、このWebアプリケーションのアプリケーションコンテキストのナビゲーションスコープを表す文字列です。
これが私の例です:
{
"name": "Test",
"short_name": "Test",
"lang": "en-US",
"start_url": "/",
"scope": "/",
...
}
詳細については、こちらをご覧ください。この機能を提供するジェネレータを使用することもお勧めします。
スコープを指定すると、Androidと同様にすべてが期待どおりに機能し、スコープ外の宛先がPWAへの戻るボタン(ステータスバーにある小さなボタン)を使用してSafariで開きます。
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;
}
});
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固有の問題であると予想していたため、これにはかなり時間がかかりました。
このコードは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アプリのメタタグ
ターゲットが明示的に "_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;
}
});
スタンドアロンのWebAppでのみ実行され、jQueryがなくても機能し、iOS 8.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>
これは、戻るボタンを妨げていたショーンのわずかに適応されたバージョンです
// 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;
}
});
}
});
私はここにある@rmarscherの答えからバウアーのインストール可能なパッケージを作成しました:
http://github.com/stylr/iosweblinks
あなたは簡単にbowerでスニペットをインストールすることができます bower install --save iosweblinks
を使用する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');
});
これが、ページ上のすべてのリンクに使用するものです...
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);
});
scope
パラメータをで使用できますmanifest.json
。詳細については、私の回答を参照してください。私はそれをiOS 11.3でテストしましたが、動作します。