Alternativas para usar “#” en el atributo href [duplicate]

9 minutos de lectura

avatar de usuario
SpikeTidE

los <a> La etiqueta se usa para crear hipervínculos, pero en esta era de jQuery y Ajax, la usamos para cargar HTML en <div>s en la misma página que el <a> etiquetas

Dicho esto, establecemos el href atribuir como href="#"usando o más bien abusando de la # carácter como marcador de posición junto con algunos efectos secundarios no deseados como la URL que se agrega con el # personaje.

Y si dejas el href atributo en blanco href = ""el enlace no parece funcionar.

¿Hay alguna forma de hacer esto de una manera más limpia, como mostrar un texto o una función ficticia en la barra de estado del navegador cuando el usuario pasa el mouse sobre el enlace y, sin embargo, hace que el enlace haga lo que el programador pretendía?

Aquí está mi código.

<ul id="sidebarmenu1">
   // List that is converted into a menu... 
   <li> <a href="#" id="loadHotel" > HOTEL </a> </li>
   <li> <a href="#" id="loadCountry"> COUNTRY </a> </li>
   <li> <a href="#" id="loadCity"> CITY </a> </li>
</ul>

// The jQuery to load content into another div with Ajax
var loadUrl = "createHotel.php";
$("#loadHotel").click(function() {
    $("#mainContent").html(ajax_load).load(loadUrl);
}); 

// ajax function to load hotel ---> rooms page 

var url_loadRooms = "viewRooms.php";
$("#createRooms").click(function() {
    $("#mainContent").html(ajax_load).load(url_loadRooms);
});

¿Qué más puedo usar en lugar de "#" para hacer mi código limpio ..?

  • Otra cosa que se puede hacer es no mostrar la función JS real que se llamará cuando se desplace el enlace, pero mostrar algo de texto en la barra de estado….

    – SpikeTidE

    9 de diciembre de 2009 a las 6:18

  • @SpikETidE: Según sus comentarios a las respuestas dadas, creo que tiene requisitos más específicos. Probablemente desee agregar a su publicación y especificar exactamente por qué/cómo el método “void (0)” no funciona para usted.

    – OK W

    9 de diciembre de 2009 a las 6:28

  • @ okw: Código agregado para referencia…

    – SpikeTidE

    9 de diciembre de 2009 a las 7:09

La mejor solución es no usar ningún marcador de posición ficticio. Use una URL significativa que, si realmente se siguiera el enlace, le mostraría la información que obtendría de la solicitud AJAX.

Hago esto regularmente con mis aplicaciones web, usando Javascript para mejorar un sitio de trabajo. Por ejemplo, el HTML:

<a href="https://stackoverflow.com/users/index" rel="popup">View users</a>

Javascript (jQuery):

$('a[rel*="popup"]').click(function() {
    loadPopup({    // whatever your favourite lightbox is, etc..
        url: this.href
    });
    return false;
});

Los beneficios de esto son numerosos. Su sitio es accesible para lectores de pantalla, rastreadores web y usuarios con javascript desactivado, e incluso aquellos con javascript activado obtendrán una URL significativa en su barra de estado, para que sepan a dónde se dirigen.

  • Funciona, pero si intenta validar el documento en validador.w3.orgobtendría este error: “Mensaje emergente de valor incorrecto para el atributo rel en el elemento a: el mensaje emergente de cadena no es una palabra clave registrada”.

    –Jaime Montoya

    16 de mayo de 2016 a las 4:43


Usualmente uso esto:

href="https://stackoverflow.com/questions/1871874/javascript:void(0);"

Establecer un ancla href atribuir a javascript:void(0); indica al navegador que este ancla no es un hipervínculo a otro documento o ancla,

  • La mayoría de los lugares lo hacen, pero alguna cosa tiene que ir allí.

    – Moshé

    9 de diciembre de 2009 a las 6:06

  • Hola, Andrew… En mi caso, llamo a una función de carga ajax de nivel superior cuando el usuario hace clic en una etiqueta. El uso de href = “javascript: void (0)” anula la llamada ajax y el navegador muestra “Permiso denegado para ver esta página”.

    – SpikeTidE

    9 de diciembre de 2009 a las 6:09

  • @SpikETidE: ¿Qué navegador estás usando? ¿Qué aspecto tiene esta función AJAX?

    – Andrew Hare

    9 de diciembre de 2009 a las 6:15

  • Mi código debería funcionar igual en todos los principales navegadores… mis funciones Ajax cargan una página php que contiene los elementos html en un div… esto sucede cuando el usuario hace clic en uno de los elementos del menú que ya está en la página. Estos elementos de menú se crean como listas desordenadas cuyos elementos, cuando se hace clic en ellos, llamarán a las funciones de ajax. Espero que me quede claro.

    – SpikeTidE

    9 de diciembre de 2009 a las 6:35

  • En serio, no hagas esto. Hay todo tipo de problemas, resumidos bastante bien aquí: jibbering.com/faq/#javascriptURI

    – Tim Abajo

    9 de diciembre de 2009 a las 10:14

avatar de usuario
Asaf

Si tu onclick el controlador regresa false, el navegador no seguirá el enlace. Prueba esto:

<a href="#" onclick="alert('No # in the address bar!'); return false;">Click Me</a>

EDITAR:

