【问题标题】:hide and show error with jquery使用 jquery 隐藏和显示错误
【发布时间】:2013-02-22 08:27:53
【问题描述】:

当我选择第一个选项时,我有 3 个选择,其中两个隐藏,一个可见,当您按下一个选项时,另一个选项显示第二个选项。所有这些都在一个表中,并使用 jquery 在 manipulacion.js 文件中创建一个新的行按钮一个计数器,我已将它添加到每个选择的 id 中,而不仅仅是调用。错误是当我创建一个新行而不更改我时,我打开控制台并且不检查任何错误。 在这里,我在 html 中附加了我的代码和。 js可以复制给他们发现我错了。

代码html

<html>
<head>
</head>
<body>
<script type="text/javascript" src="jss/jquery-1.9.0.min.js"></script>
    <script type="text/javascript" src="manipulacion.js"></script>
<script>    
    $(document).ready(function () {
        $("#estado").change(function () {
            if ($("#estado").val() == 2) {
                $("#sino").show();
                $("#sexo").hide();            
            }
            if ($("#estado").val() == 3) {
                $("#sino").hide();
                $("#sexo").show();
            }
            });
            });
    </script>
    <table>
    <tr>
    <td>
    <select id="estado">
    <option value="1">Seleccione 1 opcion</option>
    <option value="2">Laboratorio</option>
    <option value="3">Datos Generales</option>
    </select>
    </td>
    <td>
    <!-- //laboratorio -->
    <select name="sino" id="sino"style="display:none">
    <option value="1">Si </option>
    <option value="2">No</option>
    </select>
    </td>
    <td>
    <!-- //datos generales -->
    <select name="sexo" id="sexo"  style="display:none">
    <option value="1">Masculino </option>
    <option value="2">Femenino</option>
    </select>
    </td>
    <td><input type="button" value="+" class="clsAgregarFila"></td>
    </tr>
    </table>
    </body>
    </html>

代码 manipulacion.js

//manipulacion 
var contLin=1
    $(document).ready(function () {
        $("#estado"+contLin).change(function () {      
            if ($("#estado"+contLin).val() == 2) {
                $("#sino"+contLin).show();
                $("#sexo"+contLin).hide();       
            }
            if ($("#estado"+contLin).val() == 3) {
                $("#sino"+contLin).hide();
                $("#sexo"+contLin).show();
            }
}           );



});


