У меня проблема с сетью после добавления значка на главный экран. Если веб-сайт запущен с главного экрана, все ссылки откроются в новом окне в Safari (и потеряют полноэкранную функциональность). Как я могу это предотвратить? Я не мог найти никакой помощи, только тот же вопрос без ответа.
IPhone Safari Web App открывает ссылки в новом окне
Ответ 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);
});