Javascript根据选择其他字段禁用/启用输入字段

时间:2017-10-18 11:23:14

标签: javascript jquery html

我尝试按照此处的答案在我的代码中执行此操作:How do I disable input field when certain select list value is picked但不适合我。

我有一个HTML选择字段ID' TfL'是/否答案,以及下一个领域' TfLroad'是一个输入字段。我想要' TfLroad'默认情况下加载为禁用,如果' TfL'从No改为Yes,然后是' TfLroad'应该启用。

下面是整个页面代码,JS位于文件顶部,这两个字段位于底部,tx有任何建议!:

{% extends "base.jinja2" %}
{% block content %}

<script>

// value 0 for No answer to TfL road 1 for, in which case disabled, on change should
// enable TfLroad element by setting disabled = false, but not working yet!

document.getElementById("TfLroad").onload = function () {
    document.getElementById("TfLroad").disabled = true;
}

document.getElementById('TfL').onchange = function () {
    if(this.value = '0') {
        document.getElementById("TfLroad").disabled = true;
    }

    else {
        document.getElementById("TfLroad").disabled = false;
    }
}


</script>
                <h2 style="text-align:center">Add A 'Dummy' Street</h2>

<p>You can create a Dummy street here, which you will be able to search for in this application. This is to
demonstrate how a real Create &amp; Update Process could work for this application, without corrupting the original
data. Dummy streets are indicated in search results.</p>

<form class="form-horizontal" action = "" method="post">
  <fieldset>

     <div class="form-group">

        <div class="col-lg-6">
            <label for="stname" class="control-label">Street Name</label>
            <input class="form-control" id="stname" name="stname" pattern="^\S.{3,98}\S$"
                   title="Sorry, you must type from 5 to 100 characters, and no space at beginning or end."
                   placeholder="Full Street Name" required>
            <!--  required attribute needed because empty string bypasses the pattern regex. -->
            <span class="help-block">NB: No naughty word streets please, these will be deleted by admin!</span>
        </div>

