我有两页HTML表单。第一页有一个提交表单,第二页有一个确认表单。第一个表单提供了许多控件的选择,而第二个页面再次显示来自提交表单的数据,并显示确认消息。在第二种形式中,所有字段必须是静态的。
从我所看到的,一些表单控件可以是只读的,所有控件都可以被禁用,区别在于你仍然可以选择一个只读字段。
而不是按字段做这个是否有任何方法标记整个表单为只读/禁用/静态,这样用户就不能改变任何控件?
我有两页HTML表单。第一页有一个提交表单,第二页有一个确认表单。第一个表单提供了许多控件的选择,而第二个页面再次显示来自提交表单的数据,并显示确认消息。在第二种形式中,所有字段必须是静态的。
从我所看到的,一些表单控件可以是只读的,所有控件都可以被禁用,区别在于你仍然可以选择一个只读字段。
而不是按字段做这个是否有任何方法标记整个表单为只读/禁用/静态,这样用户就不能改变任何控件?
当前回答
没有完全兼容的、官方的HTML方法来做到这一点,但一点javascript就可以大有帮助。 您将遇到的另一个问题是,禁用的字段不会显示在POST数据中
其他回答
没有完全兼容的、官方的HTML方法来做到这一点,但一点javascript就可以大有帮助。 您将遇到的另一个问题是,禁用的字段不会显示在POST数据中
没有内置的方法,我知道这样做,所以你需要提出一个自定义解决方案,取决于你的表单有多复杂。你应该读读这篇文章:
将HTML表单转换为只读(更新:损坏的文章链接,存档链接)
EDIT: Based on your update, why are you so worried about having it read-only? You can do it via client-side but if not you will have to add the required tag to each control or convert the data and display it as raw text with no controls. If you are trying to make it read-only so that the next post will be unmodified then you have a problem because anyone can mess with the post to produce whatever they want so when you do in fact finally receive the data you better be checking it again to make sure it is valid.
一个简单的需求:用最少的代码显示不可编辑的表单(以后可以变成可编辑的表单)。
如果你不能使用'disabled'属性(因为它在POST时擦除值的输入),并注意到html属性'readonly'只适用于textarea和一些输入(文本,密码,搜索,据我所见),最后,如果你不想麻烦复制所有的选择,复选框和无线电与隐藏的输入逻辑, 你可能会发现下面的函数或他的任何内部逻辑符合你的喜好:
addReadOnlyToFormElements = function (idElement) { // textarea an input of type (text password search) work with the html readonly $('#' + idElement + ' textarea, #' + idElement + ' input').prop('readonly',true); // but you still have to destroy their associated objects, as I.E, datepicker (in our old project, datepicker is appended to input where 'Date' is in name attribut, don't ask why) $('#' + idElement + ' input[name*="Date"]').datepicker('destroy'); // html readonly don't work on input of type checkbox and radio, neither on select. So, a safe trick is to disable the non-selected items $('#' + idElement + ' input[type="checkbox"]:not(:checked), #' + idElement + ' input[type="radio"]:not(:checked)').prop('disabled',true); $('#' + idElement + ' select>option:not([selected])').prop('disabled',true); // and, on the selected ones, to disable mouse/keyoard events and mimic readOnly appearance $('#' + idElement + ' input[type="checkbox"]:checked').prop('tabindex','-1').css('pointer-events','none').css('opacity','0.5'); $('#' + idElement + ' input[type="radio"]:checked').css('opacity','0.5'); $('#' + idElement + ' select').css('background-color','#eee'); } <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
没有什么比删除这些只读更容易的了
removeReadOnlyFromFormElements = function (idElement) { // just remove the html readonly on textarea and input $('#' + idElement + ' textarea, #' + idElement + ' input').prop('readonly',false); // and restore their Objects, as I.E, datepicker $('#' + idElement + ' input[name*="Date"]').datepicker(); // Remove the disabled attribut on non-selected $('#' + idElement + ' input[type="checkbox"]:not(:checked), #' + idElement + ' input[type="radio"]:not(:checked)').prop('disabled',false); $('#' + idElement + ' select>option:not([selected])').prop('disabled',false); // Restore mouse/keyboard events and remove readOnly appearance on selected ones $('#' + idElement + ' input[type="checkbox"]:checked').prop('tabindex','').css('pointer-events','').css('opacity',''); $('#' + idElement + ' input[type="radio"]:checked').css('opacity',''); $('#' + idElement + ' select').css('background-color',''); } <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
所有浏览器都支持的另一种简单方式是:
HTML:
<form class="disabled">
<input type="text" name="name" />
<input type="radio" name="gender" value="male">
<input type="radio" name="gender" value="female">
<input type="checkbox" name="vegetarian">
</form>
CSS:
.disabled {
pointer-events: none;
opacity: .4;
}
但是请注意,这种方法下的标签仍然有效,用户仍然可以操作带有焦点的元素。
你可以使用这个函数禁用表单:
function disableForm(formID){
$('#' + formID).children(':input').attr('disabled', 'disabled');
}
点击这里查看工作演示
注意,它使用jQuery。