2010-02-23 14 views
20

Tenía la impresión de que solo tenía que especificar el "protocolo" cuando usa JavaScript en los atributos URL, como en hrefs. ¿Es este el único contexto "útil" para javascript:?¿Cuándo debo especificar el protocolo de JavaScript?

Sensible:

<a href="javascript:alert('Hello')">World!</a> 

tonta:

<form onsubmit="javascript:alert('oops!')"> 

¿Es esto así? ¿O hay algún caso de error/uso oscuro que debo tener en cuenta?

Respuesta

14

El javascript: pseudo-protocolo sobre los controladores de eventos sólo será ignorado, que no lo necesita, el motor JavaScript interpretará como una javascript:Label Statement.

Una etiqueta simplemente proporciona un identificador a una declaración y le permite consultarlo en otro lugar de su programa.

en mi humilde opinión, este pseudo-protocolo sólo es útil para bookmarklets ...

artículo Recomendado:

4

No lo especifique para nada. Está mal hacerlo en <a> etiquetas, que en su lugar debería codificarse como esto:

<a href='#' onclick='alert("Hello")'>World</a> 

Es un remanente de los días pasados. La única vez que puedo pensar en dónde se usa sería en la barra de direcciones del navegador (y marcadores bookmarklet). Manténgalo fuera de sus páginas.

+6

Recuerde 'return false;' si usa # para que cancele la acción 'href' y no vaya al principio de la página o (peor) cambie su hash si tenía uno que estaba usando en realidad para algo. Alternativamente, puede usar 'javascript: //' como 'href' que realmente no hará nada. – Nicole

+5

+1 @Renesis. Además, incluso puede agregar una descripción simple en el href con ese método ... por ejemplo: 'javascript: // Abrir en una nueva ventana'. Es un comentario de JS así que puedes poner cualquier cosa allí. Esto es útil porque se mostrará en la barra de estado cuando el usuario pase el mouse sobre el enlace – adamJLev

+0

@Infinity - idea genial! No había pensado en eso antes. – Nicole

2

En la práctica, son correctas.

Debe hacer esto en cualquier instancia en la que se espere algo distinto al script. En teoría, puede incluir javascript:whatever en cualquier lugar donde pueda usar una URL, pero esto nunca fue admitido y ahora está oficialmente recomendado para su uso.

Sin embargo,, realmente no debe usar javascript: en absoluto. Para los enlaces, puede usar el atributo onclick. Lo que está sucediendo hoy en día es que el motor de JavaScript identifica javascript: como una etiqueta, por lo que se ejecuta el código.

4

Como han mencionado otras respuestas, evite el uso de enlaces de href javascript:, y es completamente innecesario en los atributos del controlador de eventos. Sin embargo, dado que las etiquetas A a veces aún son semánticamente correctas, tendrá que poner algo en el atributo href si desea que sus estilos de CSS :link y :hover se apliquen al elemento en Internet Explorer.En este caso, utilice:

<a href="#" onclick="doSomething(); return false;">Link</a> 

O

<a href="javascript://" onclick="doSomething();">Link</a> 

Hay un error (algo oscura) con el protocolo Javascript - en Internet Explorer *, pensará que está dejando la página cuando haces clic en el enlace. Si está utilizando la ventana .antes de descargar, su mensaje de navegación aparecerá en este momento. Solo por esta razón, hemos dejado de usar el protocolo javascript por completo, así que no tenemos este error porque nos olvidamos de verificarlo cuando agregamos un mensaje de navegación a alguna página.


* Probablemente debería haber especificado la versión cuando escribí por primera vez este. No lo recuerdo para nada, pero solo en caso de que el error esté presente solo en un navegador que ya no funciona, como IE 6 o 7, probablemente sea mejor que lo pruebes tú mismo.

+0

+1 felicitaciones por el error oscuro – cgp

1

Todos deben echa un vistazo a http://bytes.com/topic/javascript/answers/504856-javascript-pseudo-protocol-event-handlers Especialmente el cargo por "Lasse Nielsen Reichstein", porque la mayoría de las respuestas están aquí son incorrectos de alguna manera.

¡También recuerde que la etiqueta de anclaje no requiere un href en absoluto! Eso es <a>hi</a> es xhtml válido. El problema al usar href="#" es que puede desplazarse hacia la parte superior de la página ... simplemente no es necesario. Por último, si no desea realmente el comportamiento de la etiqueta de anclaje, no debería usarla. Puede simular un ancla usando css (cursor:pointer) y eventos como mouseenter y mouseleave (que es más trabajo, pero no "rompe" el comportamiento esperado de una etiqueta de anclaje).

+0

"Simplemente no es necesario" no es cierto para todos los navegadores. Sin 'href', en algunas versiones de IE no se aplicarán los estilos CSS correctos y la etiqueta de anclaje no se diferenciará del texto, ni podrá utilizar': hover'. – Nicole

Cuestiones relacionadas