$(document).ready(function(){
    //evento que se dispara al hacer clic en el boton para agregar una nueva fila
    $(document).on('click','.clsAgregarFila',function(){
        //almacenamos en una variable todo el contenido de la nueva fila que deseamos
        //agregar. pueden incluirse id's, nombres y cualquier tag... sigue siendo html

        var strNueva_Fila='<tr>'+
'<td><select id="estado'+contLin+'"><option value="1">Seleccione 1 opcion</option><option value="2">Laboratorio</option><option value="3">Datos Generales</option></select></td>' +
'<td><select name="sino'+contLin+'" id="sino"style="display:none"><option value="1">Si </option><option value="2">No</option></select></td>'+
'<td> <select name="sexo'+contLin+'" id="sexo"  style="display:none"><option value="1">Masculino </option><option value="2">Femenino</option></select><td>'+
'<td><input type="button" value="+" class="clsAgregarFila"><input type="button" value="-" class="clsEliminarFila"></td>'+
'</tr>';

contLin++;

        var objTabla=$(this).parents().get(3);


        $(objTabla).find('tbody').append(strNueva_Fila);


        if(!$(objTabla).find('tbody').is(':visible')){

            $(objTabla).find('caption').click();
        }
    });


    $(document).on('click','.clsEliminarFila',function(){

        var objCuerpo=$(this).parents().get(2);
            if($(objCuerpo).find('tr').length==1){
                if(!confirm('Esta es el única fila de la lista ¿Desea eliminarla?')){
                    return;
                }
            }


        var objFila=$(this).parents().get(1);

            $(objFila).remove();
    });



});

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    由于$("#estado"+contLin).change(function () { 将函数绑定到元素#estado1(因为最初是contLin=1)导致的问题,但是当文档准备好并且该元素#estado1 不存在时执行JavaScript。

    解决此问题的一种快速方法是将更改事件函数移动到$(document).on('click','.clsAgregarFila',function(){ 正文中,以便在追加表格行时将新的更改函数绑定到新的#estadoX。但是,这非常效率低下,我建议使用事件委托,实际上您已经在 .clsAgregarFila.clsEliminarFila 上的点击处理函数中使用了它。

    事件委托通过将处理函数绑定到已经存在的父或祖先DOM元素来工作。然后在该元素上处理该事件并向下委托(通过您指定的 CSS 选择器)到目标元素。

    例如$(document).on('click','.clsAgregarFila',function(){表示当事件直接发生在绑定元素(document)上时不调用处理程序,而只针对匹配选择器(所有带有class="clsAgregarFila"的元素)的后代(内部元素) - 见.on()

    所以您可以只使用以下内容,它使用 CSS 属性选择器来匹配所有 id="estado" 开头的&lt;select&gt; 元素。但是有一个小问题——它不会像这样工作......

    $(document).on('change', 'select[id^=estado]', function () {
        if ($("#estado"+contLin).val() == 2) {
            $("#sino"+contLin).show();
            $("#sexo"+contLin).hide();       
        }
        if ($("#estado"+contLin).val() == 3) {
            $("#sino"+contLin).hide();
            $("#sexo"+contLin).show();
        }
    });
    

    ...因为contLin == 2 因为它是一个全局变量!我们真正想要的是在当前行上找到&lt;select&gt;s。因此,以下修改后的函数应该可以工作,甚至可以更好地替换您的 both 函数,消除代码重复 :-)

     $(document).on('change', 'select[id^=estado]', function () {
          var estadoValue = parseInt(this.value);
          var rowSelects = $(this).closest('tr').find('select').slice(1);
    
          $(rowSelects[0]).toggle(estadoValue === 2);
          $(rowSelects[1]).toggle(estadoValue === 3);
    });
    

    但是,如果进一步采用这种方法,您的代码可以像this demo 一样重写。我已经删除了 HTML 字符串并使用 .clone() 添加了一行,简化了删除一行,链接了事件处理并删除了元素计数器 - 改为替换为类。

    JavaScript

    $(function(){
      var $tbody = $('tbody');
      var strNueva_Fila = $tbody.find('tr:first');
    
      $('tbody').on('change', 'select.estado', function() {
          var estadoValue = parseInt(this.value);
          var rowSelects = $(this).closest('tr').find('select').slice(1);
    
          $(rowSelects[0]).toggle(estadoValue === 2);
          $(rowSelects[1]).toggle(estadoValue === 3);
      }).on('click', 'input', function() {
          if (this.className === 'clsAgregarFila') {
            $tbody.append(strNueva_Fila.clone());
          } else if (this.className === 'clsEliminarFila') {
            $(this).closest('tr').remove();
          }
    
          buttonsToggle();
      });
    
      function buttonsToggle() {
        var $addButtons = $tbody.find('.clsAgregarFila');
        var $removeButtons = $tbody.find('.clsEliminarFila');
    
        // hide all
        $addButtons.hide();
        $removeButtons.hide();
    
        // show "-" button on all but first row
        $removeButtons.slice(0).show();
    
        // but hide "-" if there is only 1 row
        if ($removeButtons.length === 1) {
          $removeButtons.hide();
        }
    
        // show "+" button on last row only
        $addButtons.slice(-1).show();
      }
    });
    

    HTML(注意:我添加了“-”&lt;input&gt;&lt;thead&gt;&lt;tbody&gt; 元素)。

    <table>
      <thead></thead>
      <tbody>
          <tr>
          <td>
          <select id="estado" class="estado">
          <option value="1">Seleccione 1 opcion</option>
          <option value="2">Laboratorio</option>
          <option value="3">Datos Generales</option>
          </select>
          </td>
          <td>
          <!-- //laboratorio -->
          <select name="sino" class="sino" id="sino" style="display:none">
          <option value="1">Si </option>
          <option value="2">No</option>
          </select>
          </td>
          <td>
          <!-- //datos generales -->
          <select name="sexo" id="sexo" class="sexo" style="display:none">
          <option value="1">Masculino </option>
          <option value="2">Femenino</option>
          </select>
          </td>
          <td><input type="button" value="+" class="clsAgregarFila"/><input type="button" value="-" class="clsEliminarFila" style="display:none"/></td>
          </tr>
      </tbody>
    

    希望这会有所帮助:-)

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2017-10-18
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多