如何禁用所有div内容


278

我当时的假设是,如果禁用div,那么所有内容也会被禁用。

但是,内容为灰色,但我仍然可以与之交互。

有没有办法做到这一点?(禁用div并同时禁用所有内容)

Answers:


530

上述许多答案仅适用于表单元素。禁用任何DIV包括其内容的简单方法是仅禁用鼠标交互。例如:

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

的CSS

.disabledbutton {
    pointer-events: none;
    opacity: 0.4;
}

18
+1获得正确答案-您刚刚为我节省了工作时间!!!泪流满面并且可能是相爱 -所有浏览器也都支持它:caniuse.com/#feat=pointer-events
tfmontague

10
我知道已经很晚了,但是IE 8,IE 9和IE 10仍然不支持它。只是让大家知道。caniuse.com/#feat=pointer-events
Razort4x

14
这只会禁止鼠标事件,但控件仍处于启用状态。
Mario Levrero '16

44
注意:使用此解决方案,您无法使用鼠标或在触摸设备上与该元素或其任何子元素进行交互。但是您仍然可以使用键盘对其进行切换。
亚当

12
仍然可以通过键盘访问。
Tomer W

147

使用类似JQuery的框架来执行以下操作:

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

使用jQuery禁用和启用Div块中的输入元素应该可以帮助您!

从jQuery 1.6开始,您应该使用.prop而不是.attr禁用它。


2
“手动”选择所有输入...我会尝试的,但是将div标记为已禁用是否足够?
胡安·

当我切换到禁用时,一些需要保持禁用状态的分页按钮也会被切换...
juan 2009年

您可以过滤此按钮并执行“ .attr('disabled',true);” 每次对他们!只需执行$('#idOfPagination')。attr('disabled',true); 在if {} else {}构造之后。
Martin K.

实际上,它们的状态是在其他位置控制的,这取决于我正在分页的列表的哪一页(不必总是被禁用)。我好歹做它需要在不改变内容控制的原始状态
胡安

您也可以使用jquery检查其状态并保存。做:$('#idOfPagination')。is(':disabled')吗?disablePagination = false:disablePagination = true; 一次在全局区域中,直接在页面加载之后。
Martin K.

50

我只想提及此启用和禁用元素的扩展方法。我认为这是比直接添加和删除属性更简洁的方法。

然后,您只需执行以下操作:

$("div *").disable();

此解决方案可能会在大页面中引起副作用!(没有对div容器的静态引用/每个基础元素都得到了处理)
Martin K.

如果您使用的是asp.net,则在禁用面板控件时会得到<div disabled =“ disabled”>。这适用于IE中的子元素(即它们被禁用),但不适用于其他浏览器。您可以通过将jquery disable功能与... $(“ div [disabled ='disabled']:input”)。disable();结合使用来禁用Chrome / Firefox中的所有子表单元素。
斯图尔特(Stuart)

34

对于不需要div只是一个基本元素的人,这里是一个简短的评论。在HTML5中<fieldset disabled="disabled"></fieldset>获得了disable属性。禁用字段集中的每个表单元素均被禁用。


1
这是一个很好的答案-只要动态项目位于block元素内,它就可以在禁用状态下生成动态项目,而不是在创建时测试禁用状态-并且元素是真正禁用的。
大马哈鱼

这是最好的答案。从语义上讲,这是最正确的方法,它告诉浏览器应禁用此字段集中的所有输入。它使用键盘,不需要鼠标处理JS注销。需要注意的是,截至本文发表之时,Edge不会从另一个字段集中的父字段集继承禁用的属性值。
Stephen Watkins

伟大的一个,总是最好的解决方案是最简单的一个。
StudioX


12

类似于cletu的解决方案,但使用该解决方案时出现错误,这是解决方法:

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

对我很好



6

经过测试的浏览器:IE 9,Chrome,Firefox和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);
        }
    }

5

如您所知,可以使用“ disabled”属性禁用HTML输入控件。一旦为输入控件设置了“禁用”属性,就不会调用与该控件关联的事件处理程序。

如果需要,您必须为不支持div等不支持'disabled'属性的HTML元素模拟上述行为。

如果您有一个div,并且要支持该div上的click或key事件,则必须做两件事:1)当您要禁用div时,请照常设置其disable属性(只是为了遵守约定)2)在div的单击和/或键处理程序中,检查div上是否设置了disable属性。如果是这样,则只需忽略单击或按键事件(例如,立即返回)。如果未设置Disabled属性,则执行div的click和/或key事件逻辑。

以上步骤也与浏览器无关。


5

一种方法是将禁用的道具添加到div的所有子级中。您可以轻松实现:

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

$("#myDiv")查找div,.find("*")获取所有级别的所有子节点并.prop('disabled', true)禁用每个子节点。

这样,所有内容都将被禁用,并且您无法单击它们,将它们制表到选项卡,对其进行滚动等。而且,您无需添加任何CSS类。


4

divfieldset标签内包装:

<fieldset disabled>
<div>your controls</div>
</fieldset>

2

