makliu 发表于 2023-12-20 11:35:21

求助, jquery 打印的问题!

前端不太懂, 代码是从娘度中 找来自己改的。   

我有一个表格 ,如图, 希望 点击 打印 按钮时,   会把选中的 行通过ajax 向后端发起请求;   得到需要打印的数据;   每一行 返回的数据的 打印在一页纸上;



打印的函数代码是 : function printPreview(selectedRowsData, callback) {
    dataDetail = selectedRowsData.detail;
    dataInfo = selectedRowsData.info;

    var content = '<table>';
    content += '<tr><th rowspan="3">商品代码</th><th rowspan="3">颜色</th><th colspan="17">尺码</th><th rowspan="3">数量</th><th rowspan="3">单价</th><th rowspan="3">金额</th></tr>'
            +'<tr><th>16</th><th>17</th><th>18</th><th>19</th><th>20</th><th>21</th><th>22</th><th>23</th><th>24</th><th>25</th><th>26</th><th>27</th><th>28</th><th>29</th><th>30</th><th>31</th><th>32</th></tr>'
            +'<tr><th>33</th><th>34</th><th>35</th><th>36</th><th>37</th><th>38</th><th>39</th><th>40</th><th>41</th><th>42</th><th>43</th><th>44</th><th>45</th><th>46</th><th>47</th><th>48</th><th>49</th></tr>';


    for (var i = 0; i < dataDetail.length; i++) {
      content += '<tr>';
      content += '<td>' + dataDetail.spdm + '</td>';
      content += '<td>' + dataDetail.ys + '</td>';

      detailSize = getDetailSize(dataDetail.sl);
      for (var j = 0; j < detailSize.length; j++){
      content += '<td>' + detailSize + '</td>'
      }

      var total_detail_sl = detailSize.reduce(function(a, b) {
          return a + b;
      }, 0);
      content += '<td>' + total_detail_sl + '</td>';

      content += '<td>' + dataDetail.dj + '</td>';

      content += '<td>' + dataDetail.dj * total_detail_sl + '</td>';
      content += '</tr>';
    }

    content += '</table>';

    var printWindow = window.open('', '', 'width=600,height=800');
    var $printDocument = $(printWindow.document);

    //$printDocument.find('head').append('<title>打印预览</title>');
    $printDocument.find('head').append('<style> '
                                    +' table {border-collapse: collapse;width: 100%;} '
                                    +' th, td {border: 1px solid black;padding: 8px;text-align: center;} '
                                    +' .title {text-align: center;font-size: 20px;} '
                                    +' .container{width: 100%;}.container span{float: left;margin-left:10px} .container span:last-child {float: right; margin-right:10px}'
                                    +'</style>');

    $printDocument.find('body').append('<h1 class="title">xxxxxx</h1>');
    $printDocument.find('body').append('<divclass="container"><span>dh:</span>'+ dataInfo
                                       +'<span>rq:' + dataInfo+ ' </span></div>');
    $printDocument.find('body').append('<divclass="container"><span>gh: ' + dataInfo
                                       +'</span><span>ck:' + dataInfo +'</span></div>');
    $printDocument.find('body').append(content);
    $printDocument.find('body').append('<divclass="container"><span>bz:'+ dataInfo +'</span><span>:</span></div>');
    printWindow.document.close();

    printWindow.print();
    printWindow.close();

    callback();
}


打印列队的函数 代码是: function printAllData(dataList) {
var currentIndex = 0;
function printNextData() {
    if (currentIndex < dataList.length) {
      printPreview(dataList, function() {
      currentIndex++;
      setTimeout(printNextData, 1000);
      });
    }
}

printNextData();
}

其中ajax 代码是 : $.ajax({
url: '/print/',
method: 'GET',
data: {
        "djbh": JSON.stringify(selectedRows),
        },
success: function(response) {
        var selectedRowsDataList = response.data;
   
        var printQueue = [];
        for (var i = 0; i < selectedRowsDataList.length; i++){
                printQueue.push(selectedRowsDataList);
        }

        printAllData(printQueue);
},
error: function(error) {
        console.error('请求失败');
}
});



