Jak wyłączyć całą zawartość div

278

Zakładałem, że jeśli wyłączyłem div, wszystkie treści również zostały wyłączone.

Jednak zawartość jest wyszarzona, ale nadal mogę z nią korzystać.

Czy jest na to sposób? (wyłącz div i wyłącz wszystkie treści)

juan
źródło

Odpowiedzi:

530

Wiele z powyższych odpowiedzi działa tylko na elementy formularza. Prostym sposobem na wyłączenie dowolnego DIV, w tym jego zawartości, jest po prostu wyłączenie interakcji myszy. Na przykład:

$("#mydiv").addClass("disabledbutton");

css

.disabledbutton {
    pointer-events: none;
    opacity: 0.4;
}
Kokodoko
źródło
18
+1 za poprawną odpowiedź - Właśnie zaoszczędziłeś mi godzin pracy !!! łzy w oczach i może być zakochany - Obsługiwane jest także przez wszystkie przeglądarki: caniuse.com/#feat=pointer-events
tfmontague
10
Wiem, że jest dość późno, ale mimo to nie jest obsługiwany przez IE 8, IE 9 i IE 10. Tylko po to, aby wszyscy wiedzieli. caniuse.com/#feat=pointer-events
Razort4x
14
Spowoduje to wyłączenie zdarzeń myszy, ale kontrola jest nadal włączona.
Mario Levrero,
44
Uwaga: Dzięki temu rozwiązaniu nie można wchodzić w interakcje z tym elementem ani innymi elementami potomnymi tego elementu za pomocą myszy lub urządzenia dotykowego. Ale nadal możesz tabulować to za pomocą klawiatury.
Adam
12
Nadal dostępny za pomocą klawiatury.
Tomer W
147

Użyj frameworka takiego jak JQuery, aby wykonywać takie czynności jak:

function toggleStatus() {
    if ($('#toggleElement').is(':checked')) {
        $('#idOfTheDIV :input').attr('disabled', true);
    } else {
        $('#idOfTheDIV :input').removeAttr('disabled');
    }   
}

Wyłączanie i włączanie elementów wejściowych w bloku Div Korzystanie z jQuery powinno ci pomóc!

Od jQuery 1.6 powinieneś używać .propzamiast .attrdo wyłączania.

Martin K.
źródło
2
„ręcznie” wybierając wszystkie wejścia ... Spróbuję tego, ale czy nie powinno wystarczyć oznaczenie div jako wyłączone?
juan
Gdy przełączam do UN wyłączyć niektóre przyciski stronicowania, które muszą pozostać wyłączone są również przełączać ...
juan
Możesz odfiltrować te przyciski i zrobić „.attr („ disabled ”, true);” za każdym razem na nich! Po prostu zrób $ ('# idOfPagination'). Attr ('disabled', true); po konstrukcji if {} else {}.
Martin K.
w rzeczywistości ich status jest kontrolowany gdzie indziej, zależy to od strony listy, na której paginuję, na której jestem (nie zawsze muszą być wyłączone). Że muszę jakoś to zrobić bez zmieniania oryginalnego statusu kontrola zawartości za
juan
Możesz sprawdzić ich status również za pomocą jquery i zapisać go. Czy: $ ('# idOfPagination'). Is (': disabled')? disablePagination = false: disablePagination = true; raz w obszarze globalnym, bezpośrednio po załadowaniu strony.
Martin K.
50

Chciałem tylko wspomnieć o tej metodzie rozszerzenia do włączania i wyłączania elementów . Myślę, że jest to o wiele czystszy sposób niż bezpośrednie dodawanie i usuwanie atrybutów.

Następnie po prostu wykonaj:

$("div *").disable();
Cletus
źródło
To rozwiązanie może powodować działania niepożądane na dużych stronach! (Brak statycznego odniesienia do kontenera div / Każdy adresowany element jest zaadresowany)
Martin K.
Jeśli używasz asp.net, otrzymasz <div disabled = "disabled"> po wyłączeniu kontrolki Panel. Działa to w przypadku elementów potomnych (tj. Zostają wyłączone) w IE, ale nie w innych przeglądarkach. Możesz wyłączyć wszystkie elementy potomne w Chrome / Firefox, łącząc funkcję wyłączania jquery z ... $ ("div [disabled = 'disabled']: input"). Disable ();
Stuart,
34

Oto krótki komentarz dla osób, które nie potrzebują div, a jedynie blokadę. W HTML5 <fieldset disabled="disabled"></fieldset>dostałem atrybut disabled. Każdy element formularza w wyłączonym zestawie pól jest wyłączony.