<!-- CR, CL, PR, 25, 16, 19, BE, KN, SC, TH, WA, WH -->
        <div class="col-lg-3">
            <label for="distr" class="control-label">Postal District</label>
            <select class="form-control" id="distr" name="distr">
              <option>Croydon (CR0, CR2, CR7 or CR9)</option>
              <option>Coulsdon CR5</option>
              <option>Purley CR8</option>
              <option>London SE25</option>
              <option>London SW16</option>
              <option>Kenley CR8</option>
              <option>South Croydon CR2</option>
              <option>Thornton Heath CR7</option>
              <option>Warlingham CR6</option>
              <option>Whyteleafe CR3</option>
              <option>Beckenham BR3</option>
            </select>
            <span class="help-block">NB: Original data uses postal district only, hence problem with several postcodes for Croydon.</span>
        </div>

        <div class="col-lg-3">
            <label for="maint" class="control-label">Who looks after this street?</label>
            <select class="form-control" id="maint" name="maint">
              <option>Croydon Borough</option>
              <option>Transport for London</option>
              <option>Private Road</option>
            </select>
        </div>

    </div>

    <div class="form-group">
        <h4 class="centre">Street Number Limits for this Street Section<br/><small>Please leave as None if all properties in this section have names</small></h4>
    </div>

    <div class="form-group">
        <div class="col-lg-3">
            <label for="onb" class="control-label">Odd Numbers From</label>
            <input class="form-control" id="onb" name="onb" value="None" pattern="^\d*[13579]$|(None)" title="Odd Numbers only please with no spaces, or None">
            <span class="help-block">e.g. '1' or '111'</span>
        </div>

        <div class="col-lg-3">
            <label for="one" class="control-label">Odd Numbers To</label>
            <input class="form-control" id="one" name="one" value="None" pattern="^\d*[13579]$|(None)" title="Odd Numbers only please with no spaces, or None">
            <span class="help-block">e.g. '31' or '217'</span>
        </div>

        <div class="col-lg-3">
            <label for="enb" class="control-label">Even Numbers From</label>
            <input class="form-control" id="enb" name="enb" value="None" pattern="^\d*[02468]$|(None)" title="Even Numbers only please with no spaces, or None">
            <span class="help-block">e.g. '2' or '110'</span>
        </div>

        <div class="col-lg-3">
            <label for="ene" class="control-label">Even Numbers To</label>
            <input class="form-control" id="ene" name="ene" value="None" pattern="^\d*[02468]$|^(None)$" title="Even Numbers only please with no spaces, or None">
            <span class="help-block">e.g. '32' or '216'</span>
        </div>
    </div>

    <div class="form-group">
        <div class="col-lg-4">
            <label for="rdclass" class="control-label">Road Class</label>
            <select class="form-control" id="rdclass" name="rdclass">
              <option>Unclassified</option>
              <option>A Road</option>
              <option>B Road</option>
              <option>C Road</option>
            </select>
            <span class="help-block">Leave as Unclassified if in any doubt.</span>
        </div>

        <div class="col-lg-4">
            <label for="length" class="control-label">Length of this Street Section (whole no. metres)</label>
            <input class="form-control" id="length" name="length" value= 0 pattern="^[1-9][0-9]*$" title="Whole number of metres please, no spaces!" required>
        </div>

        <div class="col-lg-4">
            <!-- JS here to put in A B C / disable depending on what selected in rdclass box -->
            <label for="rdnum" class="control-label">Road Number</label>
            <input class="form-control" id="rdnum" name="rdnum" pattern="^[ABC][1-9][0-9]*$|^(None)$" title="Must be None, or A, B or C followed by a whole number for the road class, no spaces!" value="None" required>
            <span class="help-block">Only for A/B/C roads e.g. 'A232', 'C3241'</span>
        </div>
    </div>

    <div class="form-group">
        <div class="col-lg-3">
            <label class="control-label left">Does one end of this street adjoin a TfL maintained street?</label>
            <select class="form-control" id="TfL">
              <option value="0">No</option>
              <option value="1">Yes</option>
            </select>
        </div>

        <div class="col-lg-4">
            <!-- JS not working yet to disable only if no selected in rdclass box -->
            <label class="control-label"><br/>&nbsp;Road Number of Adjoining TfL Road?</label>

            <input class="form-control" pattern="^[ABC][1-9][0-9]*$|^(None)$"
                   title="Must be None, or A, B or C followed by a whole number, no spaces!" value="None" id="TfLroad" required>

           <span class="help-block">E.g. 'A232', 'B2441'</span>
        </div>

    </div>

    <div class="form-group">
        <div class="centre">
            <button type="reset" class="btn btn-default">Reset Form</button>
            <button type="submit" class="btn btn-primary">Create Street</button>
        </div>
    </div>
  </fieldset>
</form>
{% endblock %}

4 个答案:

答案 0 :(得分:4)

您可以将禁用添加到HTML输入元素,而不是通过javascript设置禁用:

<input class="form-control" disabled="disabled" .... />

然后在你的javascript中:

document.getElementById('TfL').onchange = function () 
{
    if (this.value == '0') 
    {
        document.getElementById("TfLroad").disabled = true;
    }

    else 
    {
        document.getElementById("TfLroad").disabled = false;
    }
}

答案 1 :(得分:2)

disabled是一个布尔属性。您不能通过将其属性设置为disabled=false来禁用该元素。浏览器会检查您的元素是否具有disabled属性,并且不关心其disabled=truedisabled=falsedisabled=elephant。为了&#34;启用&#34;您的元素必须完全删除disabled属性。

这应该有效:

document.getElementById('TfL').onchange = function () {
    if(this.value == '0') {
        document.getElementById("TfLroad").disabled = "elephant";
    }

    else {
        document.getElementById("TfLroad").removeAttr("disabled");
    }
}