我以为我会记一些笔记。

  1. 可以在IE8 / 9中禁用<div>。我认为这是“错误的”,这让我失望了
  2. 不要使用.removeProp(),因为它会对元素产生永久性影响。使用.prop(“ disabled”,false)代替
  3. $(“#myDiv”)。filter(“ input,textarea,select,button”)。prop(“ disabled”,true)更为明确,它将捕获您可能会错过的某些表单元素:input


2

如评论中所述,您仍然可以通过使用Tab键在元素之间导航来访问元素。所以我推荐这个:

$("#mydiv")
  .css({"pointer-events" : "none" , "opacity" :  "0.4"})
  .attr("tabindex" , "-1");

2

如果要保留禁用的语义,如下所示

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

您可以添加以下CSS

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

这样做的好处是您不使用要使用的div上的类


1

我将使用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');
      }
    });
};

其中存储元素的原始“禁用”属性。

$('#myDiv *').disable();

1

如何禁用DIV的内容

pointer-events单独的CSS 属性不会禁止子元素滚动,并且IE10及以下版本不支持DIV元素(仅适用于SVG)。 http://caniuse.com/#feat=pointer-events

在所有浏览器上禁用DIV的内容。

Javascript:

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

CSS:

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

在除IE10及以下版本的所有浏览器上禁用DIV的内容。

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;
}

1

以下是掩盖div启用的更全面的解决方案

  • 没有单独的CSS
  • 覆盖整个页面或仅覆盖一个元素
  • 指定遮罩的颜色和不透明度
  • 指定Z索引,以便可以在蒙版上显示弹出窗口
  • 在面具上显示沙漏光标
  • 删除maksOff上的masking div,以便稍后可以显示另一个
  • 调整元素大小时的拉伸蒙版
  • 返回mask元素,以便您可以设置其样式等

还包括可以单独使用的hourglassOn和hourglassOff

// 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;
}

例如,您可以执行以下操作:

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

jsfiddle


我尝试过,您的解决方案可以很好地禁用整个页面,但不适用于特定的div部分。
3条规则

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");
}

1

或仅使用CSS和“禁用”类。
注意:请勿使用Disabled属性。
无需搞乱jQuery开/关。
这要容易得多,并且可以跨浏览器运行:

.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;
}

然后,您可以在初始化页面或切换按钮时将其关闭和关闭

if(myDiv !== "can be edited"){
    $('div').removeClass('disabled');
} else{
    $('div').addClass('disabled');
}

0

在jQuery中,另一种方法是获取包含的DIV的内部高度,内部宽度和位置,并简单地将另一个DIV(透明)覆盖在相同大小的顶部上。这将适用于该容器内的所有元素,而不仅仅是输入。

但是请记住,禁用JS后,您仍然可以使用DIV的输入/内容。上述答案也是如此。


如果用户通过控件切换选项卡怎么办?除非您只有使用鼠标进行导航的用户,否则这根本没有帮助。
Sivvy 2012年

但这与禁用输入结合在一起很有用。如果覆盖div的样式设置为半透明,则可以很好地指示该部分已禁用。
xr280xr 2015年

0
$("#yourdivid textarea, #yourdivid input, #yourdivid select").attr('disabled',true);

0

此仅css / noscript解决方案在字段集(或div或任何其他元素)上方添加了覆盖图,从而防止了交互:

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); }

如果需要不可见的透明覆盖,请将背景设置为rgba(128,128,128,0),因为没有背景就无法使用。以上适用于IE9 +。以下更简单的CSS可以在IE11 +上运行

[disabled] { pointer-events: none; }


0

如果您只是想阻止人们点击而又不担心安全性-我发现Z索引为99999的绝对位置div可以很好地解决问题。您无法点击或访问任何内容,因为div位于其上方。可能会更简单一些,并且是仅CSS的解决方案,直到需要将其删除为止。


0

有一些可配置的javascript库,它们吸收html字符串或dom元素,并去除不想要的标签和属性。这些被称为html消毒剂。例如:

例如在DOMPurify中

DOMPurify.sanitize('<div>abc<iframe//src=jAva&Tab;script:alert(3)>def</div>'); 
// becomes <div>abcdef</div>

-1

编辑:下面我使用了.on()方法,而不是使用.bind()方法

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

要删除设置,可以使用.unbind()方法。而该.off()方法无法按预期工作。

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

经过研究数百种解决方案!了解指针事件,下面是我的工作。

正如@Kokodoko在他的解决方案中提到的那样,它适用于除IE之外的所有浏览器。只能pointer-eventsIE11中使用,而不在较低版本中使用。我还注意到在IE11中,指针事件在子元素上不起作用。因此,如果我们有类似下面的内容

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

其中span-是子元素,设置将pointer-events: none不起作用

为了克服这个问题,我编写了一个函数,该函数可以用作IE的指针事件,并且可以在较低版本中使用。

在JS文件中

DisablePointerEvents(".DisablePointerEvents");


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

在CSS文件中

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

在HTML中

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

这伪造了不起作用的pointer-events情况pointer-events以及出现上述子元素条件的情况。

JS Fiddle同样

https://jsfiddle.net/rpxxrjxh/


-1

简单解决方案

看看我的选择器

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

fieldsetUserInfo被div包含我要禁用或启用所有输入

希望这对您有帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.