我正在使用以下jquery语句尝试更改已禁用为只读的表单上的输入
$('input[disabled="true"]').attr('readonly', 'readonly').prop("disabled",false);
这适用于大多数控件,但仍禁用了一些控件。这是一个
<select name="new_optionset" tabIndex="1100" disabled=""
class="ms-crm-SelectBox " id="new_optionset" style="ime-mode: auto;"
_events="[object Object]" control="[object Object]" attrPriv="7"
attrName="new_optionset" req="0" defaultSelected="100000000">
这是另一个
<div disabled="" class="ms-crm-RadioButton" id="new_bitfield2options"
style="ime-mode: auto;" control="[object Object]" attrPriv="7"
attrName="new_bitfield2options" req="0" atype="Boolean"
onchangeHandler="function(){fExistingHandler();fNewHandler()}"
onfocusHandler="function(){}">
你能帮我把这些控件读取而不是禁用吗?
这是我模拟的示例,用于显示输入选择器如何不选择html select元素。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="JQuery1.WebForm2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<script src="js/jquery-1.3.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
$("input").css("border","3px solid red");
});
</script>
<script type="text/javascript">
</script>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<select name="new_optionset" tabindex="1100" disabled="" class="ms-crm-SelectBox "
id="new_optionset" style="ime-mode: auto;">
<asp:TextBox runat="server"></asp:TextBox>
</div>
</form>
</body>
</html>
我一直在玩这个,并发现在我看来是非常奇怪的行为。
此选择器将选择大多数输入,例如文本框,但不会选择Div或html选择元素(下拉列表)
$('input:disabled').css("border","3px solid red");
这个选择器允许我选择禁用的html选择元素
$('select:disabled').css("border", "3px solid red");
所以我尝试使用与Div相同的方法。我可以使用此声明选择所有div
$('div').css("border", "3px solid red");
但是当我尝试添加disabled关键字时,它不再选择我的禁用div。
$('div:disabled').css("border", "3px solid red");
答案 0 :(得分:1)
更新:
这是一种应该有效的方法:
$(':input:disabled, .ms-crm-RadioButton[disabled]')
.attr('readonly', 'readonly').removeAttr('disabled');
请注意使用:input
和:disabled
伪选择器。 :input
基本上会选择所有表单字段(不只是<input/>
标记),而:disabled
提供了一种更加防弹的方式来检测已禁用的字段(它将处理disabled="disabled"
, disabled="true"
,或只是disabled
)。
我不确定你应该从.ms-crm-RadioButton
元素中得到什么样的行为。它显然不是本机控件,但提供的代码至少会更改指定的disabled
和readonly
属性。
$('input:disabled').css("border","3px solid red");
此选择器由两部分组成:input
和:disabled
。 input
部分表示只选择<input/>
类型的标签。这显然不包括<select/>
或<div/>
类型的标记。 :disabled
部分只会将<input/>
标记的选择过滤为已禁用的标记。
$('select:disabled').css("border", "3px solid red");
此选择器与上面的选择器基本相同,但是使用<select/>
标签而不是<input/>
标签。
$('div').css("border", "3px solid red");
非常自我解释......
$('div:disabled').css("border", "3px solid red");
这里的选择器实际上没有多大意义。 <div/>
标签实际上不是输入元素,因此在语义上禁用一个标签是没有意义的。在上面提供的标记中,我可以看到您确实在disabled
上设置了<div/>
属性,但这实际上并没有“禁用”任何内容,因为它是{{<div/>
的无效属性1}}的
话虽如此,disabled
属性仍然存在(有效或无效),并且可以在选择器中使用。我们将无法使用:disabled
伪选择器,因为该元素并非真正禁用。但是,我们可以编写一个选择器来查找该属性的原始状态,如下所示:'div[disabled]'
。
因此,我们需要选择全部禁用的<input/>
,<select/>
和<div/>
标记(或者至少具有禁用的属性),我们可以编写这样的选择器:
$(':input:disabled, div[disabled]')
*我之前描述过上面的:input
伪选择器。
使用此选择器,我们可以删除disabled属性并在所有匹配的元素上设置readonly属性,如下所示:
$(':input:disabled, div[disabled]')
.attr('readonly', 'readonly').removeAttr('disabled');
请注意,上述声明应完全按照说明操作,但请注意,disabled
和readonly
属性在<div/>
标记上没有内在含义,所以我不指望你看到那些明显的差异。