<select>输入上的Jquery .on(更改)事件仅更改第一行。

时间:2016-01-12 14:21:10

标签: javascript php jquery html mysql

我有一张桌子,人们可以添加行。 表中有一个选择输入,当更改时,通过ajax更改第二个选择字段中的值。 我遇到的问题是,如果一个人在表中添加了一行,则.on(change)事件会改变第一行中的第二个字段,而不是后续行。 我一直绞尽脑汁,试图弄清楚我是否需​​要(如果是这样的话)动态改变事件所绑定的div id及其影响的div。这是解决方案吗?如果是这样,有人可以证明我是如何实现这一目标的吗? HTML表单是 &lt; form action =&#34; assets.php&#34;方法=&#34;后&#34;&GT; &lt; button type =&#34; button&#34; id =&#34;添加&#34;&gt;添加行&lt; / button&gt; &lt; button type =&#34; button&#34; id =&#34;删除&#34;&gt;删除行&lt; / button&gt; &lt; table id =&#34; myassettable&#34;&gt; &LT; TBODY&GT;     &LT; TR&GT;         &lt; th&gt;资产类型&lt; / th&gt;     &LT的第i;制造商及LT; /第&GT;     &lt; th&gt; Serial#&lt; / th&gt;     &lt; th&gt; MAC地址&lt; / th&gt;     &LT的第i;说明与LT; /第&GT;     &LT的第i;网站&LT; /第&GT;     &LT的第i;位置和LT; /第&GT; &LT; / TR&GT; &lt; tr class =&#34;可移除&#34;&gt;     &lt;! - &lt; td&gt;&lt; input type =&#34; text&#34;占位符=&#34;名字&#34;名称=&#34;接触[0] [contact_first]&#34;&GT;&LT; / TD&GT;     &lt; td&gt;&lt; input type =&#34; text&#34;占位符=&#34;姓&#34;名称=&#34;接触[0] [contact_surname]&#34;&GT;&LT; / TD&GT; - &GT;     &lt; td&gt;&lt; select name =&#34; asset [0] [type]&#34;&gt;     &lt; option&gt;&lt;?php echo $ typeoption?&gt;&lt; / option&gt;     &LT; /选择&GT;&LT; / TD&GT;     &lt; td&gt;&lt; select class =&#34; manuf_name&#34;名称=&#34;资产[0] [制造商]&#34;&GT;     &lt; option&gt;&lt;?php echo $ manufoption?&gt;&lt; / option&gt;     &LT; /选择&GT;&LT; / TD&GT;     &lt; td&gt;&lt; input type =&#34; text&#34;占位符=&#34;序列号#&#34;名称=&#34;资产[0] [SERIAL_NUM]&#34;&GT;&LT; / TD&GT;     &lt; td&gt;&lt; input type =&#34; text&#34;占位符=&#34; Mac地址&#34;名称=&#34;资产[0] [MAC_ADDRESS]&#34;&GT;&LT; / TD&GT;     &lt; td&gt;&lt; input type =&#34; text&#34;占位符=&#34;名称或描述&#34;名称=&#34;资产[0] [描述]&#34;&GT;&LT; / TD&GT;     &lt; td&gt;&lt; select id =&#34; site&#34;名称=&#34;资产[0] [站点]&#34;&GT;     &lt; option&gt;&lt;?php echo $ siteoption?&gt;&lt; / option&gt;     &LT; /选择&GT;&LT; / TD&GT;     &lt; td&gt;&lt; input type =&#34; text&#34;占位符=&#34;例如Level 3 Utility Room&#34;名称=&#34;资产[0] [位置]&#34;&GT;&LT; / TD&GT;     &lt; td&gt;&lt; select id =&#34; new_select&#34;名称=&#34;资产[0] [接触]&#34;&GT;&LT; /选择&GT;&LT; / TD&GT;     &lt;! - &lt; td&gt;&lt; input type =&#34; email&#34;占位符=&#34;电子邮件&#34;名称=&#34;接触[0] [电子邮件]&#34;&GT;&LT; / TD&GT;     &lt; td&gt;&lt; input type =&#34; phone&#34;占位符=&#34;电话号码&#34;名称=&#34;接触[0] [电话]&#34;&GT;&LT; / TD&GT;     &lt; td&gt;&lt; input type =&#34; text&#34;占位符=&#34;扩展&#34;名称=&#34;接触[0] [延伸]&#34;&GT;&LT; / TD&GT;     &lt; td&gt;&lt; input type =&#34; phone&#34;占位符=&#34;移动&#34;名称=&#34;接触[0] [移动]&#34;&GT;&LT; / TD&GT; - &GT; &LT; / TR&GT; &LT; / tbody的&GT; &LT; /表&gt; &lt;输入类型=&#34;提交&#34;值=&#34;提交&#34;&GT; &lt; input type =&#34; hidden&#34;名称=&#34;提交&#34;值=&#34; TRUE&#34; /&GT; &LT; /形式&GT; 我的脚本是 &lt; script type =&#34; text / javascript&#34;&gt; $(document).ready(function(){     $(&#34; #add&#34;)。click(function(){         var newgroup = $(&#39; #myassettable tbody&gt; tr:last&#39;);      新闻组         .clone(真)         .find(&#34;输入&#34)。VAL(&#34;&#34)。()结束      .insertAfter(&#39; #myassettable tbody&gt; tr:last&#39;)      .find(&#39;:输入&#39;)         。每个(函数(){             this.name = this.name.replace(/ \ [(\ d +)\] /,             function(str,p1){             返回&#39; [&#39; +(parseInt(p1,10)+1)+&#39;]&#39;             })      })             返回false;       });     });     $(document).ready(function(){     $(&#34; #delete&#34;)。click(function(){         var $ last = $(&#39; #myassettable tbody&#39;)。find(&#39; tr:last&#39;)         if($ last.is(&#39;:nth-​​child(2)&#39;)){             提醒(&#39;这是唯一一个&#39;)         } else {      $ last.remove()     }  });  }); $(document).ready(function(){ $(&#34;#myassettable&#34;)。on(&#34;更改&#34;,&#34; #site&#34;,function(event){     $ .ajax({         输入:&#39; post&#39;,         url:&#39; assetprocess.php&#39;,         数据:{         get_option:$(this).val()         },         成功:功能(响应){     的document.getElementById(&#34; new_select&#34)的innerHTML =响应。 }             })         });     }); &LT; /脚本&GT; 而assetprocess.php页面是 &LT; PHP if(isset($ _ POST [&#39; get_option&#39;])){ //获取网站联系人 $ site = $ _POST [&#39; get_option&#39;]; $ contact =&#34; SELECT site_id,contact_id,AES_DECRYPT(contact_first,&#39;&#34;。$ kresult。&#34;&#39;),AES_DECRYPT(contact_surname,&#39;&#34; 。$ kresult。&#34;&#39;)FROM联系WHERE site_id =&#39; $ site&#39; ORDER BY contact_surname ASC&#34 ;; $ contactq = mysqli_query($ dbc,$ contact)或trigger_error(&#34;查询:$ contact \ n&lt; br /&gt; MySQL错误:&#34; .mysqli_errno($ dbc)); if($ contactq){ // $ contactoption =&#39;&#39 ;; echo&#39;&lt; option&gt;选择联系人(可选)&lt; / option&gt;&#39 ;; while($ contactrow = mysqli_fetch_assoc($ contactq)){     $ contactid = $ contactrow [&#39; contact_id&#39;];     $ contactfirst = $ contactrow [&#34; AES_DECRYPT(contact_first,&#39;&#34;。$ kresult。&#34;&#39;)&#34;];     $ contactsurname = $ contactrow [&#34; AES_DECRYPT(contact_surname,&#39;&#34;。$ kresult。&#34;&#39;)&#34;]; $ contactoption。=&#39;&lt; option value =&#34;&#39;。$ contactid。&#39;&#34;&gt;&#39;。$ contactsurname。&#39;,&# 39; $ contactfirst&#39;&LT; /选项&GT;&#39 ;; echo $ contactoption; } } 出口; } ?&GT; 代码作为罪恶是丑陋的,但这只是现阶段的自利项目。 任何帮助将不胜感激。 干杯, J.

