11

Devo testare il supporto del segnaposto. Le seguenti opere grandi in tutti i browser moderni, così come IE7, IE8, IE9:Problemi di rilevamento delle funzioni segnaposto HTML5

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

Funziona, ma JSLint lamenta l'uso di in:

imprevisto 'in'. Confrontare con undefined o utilizzare invece il metodo hasOwnProperty .

fine, quindi mi refactoring a questo:

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

Ora, questo passa JSLint senza errori o avvisi, ma si rompe in IE7 e IE8 con questo vecchio castagno:

oggetto non supporta la proprietà o il metodo 'hasOwnProperty'

Qualsiasi idea di come fare JSLint felice, come noi ll come IE7 e IE8?

+2

Fare uno strumento come jslint felice non significa necessariamente rendere il codice migliore finché sai cosa stai facendo. Se i tuoi capi lo vogliono, dai loro dei buoni esempi dimostrandoli stupidi. – ThiefMaster

+0

Non ho motivo per cui jslint consiglia contro 'in'. È in giro da un po ', quindi dovrebbe avere pieno supporto ed è piuttosto intuitivo. Per il supporto segnaposto, questo è solido: https://github.com/mathiasbynens/jquery-placeholder – ryanve

risposta

15

Si potrebbe anche usare l'altra soluzione JSLint suggerisce:

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

Questo dovrebbe funzionare cross browser senza problemi.

+0

Anche questo funziona bene, ed è piuttosto conciso, e se mi fossi preoccupato di leggere nel messaggio di errore avrei dovuto capire questo :) – karim79

+2

In realtà JSLint vuole che tu usi 'return i.placeholder! == undefined;' e it ' Lo dico come se provassi ad usare 'typeof i.placeholder! == 'undefined';'. – MHollis

3

È possibile recuperare la funzione tramite Object.prototype, quindi call sull'elemento. Questo rende per la funzione sia disponibile e voi di essere in grado di chiamare in modo i.hasOwnProperty-moda (ovvero il valore this dietro le quinte quando si chiama E 'i):

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

Questo funziona bene. Grazie per la risposta :) – karim79

+0

Hmm, con quale vorresti andare? – karim79

+0

@ karim79: questo consente di impostare la proprietà su 'indefinito', ma d'altra parte introduce una funzione chiamata overhead. – pimvdb

5

La mia risposta sarebbe don' t. Non rendere felice JSLint. JSLint è il modo in cui Crockford considera che JavaScript dovrebbe essere fatto. È il suo standard personale. Se vuoi un qualche tipo di lanugine per JavaScript, usa JSHint. È una versione biforcuta di JSLint che è completamente configurabile e senza i pazzi requisiti. Dalla sua homepage:

JSHint è un fork di JSLint, lo strumento scritto e gestito da Douglas Crockford.

Il progetto originariamente iniziato come un tentativo di fare un altro versione configurabile del JSLint, quello che non far rispettare una particolare stile di codifica sui suoi utenti, ma poi trasformato in uno strumento di analisi statica separato con il suo obiettivi e ideali.

+0

D'accordo, ma purtroppo non la mia decisione. Devo conviverci, almeno per il momento. +1 comunque. – karim79