jquery已禁用输入选择器未选择div或选择列表

时间:2011-09-09 18:03:18

标签: jquery crm

我正在使用以下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");

1 个答案:

答案 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元素中得到什么样的行为。它显然不是本机控件,但提供的代码至少会更改指定的disabledreadonly属性。

<小时/> 编辑: 您在上面的选择器中看到的行为是正确的:

$('input:disabled').css("border","3px solid red");

此选择器由两部分组成:input:disabledinput部分表示只选择<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');

请注意,上述声明应完全按照说明操作,但请注意,disabledreadonly属性在<div/>标记上没有内在含义,所以我不指望你看到那些明显的差异。