1 个答案:

答案 0 :(得分:0)

工作示例:https://jsfiddle.net/Twisty/1c98Ladh/3/

一些小的HTML更改:

<form action="assets.php" method="post">
  <button type="button" id="add">Add Row</button>
  <button type="button" id="delete">Remove Row</button>
  <table id="myassettable">
    <tbody>
      <tr>
        <th>Asset Type</th>
        <th>Manufacturer</th>
        <th>Serial #</th>
        <th>MAC Address</th>
        <th>Description</th>
        <th>Site</th>
        <th>Location</th>
      </tr>
      <tr class="removable">
        <td>
          <select name="asset[0][type]">
            <option>---</option>
            <option>Type Option</option>
          </select>
        </td>
        <td>
          <select class="manuf_name" name="asset[0][manuf]">
            <option>---</option>
            <option>
              Manuf Option
            </option>
          </select>
        </td>
        <td>
          <input type="text" placeholder="Serial #" name="asset[0][serial_num]">
        </td>
        <td>
          <input type="text" placeholder="Mac Address" name="asset[0][mac_address]">
        </td>
        <td>
          <input type="text" placeholder="Name or Description" name="asset[0][description]">
        </td>
        <td>
          <select id="site-0" class="chooseSite" name="asset[0][site]">
            <option>---</option>
            <option>
              Site Option
            </option>
          </select>
        </td>
        <td>
          <input type="text" placeholder="e.g Level 3 Utility Room" name="asset[0][location]">
        </td>
        <td>
          <select id="new-site-0" name="asset[0][contact]">
          </select>
        </td>
      </tr>
    </tbody>
  </table>
  <input type="submit" value="Submit">
  <input type="hidden" name="submitted" value="TRUE" />
