【问题标题】:Display All Table Rows that are Checked显示所有选中的表格行
【发布时间】:2017-11-10 07:44:25
【问题描述】:

我有一个多列表,其中一列是复选框。如果您选中一个复选框,然后按“结帐”按钮,它将获取指定的行并将它们显示在电子邮件的正文中。

我最初引入前 100 行是为了为用户保留信息灯。我还有一个搜索功能,用户可以搜索特定的行。虽然您可以在不同的搜索中进行操作,并且仍然使用会话存储检查所有复选框,但当您点击“结帐”时,它只会显示已选中且当前在页面上可见的表格行。因此,如果我搜索了一个表格行并检查了它,然后通过单击主页返回到原来的前 100 行,那么该行将不会显示在电子邮件中。

如何解决这个问题并显示所有已检查的行,无论它们在页面上是否可见?

HTML:

<section id="checkout-btn"> 
<button id="checkout" name="order" onclick="sendMail(); return false">Checkout</button>
</section>

<br>

<table id="merchTable" cellspacing="5" class="sortable">
    <thead>
        <tr class="ui-widget-header">
            <th class="sorttable_nosort"></th>
            <th class="sorttable_nosort">Loc</th>
            <th class="merchRow">Report Code</th>
            <th class="merchRow">SKU</th>
            <th class="merchRow">Special ID</th>
            <th class="merchRow">Description</th>
            <th class="merchRow">Quantity</th>
            <th class="sorttable_nosort">Unit</th>
            <th style="display: none;" class="num">Quantity #</th>
        </tr>
    </thead>
    <tbody>

        <?php foreach ($dbh->query($query) as $row) {?>

        <tr>
            <td class="ui-widget-content"><input type="checkbox" class="check" name="check" id="checkid-<?php echo intval ($row['ID'])?>"></td>
            <td class="loc ui-widget-content" data-loc="<?php echo $row['Loc'] ?>"><input type="hidden"><?php echo $row['Loc'];?></td>
            <td class="rp-code ui-widget-content" align="center" data-rp-code="<?php echo $row['Rp-Code'] ?>" id="rp-code-<?php echo intval ($row['Rp-Code'])?>"><?php echo $row['Rp-Code'];?></td>
            <td class="sku ui-widget-content" data-sku="<?php echo $row['SKU'] ?>" id="sku-<?php echo intval ($row['SKU'])?>"><?php echo $row['SKU'];?></td>
            <td class="special-id ui-widget-content" data-special-id="<?php echo $row['Special-ID'] ?>" align="center" id="special-id-<?php echo intval ($row['Special-ID'])?>"><?php echo $row['Special-ID'];?></td>
            <td class="description ui-widget-content" data-description="<?php echo htmlspecialchars($row['Description']) ?>" id="description-<?php echo intval ($row['Description'])?>"><?php echo $row['Description'];?></td>
            <td class="quantity ui-widget-content" data-quantity="<?php echo $row['Quantity'] ?>" align="center" id="quantity-<?php echo intval ($row['Quantity'])?>"><?php echo $row['Quantity'];?></td>
            <td class="unit ui-widget-content" data-unit="<?php echo $row['Unit'] ?>" id="unit-<?php echo intval ($row['Unit'])?>"><?php echo $row['Unit'];?></td>
            <td style="display: none;" class="quantity_num ui-widget-content"><input type="textbox" style="width: 100px;" class="spinner" id="spin-<?php echo intval ($row['ID'])?>"></td>
        </tr>

    <?php } ?>

    </tbody>
</table>

用于在整个会话期间保持选中复选框的 JavaScript:

$(function(){
    $(':checkbox').each(function() {
        var $el = $(this);
        $el.prop('checked', sessionStorage[$el.prop('id')] === 'true');
    });

    $('input:checkbox').on('change', function() { 
        var $el = $(this);
        sessionStorage[$el.prop('id')] = $el.is(':checked');
    });
});

将数据从表格导入电子邮件的 JavaScript:

