2015-03-10 9 views
10

consideri seguente codice:'Impossibile eliminare la proprietà' su Safari quando si cerca di eliminare l'attributo set di dati in modalità rigorosa

(function() { 
    'use strict'; 
    delete document.body.dataset.state; 
})(); 

dove il corpo dataset è vuoto. Safari considera tutti i valori di DOMStringMap - beh, credo di sì - come ReadOnly e i loro valori di descrittore , configurable e writable sono tutti impostati su false. Ciò fa sì che TypeError: Unable to delete property compaia nell'esempio sopra citato.

Ma in valori descrittori proprietà dataset Chrome sono impostati per true (può essere controllato con Object.getOwnPropertyDescriptor()), e l'eliminazione di attributo inesistente non gettare l'errore.

Quindi, quale comportamento è corretto? Le specifiche dicono di readonly dataset, ma writable DOMStringMap, quindi presumo che le proprietà del set di dati debbano essere cancellate. Mi sto perdendo qualcosa?

+3

Senza guardarlo in profondità r, proprio come un promemoria, la specifica non è assoluta e definita fino al dettaglio, una quantità sorprendente di cose è specifica dell'implementazione. – Nit

+0

Le specifiche non sembrano dire quale sintassi dovrebbe essere supportata per rimuovere un attributo dataset. Il consenso generale del pubblico tra gli sviluppatori che usano altri browser è quello di cancellare il valore impostandolo su una stringa vuota o di usare 'delete', ma non sembra esserci uno standard scritto su questo. La mia opinione personale è che Safari probabilmente non è corretto qui, ma è quello che è se devi far funzionare il codice con esso. – jfriend00

+0

Trovato qualche soluzione a questo? –

risposta

1

Probabilmente a causa della modalità rigorosa.

In terzo luogo, la modalità rigorosa rende i tentativi di eliminare le proprietà undeletable tiro (dove prima il tentativo sarebbe semplicemente non hanno alcun effetto):

'use strict'; 
delete Object.prototype; // throws a TypeError 

si consiglia di dare un'occhiata a this documentation

Inoltre puoi provare a impostare il valore dell'oggetto su undefined, è un po 'peloso ma funziona ..