ChatGPT解决这个技术问题 Extra ChatGPT

HTML 表单只读 SELECT 标记/输入

根据 HTML 规范,HTML 中的 select 标记没有 readonly 属性,只有 disabled 属性。因此,如果您想阻止用户更改下拉菜单,您必须使用 disabled

唯一的问题是禁用的 HTML 表单输入不会包含在 POST / GET 数据中。

模拟 select 标记的 readonly 属性并仍获取 POST 数据的最佳方法是什么?

不要依赖于服务器端。任何人都可以创建自己的 HTML 页面并将其设为 RW。
但这不是特定于 PHP 的问题。
在这种情况下,我建议根本不要使用 select 元素。有什么理由不能将值显示为纯文本?
@ppumkin 你的评论毫无意义。我并不是说选择或隐藏表单字段从来没有一个好的用例。 OP 在页面上显示一些文本时遇到问题,我只是想知道在这种情况下使用 select 元素的目的是什么。
我一定是读错了问题。他说他想禁用选择,这样用户就不会改变它。也许他需要使用选择来呈现页面并使用 jquery 来防止更改。但是当他提交回来时,没有任何数据。我也在做同样的事情。我需要显示由其他选择过滤的选择,最后一个下拉菜单通过 ajax 保存到数据库,因此必须锁定所有之前的下拉菜单。当我重新渲染页面时,是的,好的——我可以显示标签而不是选择。但这不是问题:)

b
bezmax

您应该保留 select 元素 disabled,但还要添加另一个具有相同名称和值的隐藏 input

如果重新启用 SELECT,则应将其值复制到 onchange 事件中的隐藏输入并禁用(或删除)隐藏输入。

这是一个演示:

$('#mainform').submit(function() { $('#formdata_container').show(); $('#formdata').html($(this).serialize()); return false; } ); $('#enableselect').click(function() { $('#mainform input[name=animal]') .attr("disabled", true); $('#animal-select') .attr(' disabled', false) .attr('name', 'animal'); $('#enableselect').hide(); return false; }); #formdata_container { 填充:10px; }


如果您重新启用选择,您当然还必须禁用或删除隐藏的输入(在复制它的值之后)。否则,您将获得双倍提交的值
@max啊!。好的,这也有效。自从你说隐藏输入应该与选择具有名称的“相同名称”以来,我一直假设。
如果我使用多选怎么办?
拥有两个具有相同名称的元素只会回发最后启用的输入/选择,而不是双重的。此外,只有 selected 值被回发,而不是整个列表。因此,您的 hidden 位于您的 select 之前并保存所选值。如果选择被禁用为“只读”,则回发将仅包含隐藏输入的值。如果启用了选择,则可见的选定选项将“覆盖/替换”隐藏的值,这就是将被回发的值。
虽然这是显而易见的解决方案,但它作为一个解决方案很糟糕,因为您必须添加另一个输入字段。
G
Gleb Kemarsky

我们还可以禁用除选定选项之外的所有选项。

这样下拉菜单仍然有效(并提交其值),但用户无法选择另一个值。

Demo


不错的动态选项
非常适合单值 SELECT 标签!但不适用于

javascript的:

selectElement.addEventListener("焦点", selectElement.blur, true); selectElement.attachEvent("焦点", selectElement.blur); //谢谢,IE

去除:

selectElement.removeEventListener("焦点", selectElement.blur, true); selectElement.detachEvent("焦点", selectElement.blur); //谢谢,IE

编辑:添加删除方法


@ButtleButkus javascript 的工作吗?我想这可能是与浏览器相关的问题。您是否尝试向元素添加 tabindex
HTML 解决方案不适用于今天的 Chrome。 :-(
M
Mario S

在 IE 中,我能够通过双击来击败 onfocus=>onblur 方法。但是记住这个值然后在 onchange 事件中恢复它似乎可以解决这个问题。

<select onfocus="this.oldvalue=this.value;this.blur();" onchange="this.value=this.oldvalue;">
....
</select>

您可以使用 javascript 变量在没有扩展属性的情况下执行类似操作。


W
Wendell Carvalho

简单地说,在提交表单之前删除 disabled 属性。

    $('form').submit(function () {
        $("#Id_Unidade").attr("disabled", false);
    });

A
Ataur Rahman Munna
<select id="case_reason" name="case_reason" disabled="disabled">

disabled="disabled" ->将从数据库中获取您的值并在表单中显示。 readonly="readonly" ->您可以在选择框中更改您的值,但您的值无法保存在您的数据库中。


错了,保存了。看起来并非所有浏览器都处理“只读”属性,因此不可靠。