11

Necesito comprobar el soporte del marcador de posición. Los siguientes funciona muy bien en todos los navegadores modernos, así como IE7, IE8, IE9:Detección de características de marcador de posición HTML5

$.support.placeholder = (function() { 
    var i = document.createElement("input"); 
    return "placeholder" in i; 
}()); 

Funciona, pero JSLint se queja del uso de in:

inesperado 'en'. Compare con undefined, o use el método hasOwnProperty en su lugar.

bien, así que voy a refactorizar a esto:

$.support.placeholder = (function() { 
    var i = document.createElement("input"); 
    return i.hasOwnProperty("placeholder"); 
}()); 

Ahora bien, esto pasa JSLint sin ningún tipo de error o advertencia, pero se rompe en IE7 e IE8 con esta vieja historia:

objeto no admite la propiedad o método 'hasOwnProperty'

alguna idea de cómo hacer JSLint feliz, como lo ll como IE7 e IE8?

+2

Hacer una herramienta como jslint happy no significa necesariamente mejorar el código siempre que sepa lo que está haciendo. Si tus jefes lo quieren, dales buenos ejemplos para demostrar que son estúpidos. – ThiefMaster

+0

No sé por qué jslint recomienda contra 'in'. Ha existido por un tiempo, por lo que debería contar con un soporte completo y es bastante intuitivo. Para soporte de marcador de posición, esto es sólido: https://github.com/mathiasbynens/jquery-placeholder – ryanve

Respuesta

15

También es posible usar la otra solución JSLint sugiere:

return typeof i.placeholder !== 'undefined'; 

Esto debería funcionar sin problemas con navegadores.

+0

Esto también funciona bien, y es bastante conciso, y si me hubiera molestado en leer el mensaje de error, debería haberlo averiguado :) – karim79

+2

En realidad, JSLint quiere que uses 'return i.placeholder! == undefined;' y ' Digo como tal si intentas usar 'typeof i.placeholder! == 'undefined';'. – MHollis

3

Puede recuperar la función a través de Object.prototype, luego call en el elemento. Esto hace que para la función que está disponible y que seas capaz de llamarlo de una manera i.hasOwnProperty -fashion (es decir, el valor this detrás de las escenas cuando se llama a que se i):

Object.prototype.hasOwnProperty.call(i, "placeholder"); 
+0

Esto funciona bien. Gracias por la respuesta :) – karim79

+0

Hmm, con cuál te gustaría ir. – karim79

+0

@ karim79: Esto permite que la propiedad se configure en 'undefined', pero por otro lado introduce una sobrecarga de llamada de función. – pimvdb

5

Mi respuesta sería Don' t. No hagas feliz a JSLint. JSLint es cómo debería hacerse Crockford views JavaScript. Es su estándar personal. Si desea algún tipo de pelusa para JavaScript, use JSHint. Es una versión bifurcada de JSLint que es completamente configurable y sin los requisitos locos. Desde su página de inicio:

JSHint es un tenedor de JSLint, la herramienta escrita y mantenida por Douglas Crockford .

El proyecto comenzó originalmente como un esfuerzo por hacer una versión más configurable de JSLint, el que no hace cumplir una estilo de codificación particular sobre sus usuarios, pero luego se transformó en una herramienta de análisis estático separado con su propio metas e ideales.

+0

De acuerdo, pero no es mi decisión, lamentablemente. Debo vivir con eso, al menos por el momento. +1 de todos modos. – karim79

Cuestiones relacionadas