¿Cuál es la diferencia entre <a href="url"> y window.location = "url" en iOS?

Tengo una aplicación HTML 5 que se ejecuta en dispositivos mobilees, incluido el iPad. Quiero crear un enlace a un file que no sea HTML y tener abierta la aplicación adecuada para manejar el file. Los files son files .acsm, que se abrirán en Bluefire.

Si creo el enlace como una simple <a href="url"> label, funciona.

Si en su lugar utilizo Javascript para establecer la window.location la window.location , no funciona. El iPad muestra una alerta que dice: "Falló la descarga: este file no se puede download".

He experimentado con otros types de files, y no he encontrado nada concluyente. ¿Cuál es la diferencia entre el enlace simple y la técnica de Javascript? ¿Puedo hacer que el código Javascript haga lo mismo que el enlace?

En caso de que los detalles específicos de Javascript importen, lo hago así con jQuery:

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

y el HTML se ve así:

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

(Tenga en count que este es un intervalo con un href, puedo cambiar el HTML si eso ayudaría).

Pruebe window.open , pasando "_self" como el nombre de la window de destino.

 window.open(there, "_self"); 

Usar "_self" es la parte crítica aquí, de lo contrario el bloqueador de windows emergentes lo interceptaría. Probé esto, pero no tengo un enlace a un file ACSM.

Editar: dos ideas más:

Agregue un formulario a su página con un método de "GET" y una acción de su file ACSM. Excluya los campos del formulario a less que se correspondan con su URL.

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

Luego simplemente envíe su formulario con form.submit() :

 document.forms.acsm.submit(); 

Y la otra idea: cree una página en su server que networkingirija el server a su file ACSM. Luego simplemente use la location.href = url a esa página del server.

cree una nueva label y click ella usando jquery:

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

la label a en este caso no se agregará a DOM, solo se usará para simular el clic.

Parece un error de Safari para mí. Si escribe window.location: Safari espera un file html o cualquier tipo de file que pueda mostrar de manera real.

Mientras que cuando haces clic en un enlace, lee el tipo de contenido y luego decide abrirlo en la misma window o abrir una aplicación para ello.

Creo que deberías tratar de abrir una window emergente con la url. Teóricamente debería funcionar.

Con la window de la function JS. window.location el browser desea abrir el file con el browser y no con ningún otro progtwig. Pero con la A-Tag se vincula a algo. Esto puede ser cualquier file. Si el browser no conocía la tipología del file, el browser alertó una window emergente para download el file. Si el file es, por ejemplo, un file HTML, el browser abre el file y lo muestra.

Para download un file con JS aquí hay un enlace .

Creo que un enlace era mejor en caso de que algún tipo de lector de pantalla intentara analizar su página. Si su navigation estaba en javascript, algo así no podría decirle a los usuarios con problemas visuales lo que está sucediendo.

Btw, en lugar de return false; desde tu manejador de events. hacer evobj.preventDefault() , es la forma preferida de dejar de burbujear para el evento.

Según la especificación HTML5 , el elemento span solo puede tener los attributes globales , que no incluyen href . Por lo tanto, el valor obtenido del atributo puede tener un formatting incorrecto o incompatible con el tipo aceptado por window.location.href . No estoy seguro de si esto podría estar relacionado con el problema.

¿Intentaste asignar una cadena constante como window.location.href = "http://example.com/file" ?

Si se trata de un error con iOS, simule un clic en un enlace. A diferencia de la solución de memical, esto no burbujeará:

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