2011-04-04 9 views
15

tldr: ¿Por qué ('marcador de posición' en inputElemnt) es verdadero en IE8 a pesar de que no hay soporte nativo para el atributo marcador de posición? ¿No es (atributo en el elemento) una buena forma de verificar el soporte nativo? La biblioteca Javascript lo usa el modernizador.Javascript check para soporte de marcador nativo en IE8

larga: que tiene un pequeño plugin de jQuery llamado defaultValue (http://unwrongest.com/projects/defaultvalue/). Tengo un pequeño plugin de Jquery llamado Placeholder (https://github.com/janjarfalk/jquery.placeholder.js). Básicamente es una alternativa para el atributo de marcador de posición HTML5.

En una actualización reciente agregué estas tres líneas de código. Esperando que Defaultvalue no se ejecute si el navegador tiene soporte nativo para el atributo marcador de posición.

 
if('placeholder' in this){ 
    // this is an input-element 
    return false; 
} 

Parece que funciona en la mayoría de los navegadores excepto IE8 e IE7. Por alguna razón, encuentra la clave 'marcador de posición' en esto, pero no hay, creo, ningún soporte para el atributo marcador de posición en IE7/IE8.

Mi código está inspirado en este código en la biblioteca Javascript Modernizer (http://www.modernizr.com/).

 
(function(props) { 
    for (var i = 0, len = props.length; i < len; i++) { 
     attrs[ props[i] ] = !!(props[i] in inputElem); 
    } 
    return attrs; 
})('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ')); 

¿Qué me falta?

+3

IE no tiene ni idea acerca de los atributos y propiedades, se piensa que son lo mismo (como lo hace jQuery). Los atributos no estándar se agregan como propiedades "expando". Usar for..in para iterar sobre las propiedades de los objetos host no es una buena idea. IE <9 no es compatible con hasAttribute, por lo que tampoco funcionará. – RobG

+0

Gracias! Su comentario condujo a una solución de trabajo. – janjarfalk

+1

El atributo de marcador de posición no está implementado en IE9 tampoco ... –

Respuesta

14

La creación de un nuevo elemento de entrada sin procesar resolvió mi problema.

 
var nativePlaceholderSupport = (function() { 
    var i = document.createElement('input'); 
    return i.placeholder !== undefined; 
})(); 

if(nativePlaceholderSupport){ 
    return false; 
} 
 
var nativePlaceholderSupport = (function(){ 
    var i = document.createElement('input'); 
    return ('placeholder' in i); 
})(); 

if(nativePlaceholderSupport){ 
    return false; 
} 

Gracias RobG, que me llevó a ella.

+0

No es una buena solución. El ** borrador ** HTML5 dice: "El atributo, si se especifica, ...", por lo que no es un atributo obligatorio y no hay ninguna razón para creer que un elemento tendrá una propiedad de marcador de posición si el atributo no se ha conjunto. Por lo tanto, su ausencia no indica que no sea compatible, solo que no se ha establecido. Y no use para ... en objetos host, lo que sea que intente hacer puede resolverse de alguna otra manera que sea respaldada por una selección más amplia de navegadores. – RobG

+0

@RobG Él no está usando para ... en. –

+0

@ Šime Vidas: Ok, si ... en, lo que sea. Esto es similar al debate sobre las propiedades de los objetos nativos que se devuelven en un orden específico porque algunos navegadores lo hacen de esa manera, a pesar de que ECMA-262 dice que no debe confiar en él. Si se define algo en una especificación, puede esperar que con el tiempo los navegadores converjan en ese comportamiento y se ocupen de las excepciones. Si un comportamiento es común pero no está especificado, solo esperas que todos sigan al líder. Tal vez lo harán, tal vez no lo harán. No todos siguen a IE con respecto al orden de propiedad del objeto, entonces, ¿por qué seguir Gecko/WebKit en atributos/propiedades DOM? – RobG

1

No es así. Es igual a falso en IE9 e IE8.

Demostración en directo: http://jsfiddle.net/JVSgx/

+2

¿IE 9 es compatible con el atributo marcador de posición? Hasta donde yo sé, no es así. – RobG

+0

@RobG No. Mi demostración confirma eso. –

Cuestiones relacionadas