【问题标题】:Enable & Disable a Div and its elements in Javascript [duplicate]在Javascript中启用和禁用Div及其元素[重复]
【发布时间】:2011-12-07 22:55:59
【问题描述】:

我正在寻找一种方法来启用和禁用 div id="dcalc" 及其子级。

<div id="dcalc" class="nerkheArz"
 style="left: 50px; top: 150px; width: 380px; height: 370px;
 background: #CDF; text-align: center" >
 <div class="nerkh-Arz"></div>
 <div id="calc"> </div>
</div>

我想在加载页面时禁用它们,然后单击即可启用它们?

这是我尝试过的

document.getElementById("dcalc").disabled = true;

【问题讨论】:

  • “启用”和“禁用”div 元素有什么区别?实际上只是 input 可以禁用的元素。还是要禁用 div 中的所有子 input 元素?
  • 我想禁用 main 下的每个 div

标签: javascript jquery xhtml


【解决方案1】:

您应该可以通过 jQuery 中的attr()prop() 函数来设置这些,如下所示:

jQuery (

// This will disable just the div
$("#dcacl").attr('disabled','disabled');

// This will disable everything contained in the div
$("#dcacl").children().attr("disabled","disabled");

jQuery (>= 1.7):

// This will disable just the div
$("#dcacl").prop('disabled',true);

// This will disable everything contained in the div
$("#dcacl").children().prop('disabled',true);

//  disable ALL descendants of the DIV
$("#dcacl *").prop('disabled',true);

Javascript:

// This will disable just the div
document.getElementById("dcalc").disabled = true;

// This will disable all the children of the div
var nodes = document.getElementById("dcalc").getElementsByTagName('*');
for(var i = 0; i < nodes.length; i++){
     nodes[i].disabled = true;
}

【讨论】:

  • .prop('disabled', true) 会更好。而且你的最后一个代码块泄漏了一个全局(你需要var i)。
  • 如果您已经在使用 JQuery - 那么我推荐使用它。但是,如果您不是 Javascript 解决方案,那么实施起来会容易得多。因为您只需将它们包装在
  • 它不起作用。我仍然可以点击子链接。
  • 我也是,不行。我仍然可以点击子链接
  • 请注意 $el.children() 仅遍历 DOM 的一个级别,因此它实际上不会禁用 DIV 的所有后代。所以,@ Emerald214 @oliver-pons,要做到这一点,你必须做类似$("#dcac1 *").prop("disabled", true); 之类的事情,否则,很好的答案。
【解决方案2】:

如果你想禁用所有 div 的控件,你可以尝试在 div 上添加一个透明的 div 来禁用,你会让它无法点击,也可以使用 fadeTo 来创建禁用外观。

试试这个。

$('#DisableDiv').fadeTo('slow',.6);
$('#DisableDiv').append('<div style="position: absolute;top:0;left:0;width: 100%;height:100%;z-index:2;opacity:0.4;filter: alpha(opacity = 50)"></div>');

【讨论】:

  • 结合抑制键盘和复制/粘贴事件:var stopPropFn = function (e) { e.stopPropagation(); e.preventDefault(); }; $('#DisableDiv').bind("keydown", stopPropFn); $('#DisableDiv').bind("keypress", stopPropFn); $('#DisableDiv').bind("paste", stopPropFn);
  • 这不会阻止用户使用“tab”键访问链接或输入,他们仍然可以与它们交互。
  • 你应该给屏蔽分区一个ID,以便在你想重新启用分区时可以删除它
  • 如何撤消它?我希望这就像一个开关。
  • @oliver 给被附加的 div 一个 id,例如“overlay”。然后,当您要删除时,只需使用 $("#overlay").remove();
【解决方案3】:

以下选择所有后代元素并禁用它们:

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

但只有禁用某些元素类型才真正有意义:输入、按钮等,因此您需要更具体的选择器:

$("#dcac1").find(":input").prop("disabled",true);
// noting that ":input" gives you the equivalent of
$("#dcac1").find("input,select,textarea,button").prop("disabled",true);

要重新启用,您只需将“已禁用”设置为 false。

我想在加载页面时禁用它们,然后单击我可以启用它们

好的,所以把上面的代码放在一个文档准备处理程序中,并设置一个适当的点击处理程序:

$(document).ready(function() {
    var $dcac1kids = $("#dcac1").find(":input");
    $dcac1kids.prop("disabled",true);

    // not sure what you want to click on to re-enable
    $("selector for whatever you want to click").one("click",function() {
       $dcac1kids.prop("disabled",false);
    }
}

我已经缓存了选择器的结果,假设您没有在页面加载和点击之间向 div 添加更多元素。而且我已将点击处理程序附加到.one(),因为您没有指定重新禁用元素的要求,因此大概该事件只需要处理一次。当然,如果合适,您可以将.one() 更改为.click()

【讨论】:

  • 我想在页面加载时使用它?可以是 jquery 吗?
  • 我的答案中的最后一段代码是在页面加载时完成的(好吧,在准备好的文档上,这是一个更好的选择)并且它是用 jQuery 完成的——这不是你想要的吗?
  • 有趣...您的答案确实有效,而使用 children() 将不起作用:stackoverflow.com/a/8423836/114029 为什么?我确实在 Chrome 开发工具中看到它正确选择了子元素,但它们根本不会被禁用。
  • @LenielMacaferi - 如果你在 jsfiddle.net 上创建一个,我不知道没有看到你的 html 或者演示。但在一般意义上,.children() 只选择直接子级,这就是为什么我的答案使用.find() 来获取所有匹配的后代元素。你需要选择表单元素,禁用div真的没有意义。
猜你喜欢
  • 2021-12-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 2020-05-27
相关资源
最近更新 更多