2014-12-01 11 views
7

Jeśli chcę, aby właściwości obiektu javascript były niezmienne, mogę użyć metod Object, takich jak defineProperties(), defineProperty() i freeze(). Moje pytanie brzmi: jak mogę zrobić to samo z atrybutami elementów HTML?Czy można uczynić atrybuty elementów HTML niezmiennymi?

Próbowałem już wyżej wymienionych metod i chociaż można ich użyć do zapobiegania ustawianiu właściwości elementu bezpośrednio (na przykład elem.id = 'foo';), zgodnie z oczekiwaniami, podstawowe atrybuty można jeszcze zmienić za pomocą setAttribute().

Odpowiedź "nie, to niemożliwe" byłaby możliwa do zaakceptowania, ale nie spotkałem się jeszcze z ostatecznym oświadczeniem w tej sprawie.

+1

do tej pory nie jest obsługiwany w javascript, ale może z ECMAScript 5 Biblioteka JavaScript może obsługiwać niezmienne właściwości. –

+1

Można przedefiniować 'setAttribute()' na tym elemencie, aby po prostu rzucić błąd. To może zadziałać, chociaż tego nie próbowałem. – iamnotmaynard

+1

@iamnotmaynard: Nadal można używać 'otherElement.setAttribute.call (thatElement, ...)' Jeśli ktoś jest wystarczająco zdeterminowany ...: p Jednak chroniłoby to przed zwykłymi błędami, nawet jeśli jest nieskuteczne wobec szkodliwych użytkowników. Zależy, czego naprawdę potrzebuje OP. – Amadan

Odpowiedz

3

Możesz użyć obserwatorów mutacji, aby przywrócić poprzednią wartość atrybutu.

new MutationObserver(callback) 
    .observe(elem, {attributes: true, attributeOldValue: true}); 

function callback(mutations, observer) { 
    var target = mutations[0].target; 
    observer.disconnect(); 
    mutations.forEach(function(mutation) { 
     target.setAttribute(mutation.attributeName, mutation.oldValue); 
    }); 
    observer.observe(target, {attributes: true, attributeOldValue: true}); 
} 

Dzięki @DoctorDestructo do sugestii dotyczących observer.disconnect które są konieczne, aby uniknąć nieskończonej pętli.

+0

To wygląda jak nieskończona pętla, ale podoba mi się ten pomysł. – Amadan

+0

Nie mam doświadczenia z [MutationObserver] (https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver), ale wygląda obiecująco. W przypadku braku rozwiązania "set-it-and-forget-it", takiego jak defineProperty(), może to być najlepsza opcja. – DoctorDestructo

+0

Przetestowałem odmianę tego i odkryłem, że nie przywraca wartości atrybutów podczas działania skryptu, tylko później. Tak naprawdę nie stwarza to nawet iluzji niezmienności. Nie jestem pewien, czy to eliminuje jako realną alternatywę. Inną rzeczą, o której należy pamiętać, jest to, że MutationObserver nie jest obsługiwany w IE <11. – DoctorDestructo

Powiązane problemy