В чем разница между <a href="url"> и window.location = "url" в iOS? - PullRequest
17 голосов
/ 03 августа 2011

У меня есть приложение HTML 5, которое работает на мобильных устройствах, включая iPad. Я хочу создать ссылку на файл, отличный от HTML, и открыть соответствующее приложение для обработки файла. Это файлы .acsm, которые нужно открыть в Bluefire.

Если я создаю ссылку как простой тег <a href="url">, он работает.

Если вместо этого я использую Javascript для установки window.location, это не сработает. На iPad появляется предупреждение: «Ошибка загрузки: этот файл не может быть загружен».

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

В случае, если конкретные детали Javascript имеют значение, я делаю это так с jQuery:

$('.native-launch').live('click', function (evobj) {
  var there = $(evobj.target).attr('href');
  window.location.href = there;
  return false;
});

и HTML выглядит так:

<span class="catalog-list-button native-launch" href="url">Read in another app</span>

(Обратите внимание, что это диапазон с href, я могу изменить HTML, если это поможет.)

Ответы [ 7 ]

6 голосов
/ 12 августа 2011

Попробуйте window.open, передав "_self" в качестве имени целевого окна.

window.open(there, "_self");

Использование "_self" является критической частью здесь, иначе блокировщик всплывающих окон перехватит его. Я бы проверил это, но у меня нет ссылки на ACSM-файл.

Редактировать: Еще две идеи:

Добавьте форму на вашу страницу с методом «GET» и действием вашего acsm-файла. Исключите поля формы, если они не соответствуют вашему URL.

<form id="acsm" method="GET" action="http://myserver.com/myfile.acsm"></form>

Тогда просто отправьте свою форму с form.submit():

document.forms.acsm.submit();

И другая идея: создайте на своем сервере страницу, которая выполняет перенаправление на стороне сервера в ваш acsm-файл. Затем просто используйте обычный location.href = url для этой страницы сервера.

4 голосов
/ 09 августа 2011

создайте новый тег и щелкните по нему с помощью jquery:

$("<a />").attr("href", there).click();

тег в этом случае не будет добавлен в DOM, будет использоваться только для имитации щелчка.

1 голос
/ 09 августа 2011

С помощью JS-функции window.location браузер хочет открыть файл в браузере, а не в какой-либо другой программе.Но с A-Tag вы ссылаетесь на что-то.Это может быть любой файл.Если браузер не знает тип файла, браузер выдает всплывающее окно для загрузки файла.Если файл является, например, HTML-файлом, браузер откроет файл и покажет его.

Для загрузки файла с помощью JS есть ссылка .

1 голос
/ 03 августа 2011

Мне кажется, это ошибка Safari. Если вы напишите window.location: Safari ожидает html-файл или файл любого типа, который он может отображать.

Принимая во внимание, что когда вы щелкаете ссылку, она читает тип контента, а затем решает открыть ее в том же окне или открыть приложение для нее.

Я думаю, вы должны попытаться открыть всплывающее окно с URL. Теоретически должно работать.

0 голосов
/ 13 августа 2011

Если это ошибка в iOS, смоделируйте щелчок по ссылке. В отличие от решения мемуала это не будет пузыриться:

var a = document.createElementNS("http://www.w3.org/1999/xhtml", "a");
a.href = your_url_here;
var click = document.createEvent("Event");
click.initEvent("click", false /*bubbles*/, true /*cancellable*/);
a.dispatchEvent(click);
0 голосов
/ 10 августа 2011

Согласно спецификации HTML5 , элемент span может иметь только глобальные атрибуты , которые не включают href . Таким образом, значение, полученное из атрибута, может быть искажено или несовместимо с типом, принятым window.location.href . Я не уверен, может ли это быть связано с проблемой.

Вы пытались присвоить постоянную строку, такую ​​как window.location.href = "http://example.com/file"?

0 голосов
/ 03 августа 2011

Я думаю, что ссылка была бы лучше, если какой-то тип программы чтения с экрана пытается проанализировать вашу страницу. Если бы ваша навигация была в javascript, что-то подобное не могло бы рассказать пользователям с нарушениями зрения, что происходит.

Кстати, вместо return false; из вашего обработчика событий. do evobj.preventDefault(), это предпочтительный способ прекратить пузыриться для события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...