现在是能打印出自己想要的效果。   但是它只打印一份数据, 只打印一页。。    如果想按打印时,   它会把 选中的 都打印出来, 要怎么改。 ?

FishC 发表于 2023-12-20 11:35:33

你的代码中有一个问题,就是在printAllData函数中,每次调用printPreview打印函数时都传递了整个数据列表dataList,而不是传递当前索引对应的数据。这导致了每次打印只能打印一页。

要解决这个问题,你需要修改printAllData函数的printNextData部分的代码,将dataList作为参数传递给printPreview函数。

修改后的代码如下:

function printAllData(dataList) {
var currentIndex = 0;
function printNextData() {
    if (currentIndex < dataList.length) {
      printPreview(dataList, function() {
      currentIndex++;
      setTimeout(printNextData, 1000);
      });
    }
}

printNextData();
}

这样,每次调用printPreview函数时会传入当前索引对应的数据,从而实现逐条打印的效果。

另外,还有一个小问题,在ajax请求成功后,你创建了一个空的printQueue数组,然后将所有选中的行数据都push进去。这样会导致打印的顺序与选中的顺序不一致。如果你想按选中的顺序打印,可以直接使用selectedRowsDataList数组作为参数传递给printAllData函数,不需要再创建printQueue数组。

修改后的ajax代码如下:

$.ajax({
url: '/print/',
method: 'GET',
data: {
    "djbh": JSON.stringify(selectedRows),
},
success: function(response) {
    var selectedRowsDataList = response.data;

    printAllData(selectedRowsDataList);
},
error: function(error) {
    console.error('请求失败');
}
});

希望以上解答能够帮到你,如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

makliu 发表于 2023-12-20 11:40:57

FishC 发表于 2023-12-20 11:35
你的代码中有一个问题,就是在printAllData函数中,每次调用printPreview打印函数时都传递了整个数据列表da ...

printAllData   这个函数 没有看出 改了哪个位置。。。

FishC 发表于 2023-12-20 11:41:07

makliu 发表于 2023-12-20 11:40
printAllData   这个函数 没有看出 改了哪个位置。。 ...

抱歉,我之前的回答可能没有解释清楚。下面是关于`printAllData`函数中改动的代码:

function printAllData(dataList) {
var currentIndex = 0;

function printNextData() {
    if (currentIndex < dataList.length) {
      var selectedRowsData = dataList; // 获取当前索引对应的数据
      printPreview(selectedRowsData, function() { // 将当前数据传递给printPreview函数
      currentIndex++;
      setTimeout(printNextData, 1000);
      });
    }
}

printNextData();
}

在这个修改后的代码中,通过 `dataList` 获取当前索引对应的数据,然后将该数据作为参数传递给 `printPreview` 函数。这样就保证了每次打印时都只打印当前行的数据,从而实现逐行打印的效果。

希望这次能够解决你的问题,如果还有疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

makliu 发表于 2023-12-20 11:48:30

FishC 发表于 2023-12-20 11:41
抱歉,我之前的回答可能没有解释清楚。下面是关于`printAllData`函数中改动的代码:



按 更改的 , 是可以打印出来了;
但还有问题,    就是 点击 表格上的 打印按钮 后,它会 弹出第一份 数据的 打印预览页,在预览页 再次点击 打印 后才打印第一份数据, 而且   打印完第一份后, 它会再次弹出 第二份数据的 预览页,   要在预览页 再次点击 打印,才会打印第二份数据。。

我想实现在 表格的打印 按钮点击后, 即可以 直接打印 这两份数据, 而不是在预览页上 每次都点打印。

FishC 发表于 2023-12-20 11:53:46

makliu 发表于 2023-12-20 11:48
按 更改的 , 是可以打印出来了;
但还有问题,   ...

