我需要将“bad”类的每个复选框添加到DOM中以获取“禁用”属性。外部代码添加了复选框,因此当复选框自己插入DOM时,我无法添加disabled属性。
我该怎么做?
已更新:我不知道何时会添加这些复选框。情景非常复杂。
答案 0 :(得分:3)
****更新了代码**** - 请参见底部的注释。
此处建议的DOMNodeInserted事件不是跨浏览器,它在ie<中不可用。 9,甚至在9中它都是错误的。
一个简单的跨浏览器解决方案是设置一个每隔100毫秒检查一次的间隔,是否禁用按类名“坏”的所有复选框元素:
function CheckBadCheckboxes()
{
var elems = document.getElementsByTagName("input");
for (var i = 0; i < elems.length; i++) {
if (elems[i].type == "checkbox" && /\b(bad)\b/i.test(elems[i].className) && !elems[i].disabled) {
elems[i].disabled = true;
}
}
}
window.setInterval(CheckBadCheckboxes, 100);
此代码不要求您使用jQuery。
DOMNodeInserted还有另一个参数,它被弃用并降低了网页的性能。 PetersenDidIt在这里的评论中解释了它:
DOMNodeInserted equivalent in IE?
@Anurag注意:MutationEvent接口是在DOM Level 2 Events中引入的,但尚未在用户代理之间实现完全和互操作。此外,有人批评界面,如设计,引入了性能和实施挑战。正在开发一个新规范,目的是解决突变事件解决的用例,但是性能更高。因此,本规范描述了完整性的突变事件,但不推荐使用MutationEvent接口和MutationNameEvent接口。
DOMNodeInserted的错误行为:
http://help.dottoro.com/ljmcxjla.php
请注意,在Internet Explorer 9中,DOMNodeInserted事件是错误的,第一次插入节点时不会触发它。有关详细信息,请参阅以下示例。
<强>更新强>
我已经更新了我的代码,之前我使用了getElementsByClassName(),遗憾的是IE不支持它。 9,我用getElementsByTagName(“input”)替换它。
答案 1 :(得分:1)
这是一个例子:
$(document).bind("DOMNodeInserted", function(e) {
var elm = $("input.bad", $(e.target));
if(elm)
elm.prop("disabled", "disabled");
});
注意:.prop
是自jQuery 1.6以来。如果您使用的是旧版本,请使用attr()
答案 2 :(得分:1)
你知道“处理程序”会添加复选框吗?
如果是这样,你可以捕获它并放置“中间”功能(例如)
var MyTempFunct = OldHandler;
function MyNewFunct(){
MyTempFunct();
AddDisableds();
}
OldHandler = MyNewFunct;
虽然这个想法可能存在一些封闭问题。
答案 3 :(得分:1)
您可以使用此插件:http://docs.jquery.com/Plugins/livequery
解决问题。它将在添加和删除节点时调用函数。类似的东西:
$(".bad").livequery(function(){
$(this).attr("disabled", "disabled");
}, $.noop);
答案 4 :(得分:0)
$(".bad").attr("disabled","disabled");