В чем разница между <a href= "https://stackoverflow.com/url" rel="nofollow noreferrer" >и window.location = "https://stackoverflow.com/url" на iOS?
У меня есть приложение 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>
(Обратите внимание, что это span с href, я могу изменить HTML, если это поможет.)
Ответы
Ответ 1
Попробуйте 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
на этом сервере.
Ответ 2
создайте новый тег и щелкните его с помощью jquery:
$("<a />").attr("href", there).click();
тег тега в этом случае не будет добавлен в DOM, будет использоваться только для имитации щелчка.
Ответ 3
Кажется, это ошибка Safari.
Если вы напишете window.location: Safari ожидает, что html файл или любой тип файла он может отображать на самом деле.
Если вы нажимаете ссылку, она читает тип содержимого, а затем решает открыть его в том же окне или открыть для него приложение.
Я думаю, вы должны попытаться открыть всплывающее окно с URL-адресом. Он должен теоретически работать.
Ответ 4
С помощью JS-функции window.location
браузер хочет открыть файл с помощью браузера, а не с какой-либо другой программой. Но с помощью A-Tag вы ссылаетесь на что-то. Это может быть любой файл. Если браузер не знал тип файла, браузер предупреждает всплывающее окно для загрузки файла. Если файл представляет собой, например, HTML файл, браузер открывает файл и показывает его.
Для загрузки файла с JS здесь ссылка .
Ответ 5
Я думаю, что ссылка была бы лучше, если бы какой-то тип чтения с экрана пытался разобрать вашу страницу. Если ваша навигация была в javascript, что-то вроде этого не сможет сказать пользователям с ослабленным зрением, что происходит.
Btw вместо return false;
из вашего обработчика событий. do evobj.preventDefault()
, это предпочтительный способ остановить барботирование для события.
Ответ 6
В соответствии с спецификацией HTML5 элемент span может иметь только глобальный атрибуты, который не включает href. Таким образом, значение, полученное из атрибута, может быть искажено или несовместимо с типом, принятым с помощью window.location.href. Я не уверен, что это может быть связано с проблемой.
Попробовали ли вы назначить константную строку, например window.location.href = "http://example.com/file"
?
Ответ 7
Если это ошибка с 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);