同样,在比较两个值时,请使用==而不是=

答案 2 :(得分:1)

您提供的HTML /脚本存在多个问题。

  1. <script>内容在表单字段存在之前正在执行(onload代码未按照您已完成的方式实施。)
  2. 您尚未选择TfL
  3. 的默认值
  4. 默认情况下,您尚未停用TfLroad
  5. 你在比较中得到了一个拼写错误。
  6. 按顺序修复:

    1. <script>移至页面底部,然后移除onload功能。
    2. 假设您希望默认选择No

        <select class="form-control" id="TfL">
          <option value="0" selected>No</option>
          <option value="1">Yes</option>
        </select>
      
    3. 添加disabled属性

      <input class="form-control" pattern="^[ABC][1-9][0-9]*$|^(None)$" disabled
        title="Must be None, or A, B or C followed by a whole number, no spaces!" value="None" id="TfLroad" required>
      
    4. usie =代替==(或===):

      if(this.value = '0') {
      
    5. 应该是

          if(this.value === '0') {
      

      (您也可以重写onchange处理程序):

      document.getElementById('TfL').onchange = function () {
        document.getElementById("TfLroad").disabled = (this.value === '0');
      }
      

答案 3 :(得分:1)

问题是load事件对所有元素都不起作用,它只支持下面的HTML标记。

<body>, <frame>, <frameset>, <iframe>, <img>, <input type="image">,
<link>, <script> and <style>

请参阅here了解详情。

此外,我已经更改了应用初始禁用条件的逻辑,请检查它!

作为替代方案,您可以查看document.ready,然后应用此更改。请参阅以下代码段。

&#13;
&#13;
var select = document.getElementById('TfL'), input = document.getElementById("TfLroad");
document.addEventListener("DOMContentLoaded", function(event) { 
  if (select.value === '0') {
    input.disabled = true;
  } else {
    input.disabled = false;
  }
});

select.onchange = function() {
  if (this.value === '0') {
    input.disabled = true;
  } else {
    input.disabled = false;
  }
}
&#13;
<h2 style="text-align:center">Add A 'Dummy' Street</h2>

<p>You can create a Dummy street here, which you will be able to search for in this application. This is to demonstrate how a real Create &amp; Update Process could work for this application, without corrupting the original data. Dummy streets are indicated
  in search results.</p>

<form class="form-horizontal" action="" method="post">
  <fieldset>

    <div class="form-group">

      <div class="col-lg-6">
        <label for="stname" class="control-label">Street Name</label>
        <input class="form-control" id="stname" name="stname" pattern="^\S.{3,98}\S$" title="Sorry, you must type from 5 to 100 characters, and no space at beginning or end." placeholder="Full Street Name" required>
        <!--  required attribute needed because empty string bypasses the pattern regex. -->
        <span class="help-block">NB: No naughty word streets please, these will be deleted by admin!</span>
      </div>

      <!-- CR, CL, PR, 25, 16, 19, BE, KN, SC, TH, WA, WH -->
      <div class="col-lg-3">
        <label for="distr" class="control-label">Postal District</label>
        <select class="form-control" id="distr" name="distr">
              <option>Croydon (CR0, CR2, CR7 or CR9)</option>
              <option>Coulsdon CR5</option>
              <option>Purley CR8</option>
              <option>London SE25</option>
              <option>London SW16</option>
              <option>Kenley CR8</option>
              <option>South Croydon CR2</option>
              <option>Thornton Heath CR7</option>
              <option>Warlingham CR6</option>
              <option>Whyteleafe CR3</option>
              <option>Beckenham BR3</option>
            </select>
        <span class="help-block">NB: Original data uses postal district only, hence problem with several postcodes for Croydon.</span>
      </div>

      <div class="col-lg-3">
        <label for="maint" class="control-label">Who looks after this street?</label>
        <select class="form-control" id="maint" name="maint">
              <option>Croydon Borough</option>
              <option>Transport for London</option>
              <option>Private Road</option>
            </select>
      </div>

    </div>

    <div class="form-group">
      <h4 class="centre">Street Number Limits for this Street Section<br/><small>Please leave as None if all properties in this section have names</small></h4>
    </div>

    <div class="form-group">
      <div class="col-lg-3">
        <label for="onb" class="control-label">Odd Numbers From</label>
        <input class="form-control" id="onb" name="onb" value="None" pattern="^\d*[13579]$|(None)" title="Odd Numbers only please with no spaces, or None">
        <span class="help-block">e.g. '1' or '111'</span>
      </div>

      <div class="col-lg-3">
        <label for="one" class="control-label">Odd Numbers To</label>
        <input class="form-control" id="one" name="one" value="None" pattern="^\d*[13579]$|(None)" title="Odd Numbers only please with no spaces, or None">
        <span class="help-block">e.g. '31' or '217'</span>
      </div>

      <div class="col-lg-3">
        <label for="enb" class="control-label">Even Numbers From</label>
        <input class="form-control" id="enb" name="enb" value="None" pattern="^\d*[02468]$|(None)" title="Even Numbers only please with no spaces, or None">
        <span class="help-block">e.g. '2' or '110'</span>
      </div>

      <div class="col-lg-3">
        <label for="ene" class="control-label">Even Numbers To</label>
        <input class="form-control" id="ene" name="ene" value="None" pattern="^\d*[02468]$|^(None)$" title="Even Numbers only please with no spaces, or None">
        <span class="help-block">e.g. '32' or '216'</span>
      </div>
    </div>

    <div class="form-group">
      <div class="col-lg-4">
        <label for="rdclass" class="control-label">Road Class</label>
        <select class="form-control" id="rdclass" name="rdclass">
              <option>Unclassified</option>
              <option>A Road</option>
              <option>B Road</option>
              <option>C Road</option>
            </select>
        <span class="help-block">Leave as Unclassified if in any doubt.</span>
      </div>

      <div class="col-lg-4">
        <label for="length" class="control-label">Length of this Street Section (whole no. metres)</label>
        <input class="form-control" id="length" name="length" value=0 pattern="^[1-9][0-9]*$" title="Whole number of metres please, no spaces!" required>
      </div>

      <div class="col-lg-4">
        <!-- JS here to put in A B C / disable depending on what selected in rdclass box -->
        <label for="rdnum" class="control-label">Road Number</label>
        <input class="form-control" id="rdnum" name="rdnum" pattern="^[ABC][1-9][0-9]*$|^(None)$" title="Must be None, or A, B or C followed by a whole number for the road class, no spaces!" value="None" required>
        <span class="help-block">Only for A/B/C roads e.g. 'A232', 'C3241'</span>
      </div>
    </div>

    <div class="form-group">
      <div class="col-lg-3">
        <label class="control-label left">Does one end of this street adjoin a TfL maintained street?</label>
        <select class="form-control" id="TfL">
              <option value="0">No</option>
              <option value="1">Yes</option>
            </select>
      </div>

      <div class="col-lg-4">
        <!-- JS not working yet to disable only if no selected in rdclass box -->
        <label class="control-label"><br/>&nbsp;Road Number of Adjoining TfL Road?</label>

        <input class="form-control" pattern="^[ABC][1-9][0-9]*$|^(None)$" title="Must be None, or A, B or C followed by a whole number, no spaces!" value="None" id="TfLroad" required>

        <span class="help-block">E.g. 'A232', 'B2441'</span>
      </div>

    </div>

    <div class="form-group">
      <div class="centre">
        <button type="reset" class="btn btn-default">Reset Form</button>
        <button type="submit" class="btn btn-primary">Create Street</button>
      </div>
    </div>
  </fieldset>
</form>
&#13;
&#13;
&#13;