开发者问题收集

如果自动选中,复选框对象为空

2021-06-04
507

今天,当涉及到 html 复选框时,我发现了一个非常奇怪的错误(对我来说)。 因此,我有一个表格列表,列表末尾有一个复选框,还有一个脚本,用于读取每个选中复选框的整行。它工作正常,但我决定添加“全选”功能,这时事情就变得奇怪了。当我使用全选时,我收到一个错误,我的对象为空。

这是我用于全选的代码:

c.transacoes = function() {


        $('input[type=checkbox]:checked').each(function() {

            var row = $(this).parent().parent();
            var rowcells = row.find('td');
            var chkdTransac = [];
            var obj = (g_form.getValue('u_transactions').length != 0) ? JSON.parse(g_form.getValue('u_transactions')) : [];;
            var i;
            for (i = 0; i < 5; i++) {
                chkdTransac[i] = rowcells[i].innerText;
            }
            
            obj.push({
                descricao_transacao: chkdTransac[1],
                valor_transacao: chkdTransac[2].replace(/-/g, ''),
                data: chkdTransac[3],
                ref_essence: chkdTransac[4],
                narrative: chkdTransac[5]
            });

            g_form.setValue('u_transactions', JSON.stringify(obj));
            c.modalInstance.close();

        });


    };

    toggle = function(source) {
        checkboxes = document.getElementsByName('cb1');
        for (var i = 0, n = checkboxes.length; i < n; i++) {
            checkboxes[i].checked = source.checked;
        }
    };
<div class="panel panel-default">
  <div class="panel-heading">
    <h4 class="panel-title">${Transactions}
     <button type="button" class="close" data-dismiss="modal" aria-label="Close" ng-click="c.closeModal()"> <span aria-hidden="true">&times;</span>
      </button></h4>
  </div>
 
  <div paging page="1" page-size="10" total="1000">
 
  <table id="table1" class="table table-bordered table-striped">
    <thead>
      <tr>
       <th>${Select}<input type="checkbox" onClick="toggle(this)" /></th>
       <th>${description}</th>
       <th>${Amount}</th>
       <th>${date}</th>
       <th>${reference}</th>
       <th>${Narrative}</th>
        <!--<th>${Select All}<input type="checkbox" onClick="toggle(this)" /></th> -->
        
      </tr>
    </thead>
    <tbody>
      <tr ng-repeat="transac in c.transactions">
        <td><input type="checkbox" name="cb1"></td>
        <td>{{transac.transaction.description}}</td>
        <td>{{transac.transaction.amount}}</td>
        <td>{{transac.transaction.date}}</td>
        <td>{{transac.transaction.reference}}</td>
        <td>{{transac.transaction.narrative}}</td>
      </tr>
    </tbody>
  </table>
     </div>

 <div class="panel-body">
    <div class="col-sm-4"></div>
    <div class="col-sm-4" style="align-items:center;">
      <div style="margin-bottom: 8px;">
      </div>
      <div>
        <button type="button" class="btn btn-primary btn-block" ng-click="c.transacoes()">${Use selected transactions}</button>
      </div>
    </div>
    <div class="col-sm-4"></div>
  </div>
</div>

这里的想法是,一个带有列表的表格是使用复选框动态生成的,我稍后会验证它是否被选中,并使用信息填充多行变量集(在 ServiceNow 中)。 如果我手动选择框,代码可以完美运行,但如果我使用全选,则会出现以下错误消息:

“TypeError:无法读取未定义的属性‘innerText’”

你们知道为什么会发生这种情况以及如何解决这个问题吗?

提前致谢。

2个回答

我假设您的意思是创建多个复选框并添加一个可以一次选中所有复选框的功能。 如果我的假设是正确的,您将需要创建更多复选框并按如下方式修改您的函数:

function toggle(source) {
  // store all the checkboxes that named 'cb1[]' in an array
  var checkboxes = document.getElementsByName('cb1[]');;
  for (var i = 0; i < checkboxes.length; i++) {
    if (checkboxes[i] != source)
      // set true to the checked property of the rest of the checkboxes 
      checkboxes[i].checked = source.checked;
  }
}
<input type="checkbox" on onclick="toggle(this);" />Select all!<br />
<input type="checkbox" name='cb1[]' />checkbox 1<br />
<input type="checkbox" name='cb1[]' />checkbox 2<br />
<input type="checkbox" name='cb1[]' />checkbox 3<br />
<input type="checkbox" name='cb1[]' />checkbox 4<br />

请记住“在名称末尾附加方括号,以便服务器端代码将选中的复选框视为数组。否则,提交时只有组中的最后一个选中项可用”(来源: dyn-web.com )。

原始代码来自以下响应,其中使用 querySelectorAll 而不是 getElementsByName 如何在 HTML 中实现“全选”复选框?

Mari Goto
2021-06-04

好的,我发现当我使用“全选”复选框时,行前面会出现一些“垃圾”,因此我在 c.transacoes 函数中做了一些小改动,忽略了那些未定义的垃圾,现在它可以正常工作了。

这是最终的函数:

c.transacoes = function() {

        $('input[type=checkbox]:checked').each(function() {

            var row = $(this).parent().parent();
            var rowcells = row.find('td');
            var chkdTransac = [];
            var obj = (g_form.getValue('u_transactions').length != 0) ? JSON.parse(g_form.getValue('u_transactions')) : [];;
            var i;
            for (i = 0; i < 6; i++) {

                if (rowcells[i] == undefined) {
                    return;
                } else {
                    chkdTransac[i] = rowcells[i].innerText;
                }

            }

            var date = chkdTransac[3].split("T");

            obj.push({
                descricao_transacao: chkdTransac[1],
                valor_transacao: chkdTransac[2].replace(/-/g, ''),
                data: date[0],
                ref_essence: chkdTransac[4],
                narrative: chkdTransac[5]
            });

            g_form.setValue('u_transactions', JSON.stringify(obj));
            c.modalInstance.close();

        });

    };
Frank Silveira
2021-06-22