Michael Hächler
źródło
1
To świetna odpowiedź - pozwala na odradzanie dynamicznych elementów w stanie wyłączonym, o ile znajdują się one w elemencie bloku, zamiast testowania stanu wyłączonego podczas tworzenia - a elementy są naprawdę wyłączone.
łosoś łososiowy
To najlepsza odpowiedź. Jest to najbardziej poprawna semantycznie informacja dla przeglądarki, że wszystkie dane wejściowe w tym zestawie pól powinny być wyłączone. Uwzględnia klawiaturę i nie wymaga obsługi wyrejestrowania JS przez mysz. Jedna uwaga jednak, w momencie tego komentarza, Edge nie odziedziczy wyłączonej wartości atrybutu z nadrzędnych zestawów pól w innym zestawie pól.
Stephen Watkins,
Świetne, zawsze najlepsze rozwiązania są najprostsze dzięki.
StudioX
15

Wyłączony atrybut nie jest częścią specyfikacji W3C dla elementów DIV , tylko dla elementów formularza .

Podejście jQuery sugerowane przez Martina jest jedynym niezawodnym sposobem na osiągnięcie tego celu.

Chris Van Opstal
źródło
12

podobne do rozwiązania cletu, ale dostałem błąd przy użyciu tego rozwiązania, oto obejście:

$('div *').prop('disabled',true);
// or
$('#the_div_id *').prop('disabled',true);

działa dobrze na mnie

Kokizzu
źródło
12

Możesz użyć tej prostej instrukcji CSS, aby wyłączyć zdarzenia

#my-div {
    pointer-events:none;
}
Marcio Mazzucato
źródło
6

Testowane przeglądarki: IE 9, Chrome, Firefox i jquery-1.7.1.min.js

    $(document).ready(function () {
        $('#chkDisableEnableElements').change(function () {
            if ($('#chkDisableEnableElements').is(':checked')) {
                enableElements($('#divDifferentElements').children());
            }
            else {
                disableElements($('#divDifferentElements').children());
            }
        });
    });

    function disableElements(el) {
        for (var i = 0; i < el.length; i++) {
            el[i].disabled = true;

            disableElements(el[i].children);
        }
    }

    function enableElements(el) {
        for (var i = 0; i < el.length; i++) {
            el[i].disabled = false;

            enableElements(el[i].children);
        }
    }
Syed Nasir Abbas
źródło
5

Kontrolki wprowadzania HTML można wyłączyć za pomocą atrybutu „disabled”, jak wiadomo. Po ustawieniu atrybutu „wyłączony” dla kontroli wejściowej, procedury obsługi zdarzeń powiązane z taką kontrolą nie są wywoływane.

Musisz symulować powyższe zachowanie dla elementów HTML, które nie obsługują atrybutu „disabled”, takiego jak div, jeśli chcesz.

Jeśli masz div i chcesz obsługiwać kliknięcie lub kluczowe zdarzenie na tym div, musisz zrobić dwie rzeczy: 1) Jeśli chcesz wyłączyć div, ustaw jego atrybut disabled jak zwykle (tylko w celu zachowania zgodności z konwencja) 2) W modułach obsługi kliknięć i / lub klawiszach div sprawdź, czy atrybut div jest ustawiony na div. Jeśli tak, to po prostu zignoruj ​​zdarzenie kliknięcia lub kluczowe (np. Natychmiast powróć). Jeśli wyłączony atrybut nie jest ustawiony, wykonaj logikę kliknięcia i / lub kluczowe zdarzenie div.

Powyższe kroki są również niezależne od przeglądarki.

Sabinia
źródło
5

Jednym ze sposobów na osiągnięcie tego jest dodanie niepełnosprawnego rekwizytu do wszystkich dzieci div. Możesz to bardzo łatwo osiągnąć:

$("#myDiv").find("*").prop('disabled', true);

$("#myDiv")znajduje div, .find("*")dostaje wszystkie węzły potomne na wszystkich poziomach i .prop('disabled', true)wyłącza każdy z nich.

W ten sposób cała zawartość jest wyłączona i nie można ich klikać, przechodzić do nich, przewijać itp. Nie trzeba też dodawać żadnych klas css.

Blueriver
źródło
4

Zawiń divwewnątrz fieldsettagu:

<fieldset disabled>
<div>your controls</div>
</fieldset>
Sajithd
źródło
2

