如何从禁用的<input />元素中获取表单值

时间:2009-02-07 17:58:24

标签: javascript html xhtml

表单的HTML标准似乎是禁用的输入元素不会对表单名称/值集合做出贡献。

有没有办法解决这个问题?我需要能够打开和关闭禁用功能,但仍然可以返回表单提交时的值。

我意识到我可以在提交表单之前使用JavaScript将值复制到隐藏的输入,但我不愿意。有更清洁的方式吗?

我正在使用ASP.NET,而不是那么重要。

10 个答案:

答案 0 :(得分:81)

您应该使用readOnly标志而不是disabled。用户无法编辑只读字段,但仍然使用表单提交。

<input type="text" value="blah" readonly="true"/>

答案 1 :(得分:19)

  

表单的HTML标准似乎是禁用的输入元素不会对表单名称/值集合做出贡献。

这是正确的。

HACK:您可以在提交后使用Javascript:

  1. 取消设置已禁用
  2. 设置只读
  3. 提交!

答案 2 :(得分:9)

如果您将值只读,而不是禁用它,则该字段的名称/值将与其余的非禁用字段一起发送。

使readonly fields的焦点事件处理程序将焦点传递给下一个符合条件的字段,使其更像是一个禁用元素。有些浏览器可以让你集中精力并选择只读字段,有些浏览器甚至可以让你粘贴到只读字段,尽管它们会恢复到原始值onblur和onchange。

<input type="text" value="" readonly="readonly">

答案 3 :(得分:8)

作为Wayne骇客的一个稍微强大的变体(可能会被后退按钮推动混淆),当禁用控件时:设置readonly= trueclassName= 'disabled'而不是disabled= true,然后样式.disabled看起来类似于禁用的字段。

答案 4 :(得分:2)

我发了一个快速(仅限Jquery)插件,在输入被禁用时将值保存在数据字段中。 这只是意味着只要通过jquery使用.prop()或.attr()以编程方式禁用该字段...然后通过.val(),. serialIize()或.serializeArra()访问该值将始终返回即使被禁用也是如此:)

https://github.com/Jezternz/jq-disabled-inputs

答案 5 :(得分:0)

简单只需两步

  1. 检查您要访问的输入是否已禁用,如果它已删除其“已禁用”属性

  2. 获取值,然后再次添加disabled属性。

答案 6 :(得分:0)

我认为这是一个黑客,但似乎对我有用。两个都做!用户看到禁用的输入,显然是幻影,浏览器阻止了交互 - 但它没有提交表单。用户没有看到可能迷失方向的只读字段,但是它随表单一起提交。

<input name="mode_d" size="8" value="mode" disabled>
<input name="mode"            value="mode" hidden readonly>

答案 7 :(得分:0)

您可以轻松地

  1. 将状态更改为正常(disabled = false)
  2. 读取值
  3. 将输入状态重置为禁用

    import xml.etree.ElementTree as ET
    
    xml_str = '''<?xml version="1.0" encoding="UTF-8"?>
    <drugbank xmlns="http://www.drugbank.ca" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.drugbank.ca http://www.drugbank.ca/docs/drugbank.xsd" version="5.1" exported-on="2019-07-02">
        <drug type="biotech" created="2005-06-13" updated="2019-06-04">
            <products>
                <product>
                  <name>Refludan</name>
                  <labeller>Bayer</labeller>
                  <ndc-id/>
                  <ndc-product-code/>
                  <dpd-id>02240996</dpd-id>
                  <ema-product-code/>
                  <ema-ma-number/>
                  <started-marketing-on>2000-01-31</started-marketing-on>
                  <ended-marketing-on>2013-07-26</ended-marketing-on>
                  <dosage-form>Powder, for solution</dosage-form>
                  <strength>50 mg</strength>
                  <route>Intravenous</route>
                  <fda-application-number/>
                  <generic>false</generic>
                  <over-the-counter>false</over-the-counter>
                  <approved>true</approved>
                  <country>Canada</country>
                  <source>DPD</source>
                </product>
            </products>
        </drug>
    </drugbank>
    '''
    root = ET.fromstring(xml_str)
    
    # print(root.findall('{http://www.drugbank.ca}drug'))
    ns = {'drug_bank': 'http://www.drugbank.ca'}
    
    for drug in root.findall('drug_bank:drug', ns):
      for products in drug.findall('drug_bank:products', ns):
        for product in products.findall('drug_bank:product', ns):
          for nametag in product.findall('drug_bank:name', ns):
            print(nametag.text)
    

答案 8 :(得分:-1)

您可以使用Visible=false和/或ReadOnly=true代替Enabled=false吗?

如果您使用的是控件,则不应该设置Enabled=false

答案 9 :(得分:-1)

而不是将字段设置为禁用将readonly属性设置为“readonly”,如下所示。

readonly=readonly

这将在表单提交中发送您的字段值。