Si está absolutamente empeñado en no usar el octothorpe (es decir. # símbolo), no es necesario. Prueba esto:

<a href="" onclick="alert('No change in the address bar!'); return false;">Click Me</a>

  • Estoy buscando una manera de no usar el carácter “#” en absoluto….

    – SpikeTidE

    9 de diciembre de 2009 a las 6:39

  • @SpikETidE: Pon lo que quieras en el href atributo en mi ejemplo. En realidad no importa porque el navegador no lo seguirá.

    – Asaf

    9 de diciembre de 2009 a las 6:55

  • Pero devolver falso en el evento de clic no llamará a la función jquery .click()…

    – SpikeTidE

    9 de diciembre de 2009 a las 7:03

  • ¿Qué pasa con los usuarios con navegadores con JavaScript desactivado? Hay un montón de ellos alrededor. deberías poner un significativo repliegue en el href para tales usuarios.

    – Tim Abajo

    9 de diciembre de 2009 a las 10:16

  • @Tim Down: El número de gente en realidad, usar Internet con JavaScript deshabilitado a menudo es exagerado. En realidad, el número es tan pequeño que Google Analytics ni siquiera cuenta a esas personas (cómo puede hacerlo, está basado en JavaScript). Incluso los principales bots en estos días admiten JavaScript. En cualquier caso, la alternativa para el OP (#) no representa exactamente una alternativa significativa de todos modos.

    – Asaf

    10 de diciembre de 2009 a las 5:22

¿Por qué necesita que se defina algo en href?

Así es como funciona SO =>

<a id="close-question-1871874" title="closes/opens question for answering....">
  close<span title="3 more vote(s) needed to close this question"> (2)</span>
</a>

Pero, si se supone que el enlace debe navegar en algún lugar, mantenga href normal
y solo e.preventDefault() comportamiento regular con jQuery.

avatar de usuario
pata

Tal vez no entiendo algo, pero si no hay un enlace, no deberías usar un elemento en primer lugar. Use algunos o adjunte detectores de eventos para listar elementos. Puede diseñar estos elementos para tener cursor: pointer; utilizando CSS.

Recuerde que los navegadores tienen algunas acciones especiales asociadas con los enlaces, como “abrir en una pestaña nueva”, “guardar elemento de destino”, etc. href="" atribuya que estas acciones funcionan de manera rota, por lo que es mejor no usar enlaces en absoluto.

Por otro lado, si puede representar el contenido de estas partes ajaxadas como páginas normales (y tiene sentido), siga el consejo de nickf.

avatar de usuario
Comunidad

nickf se me adelantó; sin embargo, se deben mencionar algunas cosas. Nunca debe usar el protocolo “javascript” para un enlace (a menos que tal vez tenga la intención de que sea un bookmarklet). Es lo opuesto a la mejora progresiva. Siempre que sea posible, el href El atributo debe ser un recurso de URI real para que pueda degradarse correctamente. En todas las demás situaciones, se recomienda “#” y se debe usar JavaScript adecuado para evitar que la página se desplace hacia la parte superior. Hay dos métodos para hacerlo. En el controlador de clics, impida la acción predeterminada o devuelva falso.

$('a[rel*="popup"]').click(function(e) {
    e.preventDefault();
    loadPopup({url: this.href});
});

o

$('a[rel*="popup"]').click(function() {
    loadPopup({url: this.href});
    return false;
});

avatar de usuario
jeff rupert

El uso del carácter “#” como marcador de posición básicamente hace que el enlace esté “activo”. El navegador lo interpreta como una etiqueta que apunta a otra cosa. Si href está vacío, el navegador asumirá que una etiqueta es solo otra etiqueta.

Una forma de evitarlo es asignar algo de CSS a una etiqueta diferente que emule la misma funcionalidad de una etiqueta. Al pasar el mouse, cambie el mouse, subraye, cambie el color, etc. Puede cambiar fácilmente el estado de la ventana y hacer que parezca que el usuario está haciendo clic en un enlace cuando en realidad no está haciendo clic en un enlace sino haciendo un evento de clic .

De hecho, esa es la mejor opción, porque ejecutar solo una función JS a través del enlace de eventos que no se puede usar sin JavaScript no debería considerarse un enlace en primer lugar.

  • Hola, Jeff… Como se señaló en esta publicación stackoverflow.com/questions/134845/… se puede acceder a una etiqueta “a” mediante la pestaña del teclado, mientras que la otra forma hace que sea solo un elemento del mouse… Quiero que el mío sea también se accede a través del teclado…

    – SpikeTidE

    9 de diciembre de 2009 a las 6:13

  • En ese caso, buscaría escribir un enlace de evento para una pulsación de tecla. Además, creo que puede usar el atributo de orden de tabulación en HTML (o algo parecido) para permitir que el usuario salte a un elemento específico. No estoy seguro si sirve para todo. nunca lo he probado ¿Cuál es el beneficio del acceso al teclado en este caso?

    –Jeff Rupert

    9 de diciembre de 2009 a las 6:16

  • Además, podría tener el punto de anclaje a cualquier tipo de URL, pero asegúrese de que el controlador de eventos onclick devuelva falso. Esto detendrá la burbuja y nunca se accederá al enlace. Sin embargo, si un usuario tiene JavaScript deshabilitado, esto le dará la posibilidad de encontrar una solución alternativa.

    –Jeff Rupert

    9 de diciembre de 2009 a las 6:18

  • El acceso del teclado es solo por usabilidad… El enlace que se usa está en un menú y será deseable que el usuario pueda navegar hasta él usando solo la tecla de tabulación…

    – SpikeTidE

    9 de diciembre de 2009 a las 6:19

  • Usa tabindex. Creo que los navegadores lo tienen predeterminado con anclas y elementos de formulario, pero puede agregar sus propias opciones allí. w3.org/TR/html401/interact/forms.html#h-17.11 – Eso debería brindarle una descripción general rápida de tabindex y podría ayudarlo en su situación. Definitivamente asegúrate de usar return false; para detener el burbujeo, por lo que el enlace en realidad no se activa, solo el evento de clic.

    –Jeff Rupert

    9 de diciembre de 2009 a las 6:24

¿Ha sido útil esta solución?