¿Debería la Etiqueta de Anclaje HTML Respetar el Atributo Disabled?


Si creo una etiqueta de anclaje HTML y establezco el atributo disabled en true, obtengo diferentes comportamientos en diferentes navegadores (¡sorpresa! sorpresa!).

He creado un violín para demostrar.

En IE9, el enlace aparece en gris y no se transfiere a la ubicación HREF. En Chrome / FF / Safari, el enlace es el color normal y se transferirá a la ubicación HREF.

¿Cuál debe ser el comportamiento correcto? IE9 está renderizando esto incorrectamente y debería implementar algunos CSS y javascript para solucionarlo; o Chrome / FF / Safari no es correcto y eventualmente se pondrá al día?

Gracias de antemano.

Author: THelper, 2011-08-09

4 answers

IE parece estar actuando incorrectamente en esta instancia.

Ver la especificación HTML5

El atributo IDL deshabilitado solo se aplica a los enlaces de hojas de estilo. Cuando el el elemento link define un enlace de hoja de estilo, luego el atributo disabled se comporta como se define para las hojas de estilo alternativas DOM. Para todos los demás elementos de enlace siempre devuelve false y no hace nada al configurarlo.

Http://dev.w3.org/html5/spec/Overview.html#the-link-element

El La especificación HTML4 ni siquiera menciona disabled

Http://www.w3.org/TR/html401/struct/links.html#h-12.2

EDITAR

Creo que la única manera de obtener este efecto cross-browser es js / css de la siguiente manera:

#link{
    text-decoration:none;
    color: #ccc;
}

Js

$('#link').click(function(e){
    e.preventDefault();
});

Ejemplo: http://jsfiddle.net/jasongennaro/QGWcn/

 13
Author: Jason Gennaro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-09 18:48:20

Tuve que corregir este comportamiento en un sitio con muchos anclajes que estaban siendo habilitados/deshabilitados con este atributo de acuerdo con otras condiciones, etc. Tal vez no sea ideal, pero en una situación como esa, si prefiere no arreglar el código de cada ancla individualmente, esto hará el truco para todos los anclajes:

$('a').each(function () {
    $(this).click(function (e) {
        if ($(this).attr('disabled')) {
            e.preventDefault();
            e.stopImmediatePropagation();
        }
    });
    var events = $._data ? $._data(this, 'events') : $(this).data('events');
    events.click.splice(0, 0, events.click.pop());
});

Y:

a[disabled] {
    color: gray;
    text-decoration: none;
}
 13
Author: hernant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-28 06:05:46

disabled es un atributo que solo se aplica a elementos input según los estándares . IE puede soportarlo en a, pero querrá usar CSS/JS en su lugar si desea cumplir con los estándares.

 9
Author: Karmic Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-09 18:25:17

La respuesta de jQuery no funcionó para mí porque mi etiqueta de anclaje está en un formulario y en mis formularios uso validadores de campo asp y simplemente no estaban jugando bien. Esto me llevó a encontrar una respuesta bastante simple que no requiere jQuery o CSS...

<a id="btnSubmit" href="GoSomePlace">Display Text</a>

Puede deshabilitar el elemento y debe comportarse como lo hacen los tipos de entrada. No se necesita CSS. Esto funcionó para mí en chrome y ff.

function DisableButton() {
    var submitButton = document.getElementById("btnSubmit");
    if (submitButton != null) {
        submitButton.setAttribute('disabled', 'disabled');
    }
}

Por supuesto que va a hacer un bucle para desactivar todas las etiquetas de anclaje en el DOM, pero mi el ejemplo muestra cómo hacerlo para un solo elemento específico. Quieres asegurarte de obtener el ID de cliente correcto de tu elemento, pero esto funcionó para mí, en más de una ocasión. Esto también funcionará en asp: LinkButtons que terminan siendo elementos de etiqueta de anclaje cuando se renderizan en el navegador.

 1
Author: Jabare Mitchell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-06 18:19:24