function sendMail() {
    var link = "mailto:me@example.com"
             + "?subject=" + encodeURIComponent("Order")
             + "&body=";

    var body = '';

  $('table tr input[name="check"]:checked').each(function(){
    var current_tr = $(this).parent().parent();

    var data = current_tr.find('.loc').data('loc');
    body +=  encodeURIComponent(data) + '\xa0\xa0';

    var data =current_tr.find('.rp-code').data('rp-code');
    body +=  encodeURIComponent(data) + '\xa0\xa0';

    var data =current_tr.find('.sku').data('sku');
    body +=  encodeURIComponent(data) + '\xa0\xa0';

    var data =current_tr.find('.special-id').data('special-id');
    body +=  encodeURIComponent(data) + '\xa0\xa0';

    var data =current_tr.find('.description').data('description');
    body +=  encodeURIComponent(data) + '\xa0\xa0';

    var data =current_tr.find('.quantity').data('quantity');
    body +=  encodeURIComponent(data) + '\xa0\xa0';

    var data =current_tr.find('.unit').data('unit');
    body +=  encodeURIComponent(data) + '\xa0\xa0';

    var data =current_tr.find('.spinner').data('spinner');
    body +=  encodeURIComponent(data) + '\xa0\xa0';

    body += '%0D%0A';

  });

  body += '';
  link += body;
  console.log(link);

  window.location.href = link;
}

【问题讨论】:

  • 您的代码不清楚。要选择选中的输入,请使用 $('input:checked') 而不是 $('input:checkbox')。或者如果你想选中一个复选框,请使用$("input[type='checkbox']")
  • 这两种方式都不起作用...$('input:checkbox') 这会产生相同的结果,但如果您转到另一个页面,选中的复选框不会保持选中状态。 $("input[type='checkbox']") 如果通过搜索导航到另一个页面,这会检查所有内容,但显示的结果与我已经得到的结果相同

标签: javascript php html session checkbox


【解决方案1】:

根据您的 cmets/新代码进行了修改:

即使使用新粘贴的代码,问题仍然存在,即由于循环遍历表格行,您只能输出屏幕上当前可用的内容。相反,您需要更进一步,构建对象来容纳构建电子邮件所需的信息,然后将这些对象放入存储中以供以后检索。

再次查看您的代码,您的复选框具有“check-id”前缀。

$('input:checkbox').on('change', function() {
    var $el = $(this);
    var key = $el.prop('id');
    var rowObject = {};

    //check if already in storage
    if(sessionStorage.getItem(key) !== null){
     rowObject = JSON.parse(sessionStorage.getItem(key));
     rowObject.checkedVal = $el.is(':checked'); //update it's check value
    }else{
     //build entire row object
     var current_tr = $(this).parent().parent();

     rowObject.loc = current_tr.find('.loc').data('loc');
     rowObject.rpCode = current_tr.find('.loc').data('rp-code');
     rowObject.sku = current_tr.find('.loc').data('sku');
     //etc. as many pieces as you need
    }

    //set to session
    sessionStorage.setItem(key, JSON.stringify(rowObject));

});

//then later for your send email method
function sendEmail(){
  var link = "mailto:me@example.com"
            + "?subject=" + encodeURIComponent("Order")
            + "&body=";

   var body = '';

  //loop over the row objects instead
  $.each(sessionStorage, function(key, value){
    //sort out the ones we want
    if(key.indexOf("checkid-") > -1){
      var rowObject = JSON.parse(sessionStorage.getItem(key));
      body +=  encodeURIComponent(rowObject.loc + '\xa0\xa0');
      body +=  encodeURIComponent(rowObject.rpCode + '\xa0\xa0');
      body +=  encodeURIComponent(rowObject.sku + '\xa0\xa0');
      //etc. as many pieces as you need

      body += '%0D%0A';
    }
  });

  //whatever other logic you have
}

我还没有针对您的目的完全测试此代码,但您明白了,构建您的对象,然后在您的迭代过程中使用它们。

【讨论】:

  • 我刚刚查看了我的代码并意识到我可能需要包含我刚刚添加的代码的另一部分。看到了,我假设这可能会改变你的答案
  • 这似乎对我不起作用...知道要解决什么吗?
  • 修改了我的答案
  • 所以我有代码根据你应该是怎样的,但它不工作......电子邮件中显示的所有数据现在都显示未定义,如果你导航到一个复选框,复选框不会保持选中状态不同的页面
  • 这将需要您调试一些问题,为什么这些值返回为未定义?它发生在 on change 处理程序或 sendEmail 方法中吗?使用 console.log 来调试它。同样,这是让您朝着正确方向前进的模拟代码,需要实际访问您的代码才能自己查看确切的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2012-05-15
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多