【问题标题】:Datatables markup code only partially working for the current page数据表标记代码仅部分适用于当前页面
【发布时间】:2016-09-08 14:55:25
【问题描述】:

此代码部分有效。它正确地更改了表格中的每个输入框,但我还需要调用它的 .change() 事件,以便它正确地对其他部分进行一些数学运算。

此 change() 事件有效,但仅在数据表的当前页面上有效。我转到其他页面,但没有计算数学。

table.on('dblclick', '[name="markupControl"]', function () {
            var value = parseFloat($(this).val()).toFixed(2);

            table.api().column(7).nodes().to$().find('input').val(value).change();

        });

当他们双击一个输入框时,它需要更改所有其他输入框的标记值,然后它需要调用更改事件,该事件应用一些数学来确保所有其他输入框的所有内容都相加。下面是它应该触发的更改事件。

table.on('change', '[name="markupControl"]', function () {
            // Get the rate id from this element
            var rateid = $(this).data('rateid');

            // Pricing variables
            var cost = parseFloat($('div[name="costControl"][data-rateid="' + rateid + '"]').text().replace("$", '').replace(",", ''));
            var markup = parseFloat($(this).val());

            // Update the Retail price for the correct plan retail box
            var retailControl = $('input[name="retailControl"][data-rateid="' + rateid + '"]');
            var newRetail = parseFloat(cost + markup).toFixed(2);
            retailControl.val(newRetail);

            // Force this control to go back to 2 decimals
            $(this).val(markup.toFixed(2));

            // Needed for later so we can call the change event on the retail control
            retailControl.change();
        });

我假设.change() 事件不会在其他页面上通过双击触发输入框。不知道我缺少什么来完成这项工作。

编辑:

这是一个代表我的问题的 jsfiddle。更改任何标记列,然后双击该输入框,您将看到一切正常,直到您切换到下一页。

https://jsfiddle.net/jamesjw007/hvk30q5w/

【问题讨论】:

  • 无论使用 find('input') 找到什么,都会触发 change() 事件,但事件侦听器正在寻找 '[name="markupControl"]' 上的更改。这些是不同的东西吗?
  • @Adam name="markupControl" 是输入框。这一切都非常适合我正在查看的页面。但是当我切换页面时,值会改变,但数学并没有像我正在查看的页面上那样正确地加起来。
  • @Adam 我添加了一个 jsfiddle,它显示了我的问题的一个示例。

标签: jquery datatables


【解决方案1】:

我没有 100% 遵循代码的意图是准确地建议如何修改它,但我认为问题的根源在于 jquery 选择器只会返回 DOM 中存在的东西。 Datatables 正在动态更新 DOM,因此您的 jquery 选择器将找到的唯一项目是当前页面上存在的项目。如果要更新未显示项目的数据,则需要使用data() 方法。

由于您要更新匹配的每个单元格,您可以使用rows().every() 方法,然后为每个项目设置单元格上的数据。

另外,请务必在完成后调用draw() 方法,否则您的结果将不会显示。

【讨论】:

  • table.api().column(7).nodes().to$().find('input').val(value).change(); 这一行成功地更新了每个标记输入控制器,即使是在隐藏页面上也是如此。似乎 .change() 在当前页面上没有任何内容。不确定这是否有帮助。
  • 是的,这可能是出于类似的原因。 DOM 中只有 10 个项目可以被触发,所以那些是更新的项目
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多