</form>

这使我们在添加新元素时准备增加id。利用class,我们可以将.change()绑定到每个{。}}。

$(document).ready(function() {
  $("#add").click(function() {
    var newgroup = $('#myassettable tbody>tr:last');
    newgroup
      .clone(true)
      .find("input").val("").end()
      .insertAfter('#myassettable tbody>tr:last')
      .find(':input')
      .each(function() {
        this.name = this.name.replace(/\[(\d+)\]/,
          function(str, p1) {
            return '[' + (parseInt(p1, 10) + 1) + ']';
          });
      });
    var lastId = parseInt(newgroup.find(".chooseSite").attr("id").substring(5), 10);
    newId = lastId + 1;
    $("#myassettable tbody>tr:last .chooseSite").attr("id", "site-" + newId);
    $("#myassettable tbody>tr:last select[id='new-site-" + lastId + "']").attr("id", "new-site-" + newId);
    return false;
  });

  $("#delete").click(function() {
    var $last = $('#myassettable tbody').find('tr:last');
    if ($last.is(':nth-child(2)')) {
      alert('This is the only one');
    } else {
      $last.remove();
    }
  });

  $(".chooseSite").change(function(event) {
    console.log($(this).attr("id") + " changed to " + $(this).val());
    var target = "new-" + $(this).attr('id');
    /*$.ajax({
      type: 'post',
      url: 'assetprocess.php',
      data: {
        get_option: $(this).val()
      },
      success: function(response) {
        $("#" + target).html(response);
      }
      });*/
    var response = "<option>New</option>";
    $("#" + target).html(response);
  });
});

可以通过在全局空间中为行数设置计数器来节省一些时间,例如var trCount = 1;,并使用它来设置数组索引和ID。克隆是快速而简单的,但它也意味着我们必须返回并附加各种属性。还可以创建一个为您绘制HTML的功能。喜欢:https://jsfiddle.net/Twisty/1c98Ladh/10/

function cloneRow(n) {
  if (n - 1 < 0) return false;
  var html = "";
  html += "<tr class='removable' data-row=" + n + ">";
  html += "<td><select name='asset[" + n + "][type]' id='type-" + n + "'>";
  html += $("#type-" + (n - 1)).html();
  html += "<select></td>";
  html += "<td><select name='asset[" + n + "][manuf]' id='manuf-" + n + "'>";
  html += $("#manuf-" + (n - 1)).html();
  html += "<select></td>";
  html += "<td><input type='text' placeholder='Serial #' name='asset[" + n + "][serial_num]' id='serial-" + n + "' /></td>";
  html += "<td><input type='text' placeholder='MAC Address' name='asset[" + n + "][mac_address]' id='mac-" + n + "' /></td>";
  html += "<td><input type='text' placeholder='Name or Desc.' name='asset[" + n + "][description]' id='desc-" + n + "' /></td>";
  html += "<td><select name='asset[" + n + "][site]' class='chooseSite' id='site-" + n + "'>";
  html += $("#site-" + (n - 1)).html();
  html += "<select></td>";
  html += "<td><input type='text' placeholder='E.G. Level 3 Utility Room' name='asset[" + n + "][location]' id='loc-" + n + "' /></td>";
  html += "<td><select name='asset[" + n + "][contact]' id='contact-" + n + "'><select></td>";
  html += "</tr>";
  return html;
}

预先更多的工作,但每个部分提供更多的控制。以后更容易使用。