Dodaj atrybut disabled do elementu wejściowego za pomocą JavaScript

141

Mam pole wprowadzania i chcę, aby było wyłączone, a jednocześnie ukryte, aby uniknąć problemów podczas przenoszenia formularza.

Do tej pory mam następujący kod, aby ukryć moje dane wejściowe:

$(".shownextrow").click(function() { 
    $(this).closest("tr").next().show().find('.longboxsmall').hide();
});

Oto dane wejściowe, które zostaną ukryte w wyniku:

<input class="longboxsmall" type="text" />

Jak mogę również dodać atrybut disabled do danych wejściowych?

user342391
źródło

Odpowiedzi:

306

$("input").attr("disabled", true); od ... już nie wiem.

Jest grudzień 2013 roku i naprawdę nie mam pojęcia, co powiedzieć.

Najpierw zawsze .attr(), potem zawsze .prop(), więc wróciłem tutaj, zaktualizowałem odpowiedź i uściśliłem ją.

Rok później jQuery ponownie zmieniło zdanie i nawet nie chcę tego śledzić.

Krótko mówiąc, w tej chwili jest to najlepsza odpowiedź: „możesz używać obu ... ale to zależy”.

Zamiast tego powinieneś przeczytać tę odpowiedź: https://stackoverflow.com/a/5876747/257493

A ich informacje o wydaniu dotyczące tej zmiany są zawarte tutaj:

Ani .attr (), ani .prop () nie powinny być używane do pobierania / ustawiania wartości. Zamiast tego użyj metody .val () (chociaż użycie .attr ("value", "somevalue") będzie nadal działać, tak jak przed 1.6).

Podsumowanie preferowanego wykorzystania

Metoda .prop () powinna być używana dla atrybutów / właściwości logicznych oraz dla właściwości, które nie istnieją w html (np. Window.location). Wszystkie inne atrybuty (te, które można zobaczyć w html) mogą i powinny być nadal modyfikowane za pomocą metody .attr ().

Innymi słowy:

„.prop = treści nie będące dokumentami”

„.attr” = dokument

... ...

Obyśmy wszyscy nauczyli się lekcji o stabilności API ...

Incognito
źródło
3
+1 za uczynienie tekstu aktualizacji wystarczająco dużym, abym mógł zwrócić uwagę
Vael Victus
@VaelVictus Nie tak szybko. Przykro mi, że zmienili to ponownie rok po tym, jak to opublikowałem ... i zapomniałem o tej odpowiedzi. Przeczytaj tę odpowiedź: stackoverflow.com/a/5876747/257493
Incognito
1
To rozróżnienie między plikami .prop i .attr między dokumentami a nie dokumentami jest nieskończenie pomocne i nigdy wcześniej nie widziałem kontekstu ujętego w tak zwięzły sposób. Bardzo cenione!
unrivaledcreations
51

Działający kod z moich źródeł:

HTML WORLD

<select name="select_from" disabled>...</select>

JS WORLD

var from = jQuery('select[name=select_from]');

//add disabled
from.attr('disabled', 'disabled');



//remove it
from.removeAttr("disabled");
Mircea Stanciu
źródło
2
Uwaga dla osób przyjeżdżających tutaj z Google, bezpośrednio z jQuery :As of jQuery 1.6, the .attr() method returns undefined for attributes that have not been set. To retrieve and change DOM properties such as the checked, selected, or disabled state of form elements, use the .prop() method
Erenor Paz,
16

Jeśli używasz jQuery, istnieje kilka różnych sposobów ustawienia wyłączonego atrybutu.

var $element = $(...);
    $element.prop('disabled', true);
    $element.attr('disabled', true); 

    // The following do not require jQuery
    $element.get(0).disabled = true;
    $element.get(0).setAttribute('disabled', true);
    $element[0].disabled = true;
    $element[0].setAttribute('disabled', true);
iConnor
źródło
O co chodzi $element.eq(0)[0].disabled = true;? :-P
qwertynl
1
Tak, to dla mnie za zaawansowane, nie posuwam się tak daleko, aby poprawić wydajność.
iConnor
+1. Chociaż jest trochę zbędny. Jeśli masz do czynienia z NodeList / tablicą elementów, głupio jest wybierać je za pomocą takiego indeksu. Iteracja lub po prostu wybranie tylko potrzebnego elementu ma większy sens.
13
$(element).prop('disabled', true); //true|disabled will work on all
$(element).attr('disabled', true); 
element.disabled = true;
element.setAttribute('disabled', true);

Wszystkie powyższe rozwiązania są całkowicie poprawnymi rozwiązaniami. Wybierz ten, który najlepiej odpowiada Twoim potrzebom.


źródło
1
Dziękujemy za dostarczenie rozwiązania, które nie wymaga jQuery.
Elias Zamaria
12

Możesz pobrać element DOM i bezpośrednio ustawić wyłączoną właściwość.

$(".shownextrow").click(function() { 
  $(this).closest("tr").next().show()
          .find('.longboxsmall').hide()[0].disabled = 'disabled';
});

lub jeśli jest więcej niż jeden, możesz użyć, each()aby ustawić je wszystkie:

$(".shownextrow").click(function() { 
  $(this).closest("tr").next().show()
          .find('.longboxsmall').each(function() {
               this.style.display = 'none';
               this.disabled = 'disabled';
          });
});
user113716
źródło
5

Po prostu użyj attr()metody jQuery

$(this).closest("tr").next().show().find('.longboxsmall').attr('disabled', 'disabled');
Gabe
źródło
3
i usuń stan wyłączenia za pomocą.removeAttr('disabled');
ruhong
2

Ponieważ pytanie dotyczyło tego, jak to zrobić z JS, zapewniam implementację wanilii JS.

var element = document.querySelector(".your-element-class-goes-here");
// it's a good idea to check whether the element exists
if (element != null && element != undefined) {
  element.disabled = "disabled";
}

Viktor
źródło