这个问题是因为你在 `printPreview` 函数中使用了 `setTimeout` 来延迟执行下一次打印。这导致了每次打印完成后都会再次弹出预览页。如果你希望直接打印这两份数据而不是在预览页上每次都点击打印,可以将 `printNextData` 函数放在 `printPreview` 函数的回调函数中,并在回调函数中判断是否需要继续打印下一份数据。修改后的代码如下所示:function printAllData(dataList) {var currentIndex = 0;function printNextData() {    if (currentIndex < dataList.length) {      var selectedRowsData = dataList; // 获取当前索引对应的数据      printPreview(selectedRowsData, function() { // 将当前数据传递给printPreview函数      currentIndex++;      printNextData(); // 在回调函数中继续打印下一份数据      });    }}printNextData();}通过将 `printNextData` 函数放在回调函数中并递归调用,可以实现连续打印选中的所有数据。这样,在点击表格上的打印按钮后,会直接连续打印选中的所有数据,而无需手动点击预览页上的打印按钮。希望以上解答能够解决你的问题,如还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

makliu 发表于 2023-12-20 12:09:57

FishC 发表于 2023-12-20 11:53
这个问题是因为你在 `printPreview` 函数中使用了 `setTimeout` 来延迟执行下一次打印。这导致了每次打印 ...

按上面,改了之后, 它还是会弹出 预览的窗口页, 并且要 点击 预览页的打印按钮,才会打印 。      我是希望它不弹出 预览页面,    点击 表格的 打印按钮后 就直接打印   

FishC 发表于 2023-12-20 12:10:14

makliu 发表于 2023-12-20 12:09
按上面,改了之后, 它还是会弹出 预览的窗口页, 并 ...

非常抱歉,我之前的回答有误。在浏览器中,无法直接控制打印机进行打印操作,通常需要显示预览页面并手动点击打印按钮才能完成打印。

如果你想实现直接打印功能,可以考虑使用第三方打印插件或库,例如 `jsPrintSetup` 或 `Print.js`,这些插件可以提供更多的打印控制和自定义选项。

以下是使用 `Print.js` 进行打印的示例代码:

首先,在 HTML 页面中引入 `Print.js` 库的 JavaScript 文件:
<script src="https://printjs-4de6.kxcdn.com/print.min.js"></script>

然后,在点击打印按钮的事件处理函数中调用 `printJS` 方法,传入你想要打印的内容:
function printAllData(dataList) {
var content = '';
// 构建打印内容
for (var i = 0; i < dataList.length; i++) {
    var selectedRowsData = dataList;
    // 拼接数据内容
    // ...

    content += '<div class="print-page">' + selectedRowsData + '</div>';
}

// 打印所有数据
printJS(content, 'html');
}

这样,点击表格的打印按钮后,会直接将所选数据打印出来,而不需要弹出预览页面。

请确保网络连接良好,以便加载第三方库。如果需要更多的打印控制和自定义选项,建议查阅相关库的文档以获取更多信息。

希望这能对解决你的问题有所帮助!如还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

makliu 发表于 2023-12-20 12:22:09

FishC 发表于 2023-12-20 12:10
非常抱歉,我之前的回答有误。在浏览器中,无法直接控制打印机进行打印操作,通常需要显示预览页面并手动 ...

printAllData 函数 里不需要再套printNextData 函数了吗?如果 需要的话 需要怎么套法?

FishC 发表于 2023-12-20 12:22:16

makliu 发表于 2023-12-20 12:22
printAllData 函数 里不需要再套printNextData 函数 ...

非常抱歉,之前的回答中确实有误。感谢你的指正。

在 `printAllData` 函数中,如果你希望逐条打印数据,并且等待每次打印完成后再进行下一次打印,可以继续使用 `printNextData` 函数来达到这个目的。以下是更新后的代码:

function printAllData(dataList) {
var currentIndex = 0;

function printNextData() {
    if (currentIndex < dataList.length) {
      printPreview(dataList, function() {
      currentIndex++;
      setTimeout(printNextData, 1000);
      });
    }
}

printNextData();
}

这样,每次调用 `printPreview` 函数时,传入的参数是 `dataList`,也就是当前索引对应的数据。然后在回调函数中,递增索引 `currentIndex` 并调用 `setTimeout` 来延时执行下一次打印操作。

希望这次的回答能够帮到你,如果还有其他问题,请随时提问。非常抱歉之前的误导造成的困扰。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 求助, jquery 打印的问题!