将表单输入更改为在元素复制时只读

Changing form input to read only when elements reproduced

本文关键字:元素 复制 只读 表单 输入      更新时间:2023-09-26

所以我在jQuery方面一无所知,只是继承了别人的代码。任何帮助将不胜感激。

我有一个表单,该表单在将学生添加到表单时从查询填充。他们可以将任意数量的学生添加到表单中。下面是 html:

<table style="width:100%">
            <tr>
                <td colspan="2">
                    <label class="control-label" >Name</label>
                    <input type="text" name="name[]" value="" class="required" style="width: 290px">
                </td>
                <td colspan="2">
                    <label class="control-label" >Email</label>
                    <input type="text" name="email[]" value="" class="required">
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <label class="control-label" >Address</label>
                    <input type="text" name="address1[]" value="" class="required" style="width: 290px">
                </td>
                <td colspan="2">
                    <label class="control-label" >Address 2 <small>(optional)</small></label>
                    <input type="text" name="address2[]" value="">
                </td>
            </tr>
            <tr>
                <td colspan="1">
                    <label class="control-label" >City</label>
                    <input type="text" name="city[]" value="" style="width:120px;" class="required">
                </td>
                <td>
                    <label class="control-label" >State/Providence</label>
                    <input type="text" name="st_prov[]" value="" style="width:120px;" class="required">
                </td>
                <td>
                    <label class="control-label" >Postal Code</label>
                    <input type="text" name="zip_pc[]" value="" style="width:60px;" class="required">
                </td>
                <td>
                    <label class="control-label" >Country</label>
                    <input type="text" name="country[]" value="" class="required">
                </td>
            </tr>
            <tr><td colspan="4">&nbsp;</td></tr>
        </table>

这是我一直在尝试修改的jQuery函数:

jQuery(function($){
    var addStudent = function(data){
        var studentEl = $($('.student').get(0)).clone()
        studentEl.find('input').each(function(){
            var field = $(this).attr('name').replace('[]','')
            if ($(this).attr("name").val == 'name'){
                $(this).prop("readonly", true);
            }
            $(this).val(data[field] || '')
        })
        if(data.client_no!=''){
            studentEl.find('.will_update').text("Will update student information for "+data.name+'')
        }
        $($('.student').last()).after(studentEl)
    }
})

该函数为数据库填充的每个学生创建一组附加字段,以便表单处理。

我希望将"name"的特定字段修改为只读(可以查看但不能修改但仍提交)。我已经尝试了许多其他迭代,但无法在 if 子句中获取字段名称以仅将该字段设置为只读。

提供的任何帮助都会很棒。

通过 jQuery 获取属性的正确方法只是$(this).attr("name")

也不要使用:

var field = $(this).attr('name').replace('[]','')
            if ($(this).attr("name").val == 'name'){
                $(this).prop("readonly", true);
            }

使用已创建的变量field

var field = $(this).attr('name').replace('[]','')
            if (field  == 'name'){
                $(this).prop("readonly", true);
            }

请参阅下面的片段:

jQuery(function($) {
  var addStudent = function(data) {
    var studentEl = $($('.student').get(0)).clone()
    studentEl.find('input').each(function() {
      var field = $(this).attr('name').replace('[]', '')
      if (field == 'name') {
        $(this).prop("readonly", true);
      }
      $(this).val(data[field] || '')
    })
    if (data.client_no != '') {
      studentEl.find('.will_update').text("Will update student information for " + data.name + '')
    }
    $($('.student').last()).after(studentEl)
  }
  $('button').click(function() {
    addStudent({
      client_no: 1,
      name: "Ralph John "
    })
  });
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table style="width:100%" class="student">
  <tr>
    <td colspan="2">
      <label class="control-label">Name</label>
      <input type="text" name="name[]" value="" class="required" style="width: 290px">
    </td>
    <td colspan="2">
      <label class="control-label">Email</label>
      <input type="text" name="email[]" value="" class="required">
    </td>
  </tr>
  <tr>
    <td colspan="2">
      <label class="control-label">Address</label>
      <input type="text" name="address1[]" value="" class="required" style="width: 290px">
    </td>
    <td colspan="2">
      <label class="control-label">Address 2 <small>(optional)</small>
      </label>
      <input type="text" name="address2[]" value="">
    </td>
  </tr>
  <tr>
    <td colspan="1">
      <label class="control-label">City</label>
      <input type="text" name="city[]" value="" style="width:120px;" class="required">
    </td>
    <td>
      <label class="control-label">State/Providence</label>
      <input type="text" name="st_prov[]" value="" style="width:120px;" class="required">
    </td>
    <td>
      <label class="control-label">Postal Code</label>
      <input type="text" name="zip_pc[]" value="" style="width:60px;" class="required">
    </td>
    <td>
      <label class="control-label">Country</label>
      <input type="text" name="country[]" value="" class="required">
    </td>
  </tr>
  <tr>
    <td colspan="4">&nbsp;</td>
  </tr>
</table>
<button>Add Student</button>

代码中的几个问题。

使用$('student').eq(0)而不是$($('.student').get(0))

你从jquery对象获取dom元素,并将其重新包装到jquery对象中。eq(index)函数返回一个 jquery 包装的元素。

您正在尝试从返回字符串的 attr("name") 获取 val 属性。你会得到未定义。

if ($(this).attr("name").val == 'name'){
   $(this).prop("readonly", true);
}

如果您尝试查找 name 属性的存在,只需执行

if ($(this).attr("name")){
   $(this).prop("readonly", true);
}

最后,你不需要用jquery对象重新包装jquery对象。

$($('.student').last())

Jquery 函数返回 jquery 对象,这意味着您可以链接调用,并且不需要重新包装它。

$('.student').last()

您可以按如下方式修改代码。假设你的表有类student这里有一个工作演示 - 小提琴。

$(function(){
    var addStudent = function(data){
        var studentEl = $('.student tr:first').clone();
        studentEl.find('input').each(function(){
            var field = $(this).attr('name').replace('[]','');
            if (field === 'name'){
                $(this).prop("readonly", true);
            }
            $(this).val(data[field] || '')
        })
        if(data.client_no !== ''){
            studentEl.find('.will_update').text("Will update student information for "+data.name+'')
        }
        $('.student').last().after(studentEl)
    }
});