Myślałem, że wrzucę kilka notatek.

  1. <div> można wyłączyć w IE8 / 9. Zakładam, że jest to „niepoprawne” i to mnie wytrąciło
  2. Nie używaj .removeProp (), ponieważ ma on stały wpływ na element. Zamiast tego użyj .prop („wyłączone”, false)
  3. $ („# myDiv”). filter („input, textarea, select, button”). prop („disabled”, true) jest bardziej wyraźny i będzie przechwytywał niektóre elementy formularza, za którymi byś tęsknił: input
Steve11235
źródło
2

To jest dla poszukiwaczy,

Najlepsze, co zrobiłem, to

$('#myDiv *').attr("disabled", true);                   
$('#myDiv *').fadeTo('slow', .6);
Shree Krishna
źródło
2

Jak wspomniano w komentarzach, nadal możesz uzyskać dostęp do elementu, nawigując między elementami za pomocą klawisza Tab. więc polecam to:

$("#mydiv")
  .css({"pointer-events" : "none" , "opacity" :  "0.4"})
  .attr("tabindex" , "-1");
Hossein Khalesi
źródło
2

Jeśli chcesz zachować semantykę wyłączonych w następujący sposób

<div disabled="disabled"> Your content here </div>

możesz dodać następujący CSS

div[disabled=disabled] {
  pointer-events: none;
  opacity: 0.4;
}

korzyścią jest to, że nie pracujesz z klasami na div, z którymi chcesz pracować

real_ate
źródło
1

Chciałbym użyć ulepszonej wersji funkcji Cletus:

 $.fn.disable = function() {
    return this.each(function() {          
      if (typeof this.disabled != "undefined") {
        $(this).data('jquery.disabled', this.disabled);

        this.disabled = true;
      }
    });
};

$.fn.enable = function() {
    return this.each(function() {
      if (typeof this.disabled != "undefined") {
        this.disabled = $(this).data('jquery.disabled');
      }
    });
};

Który przechowuje oryginalną właściwość „disabled” elementu.

$('#myDiv *').disable();
koosvdkolk
źródło
1

Jak wyłączyć zawartość DIV

Sama pointer-eventswłaściwość CSS nie wyłącza przewijania elementów potomnych i nie jest obsługiwana przez IE10 i poniżej dla elementów DIV (tylko dla SVG). http://caniuse.com/#feat=pointer-events

Aby wyłączyć zawartość DIV we wszystkich przeglądarkach.

JavaScript:

$("#myDiv")
  .addClass("disable")
  .click(function () {
    return false;
  });

Css:

.disable {
  opacity: 0.4;
}
// Disable scrolling on child elements
.disable div,
.disable textarea {
  overflow: hidden;
}

Aby wyłączyć zawartość DIV we wszystkich przeglądarkach, z wyjątkiem IE10 i niższych.

JavaScript:

$("#myDiv").addClass("disable");

Css:

.disable {
  // Note: pointer-events not supported by IE10 and under
  pointer-events: none;
  opacity: 0.4;
}
// Disable scrolling on child elements
.disable div,
.disable textarea {
  overflow: hidden;
}
tfmontague
źródło
1

Poniżej znajduje się bardziej kompleksowe rozwiązanie umożliwiające maskowanie div div

  • brak osobnego CSS
  • obejmuje całą stronę lub tylko element
  • określ kolor maski i krycie
  • określ indeks Z, aby wyświetlać wyskakujące okienka nad maską
  • pokaż kursor klepsydry nad maską
  • usunięcie div maskowania na maksOff, aby inny można było później wyświetlić
  • rozciągnij maskę przy zmianie rozmiaru elementu
  • zwróć element maski, abyś mógł go stylizować itp

Obejmuje również klepsydrę i klepsydrę, których można używać osobno

// elemOrId - jquery element or element id, defaults to $('<body>')'
// settings.color defaults to 'transparent'
// settings.opacity defaults to 1
// settings.zIndex defaults to 2147483647
// if settings.hourglasss==true change cursor to hourglass over mask
function maskOn(elemOrId, settings) {
    var elem=elemFromParam(elemOrId);
    if (!elem) return;

    var maskDiv=elem.data('maskDiv');
    if (!maskDiv) {
        maskDiv=$('<div style="position:fixed;display:inline"></div>');
        $('body').append(maskDiv);
        elem.data('maskDiv', maskDiv);
    }

    if (typeof settings==='undefined' || settings===null) settings={};
    if (typeof settings.color==='undefined' || settings.color===null) settings.color='transparent';
    if (typeof settings.opacity==='undefined' || settings.opacity===null) settings.opacity=1;
    if (typeof settings.zIndex==='undefined' || settings.zIndex===null) settings.zIndex=2147483647;
    if (typeof settings.hourglass==='undefined' || settings.hourglass===null) settings.hourglass=false;

    // stretch maskdiv over elem
    var offsetParent = elem.offsetParent();
    var widthPercents=elem.outerWidth()*100/offsetParent.outerWidth()+'%';
    var heightPercents=elem.outerHeight()*100/offsetParent.outerHeight()+'%';
    maskDiv.width(widthPercents);
    maskDiv.height(heightPercents);
    maskDiv.offset($(elem).offset());

    // set styles
    maskDiv[0].style.backgroundColor = settings.color;
    maskDiv[0].style.opacity = settings.opacity;
    maskDiv[0].style.zIndex = settings.zIndex;

    if (settings.hourglass) hourglassOn(maskDiv);

    return maskDiv;
}

// elemOrId - jquery element or element id, defaults to $('<body>')'
function maskOff(elemOrId) {
    var elem=elemFromParam(elemOrId);
    if (!elem) return;

    var maskDiv=elem.data('maskDiv');
    if (!maskDiv) {
        console.log('maskOff no mask !');
        return;
    }

    elem.removeData('maskDiv');
    maskDiv.remove();
}

// elemOrId - jquery element or element id, defaults to $('<body>')'
// if decendents is true also shows hourglass over decendents of elemOrId, defaults to true
function hourglassOn(elemOrId, decendents) {
    var elem=elemFromParam(elemOrId);
    if (!elem) return;

    if (typeof decendents==='undefined' || decendents===null) decendents=true;

    if ($('style:contains("hourGlass")').length < 1) $('<style>').text('.hourGlass { cursor: wait !important; }').appendTo('head');
    if ($('style:contains("hourGlassWithDecendents")').length < 1) $('<style>').text('.hourGlassWithDecendents, .hourGlassWithDecendents * { cursor: wait !important; }').appendTo('head');
    elem.addClass(decendents ? 'hourGlassWithDecendents' : 'hourGlass');
}

// elemOrId - jquery element or element id, defaults to $('<body>')'
function hourglassOff(elemOrId) {
    var elem=elemFromParam(elemOrId);
    if (!elem) return;

    elem.removeClass('hourGlass');
    elem.removeClass('hourGlassWithDecendents');
}

function elemFromParam(elemOrId) {
    var elem;
    if (typeof elemOrId==='undefined' || elemOrId===null) 
        elem=$('body');
    else if (typeof elemOrId === 'string' || elemOrId instanceof String) 
        elem=$('#'+elemOrId);
    else
        elem=$(elemOrId);

    if (!elem || elem.length===0) {
        console.log('elemFromParam no element !');
        return null;
    }

    return elem;
}

Dzięki temu możesz na przykład:

maskOn(); // transparent page mask
maskOn(null, {color:'gray', opacity:0.8}); // gray page mask with opacity
maskOff(); // remove page mask
maskOn(div); // transparent div mask
maskOn(divId, {color:'gray', hourglass:true}); // gray div mask with hourglass
maskOff(div); // remove div mask

patrz jsfiddle

Kofifus
źródło
Wasze rozwiązania są bardzo dobre, aby wyłączyć całą stronę, ale nie działa na konkretnej części div, kochanie, próbowałem.
3 zasady
1
function disableItems(divSelector){
    var disableInputs = $(divSelector).find(":input").not("[disabled]");
    disableInputs.attr("data-reenable", true);
    disableInputs.attr("disabled", true);
}

function reEnableItems(divSelector){
    var reenableInputs = $(divSelector).find("[data-reenable]");
    reenableInputs.removeAttr("disabled");
    reenableInputs.removeAttr("data-reenable");
}
Jtbs
źródło
1

Lub po prostu użyj css i klasy „wyłączonej”.
Uwaga: nie używaj atrybutu disabled.
Nie musisz zadzierać z włączaniem / wyłączaniem jQuery.
Jest to o wiele łatwiejsze i działa w różnych przeglądarkach:

.disabled{
    position: relative;
}
.disabled:after{
    content: "";
    position: absolute;
    width: 100%;
    height: inherit;
    background-color: rgba(0,0,0,0.1);
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
}

Następnie możesz go włączać i wyłączać podczas inicjalizacji strony lub przełączania przycisku

if(myDiv !== "can be edited"){
    $('div').removeClass('disabled');
} else{
    $('div').addClass('disabled');
}
Jeremy
źródło
0

Innym sposobem, w jQuery, byłoby uzyskanie wewnętrznej wysokości, wewnętrznej szerokości i położenia zawierającego DIV, i po prostu nałożenie innego DIV, przezroczystego, na górę tego samego rozmiaru. Będzie to działać na wszystkich elementach w tym kontenerze, a nie tylko na danych wejściowych.

Pamiętaj jednak, że po wyłączeniu JS nadal będziesz mógł korzystać z danych wejściowych / treści DIV. To samo dotyczy powyższych odpowiedzi.

TheCarver
źródło
Co się stanie, jeśli użytkownik przejdzie do kart kontrolnych? To wcale nie pomaga, chyba że masz TYLKO użytkowników, którzy używają myszy do nawigacji.
Sivvy,
Ale może to być przydatne w połączeniu z wyłączeniem wejść. Jeśli nakładająca się div jest stylizowana jako półprzezroczysta, dobrym wizualnym wskaźnikiem jest to, że sekcja jest wyłączona.
xr280xr
0
$("#yourdivid textarea, #yourdivid input, #yourdivid select").attr('disabled',true);
anand
źródło
0

To rozwiązanie tylko css / noscript dodaje nakładkę powyżej zestawu pól (lub div lub dowolnego innego elementu), zapobiegając interakcji:

fieldset { position: relative; }
fieldset[disabled]::after { content: ''; display: inline-block; position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: all; background: rgba(128,128,128,0.2); }

Jeśli chcesz mieć niewidoczną, tj. Przezroczystą nakładkę, ustaw tło na np. Rgba (128, 128, 128, 08), ponieważ nie będzie działać bez tła. Powyższe działa dla IE9 +. Poniższy, znacznie prostszy css będzie działał na IE11 +

[disabled] { pointer-events: none; }

Chrom

Costas
źródło
0

Jeśli próbujesz po prostu powstrzymać ludzi od klikania i nie martwisz się przerażająco o bezpieczeństwo - znalazłem absolutnie umieszczony div z indeksem z 99999, to dobrze. Nie możesz kliknąć ani uzyskać dostępu do żadnej zawartości, ponieważ div jest na niej umieszczony. Może być nieco prostsze i jest rozwiązaniem CSS, dopóki nie trzeba go usunąć.

Ukuser32
źródło
0

Istnieją konfigurowalne biblioteki javascript, które pobierają ciąg html lub element dom i usuwają niepożądane tagi i atrybuty. Są one znane jako środki odkażające HTML . Na przykład:

Np. W DOMPurify

DOMPurify.sanitize('<div>abc<iframe//src=jAva&Tab;script:alert(3)>def</div>'); 
// becomes <div>abcdef</div>
atomh33ls
źródło
-1

EDYCJA: Poniżej użyłem .on()metody, zamiast tego użyj .bind()metody

$(this).bind('click', false);
$(this).bind('contextmenu', false);

aby usunąć ustawienie, możesz użyć .unbind()metody. Podczas gdy .off()metoda nie działa zgodnie z oczekiwaniami.

 $(this).unbind('click', false);
 $(this).unbind('contextmenu', false);

Po zbadaniu setek rozwiązań! ucząc się o zdarzeniach wskaźnikowych, poniżej zrobiłem to.

Jak wspomniał @Kokodoko w swoim rozwiązaniu, które jest odpowiednie dla wszystkich przeglądarek oprócz IE. pointer-eventsdziała w IE11, a nie w niższych wersjach. Zauważyłem również w IE11 , że zdarzenia-wskaźniki nie działają na elementach potomnych. A zatem, jeśli mamy coś jak poniżej

 <a href="www.preshmalinetpereira.wordpress.com"><i class="car icon"></i><span>My Blog</span></a>

gdzie rozpiętość -jest elementem potomnym , ustawienie pointer-events: nonenie będzie działać

Aby rozwiązać ten problem, napisałem funkcję, która może działać jako wskaźnik zdarzeń dla IE i będzie działać w niższych wersjach.

W pliku JS

DisablePointerEvents(".DisablePointerEvents");


function DisablePointerEvents(classId) {
    $(classId).each(function () {
        $(this).on('click', false );
        $(this).on('contextmenu', false );
    });
}

W pliku CSS

.DisablePointerEvents{
    pointer-events: none;
    opacity: 0.7;
    cursor: default;
}

W HTML

 <a href="www.preshmalinetpereira.wordpress.com" class="DisablePointerEvents"><i class="car icon"></i><span>My Blog</span></a>

To sfałszowało pointer-eventsscenariusz, w którympointer-events nie działa i kiedy występuje powyższy stan elementów potomnych.

JS Fiddle za to samo

https://jsfiddle.net/rpxxrjxh/

Preshma Linet Pereira
źródło
-1

rozwiązanie simpleset

spójrz na mój selektor

$myForm.find('#fieldsetUserInfo input:disabled').prop("disabled", false);

fieldsetUserInfojest div zawiera wszystkie wejścia chcę wyłączony lub Włącz

mam nadzieję, że to ci pomoże

Basheer AL-MOMANI
źródło