鱼C论坛

 找回密码
 立即注册
查看: 281|回复: 9

求助, jquery 打印的问题!

[复制链接]
发表于 2023-12-20 11:35:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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



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

  4.     var content = '<table>';
  5.     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>'
  6.               +'<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>'
  7.               +'<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>';


  8.     for (var i = 0; i < dataDetail.length; i++) {
  9.       content += '<tr>';
  10.       content += '<td>' + dataDetail[i].spdm + '</td>';
  11.       content += '<td>' + dataDetail[i].ys + '</td>';

  12.       detailSize = getDetailSize(dataDetail[i].sl);
  13.       for (var j = 0; j < detailSize.length; j++){
  14.         content += '<td>' + detailSize[j] + '</td>'
  15.       }

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

  20.       content += '<td>' + dataDetail[i].dj + '</td>';

  21.       content += '<td>' + dataDetail[i].dj * total_detail_sl + '</td>';
  22.       content += '</tr>';
  23.     }

  24.     content += '</table>';

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

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

  34.     $printDocument.find('body').append('<h1 class="title">xxxxxx</h1>');
  35.     $printDocument.find('body').append('<div  class="container"><span>dh:</span>'+ dataInfo[0]
  36.                                        +'<span>rq:' + dataInfo[5]  + ' </span></div>');
  37.     $printDocument.find('body').append('<div  class="container"><span>gh: ' + dataInfo[3]
  38.                                        +'</span><span>ck:' + dataInfo[6] +'</span></div>');
  39.     $printDocument.find('body').append(content);
  40.     $printDocument.find('body').append('<div  class="container"><span>bz:'+ dataInfo[7] +'</span><span>:</span></div>');
  41.     printWindow.document.close();

  42.     printWindow.print();
  43.     printWindow.close();

  44.     callback();
  45. }
复制代码


打印列队的函数 代码是:
  1. function printAllData(dataList) {
  2.   var currentIndex = 0;
  3.   function printNextData() {
  4.     if (currentIndex < dataList.length) {
  5.       printPreview(dataList[currentIndex], function() {
  6.         currentIndex++;
  7.         setTimeout(printNextData, 1000);
  8.       });
  9.     }
  10.   }
  11.   
  12.   printNextData();
  13. }
复制代码


其中ajax 代码是 :
  1. $.ajax({
  2.   url: '/print/',
  3.   method: 'GET',
  4.   data: {
  5.         "djbh": JSON.stringify(selectedRows),
  6.         },
  7.   success: function(response) {
  8.         var selectedRowsDataList = response.data;
  9.    
  10.         var printQueue = [];
  11.         for (var i = 0; i < selectedRowsDataList.length; i++){
  12.                 printQueue.push(selectedRowsDataList[i]);  
  13.         }

  14.         printAllData(printQueue);
  15.   },
  16.   error: function(error) {
  17.         console.error('请求失败');
  18.   }
  19. });
复制代码




现在是能打印出自己想要的效果。   但是它只打印一份数据, 只打印一页。。    如果想按打印时,   它会把 选中的 都打印出来, 要怎么改。 ?
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-20 11:35:33 | 显示全部楼层
你的代码中有一个问题,就是在printAllData函数中,每次调用printPreview打印函数时都传递了整个数据列表dataList,而不是传递当前索引对应的数据。这导致了每次打印只能打印一页。

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

修改后的代码如下:
  1. function printAllData(dataList) {
  2.   var currentIndex = 0;
  3.   function printNextData() {
  4.     if (currentIndex < dataList.length) {
  5.       printPreview(dataList[currentIndex], function() {
  6.         currentIndex++;
  7.         setTimeout(printNextData, 1000);
  8.       });
  9.     }
  10.   }
  11.   
  12.   printNextData();
  13. }
复制代码

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

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

修改后的ajax代码如下:
  1. $.ajax({
  2.   url: '/print/',
  3.   method: 'GET',
  4.   data: {
  5.     "djbh": JSON.stringify(selectedRows),
  6.   },
  7.   success: function(response) {
  8.     var selectedRowsDataList = response.data;
  9.     printAllData(selectedRowsDataList);
  10.   },
  11.   error: function(error) {
  12.     console.error('请求失败');
  13.   }
  14. });
复制代码

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

printAllData   这个函数 没有看出 改了哪个位置。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-20 11:41:07 | 显示全部楼层
makliu 发表于 2023-12-20 11:40
printAllData   这个函数 没有看出 改了哪个位置。。 ...

抱歉,我之前的回答可能没有解释清楚。下面是关于`printAllData`函数中改动的代码:
  1. function printAllData(dataList) {
  2.   var currentIndex = 0;
  3.   function printNextData() {
  4.     if (currentIndex < dataList.length) {
  5.       var selectedRowsData = dataList[currentIndex]; // 获取当前索引对应的数据
  6.       printPreview(selectedRowsData, function() { // 将当前数据传递给printPreview函数
  7.         currentIndex++;
  8.         setTimeout(printNextData, 1000);
  9.       });
  10.     }
  11.   }
  12.   printNextData();
  13. }
复制代码

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

我想实现  在 表格的打印 按钮  点击后, 即可以 直接打印 这两份数据, 而不是在预览页上 每次都点打印。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[currentIndex]; // 获取当前索引对应的数据      printPreview(selectedRowsData, function() { // 将当前数据传递给printPreview函数        currentIndex++;        printNextData(); // 在回调函数中继续打印下一份数据      });    }  }  printNextData();}通过将 `printNextData` 函数放在回调函数中并递归调用,可以实现连续打印选中的所有数据。这样,在点击表格上的打印按钮后,会直接连续打印选中的所有数据,而无需手动点击预览页上的打印按钮。希望以上解答能够解决你的问题,如还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

按上面,改了之后, 它还是会弹出 预览的窗口页, 并且要 点击 预览页的打印按钮,才会打印 。      我是希望它不弹出 预览页面,    点击 表格的 打印按钮后 就直接打印   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-20 12:10:14 | 显示全部楼层
makliu 发表于 2023-12-20 12:09
按上面,改了之后, 它还是会弹出 预览的窗口页, 并 ...

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

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

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

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

然后,在点击打印按钮的事件处理函数中调用 `printJS` 方法,传入你想要打印的内容:
  1. function printAllData(dataList) {
  2.   var content = '';
  3.   // 构建打印内容
  4.   for (var i = 0; i < dataList.length; i++) {
  5.     var selectedRowsData = dataList[i];
  6.     // 拼接数据内容
  7.     // ...
  8.     content += '<div class="print-page">' + selectedRowsData + '</div>';
  9.   }
  10.   // 打印所有数据
  11.   printJS(content, 'html');
  12. }
复制代码

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

printAllData 函数 里不需要再套  printNextData 函数了吗?  如果 需要的话 需要怎么套法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-20 12:22:16 | 显示全部楼层
makliu 发表于 2023-12-20 12:22
printAllData 函数 里不需要再套  printNextData 函数 ...

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

在 `printAllData` 函数中,如果你希望逐条打印数据,并且等待每次打印完成后再进行下一次打印,可以继续使用 `printNextData` 函数来达到这个目的。以下是更新后的代码:
  1. function printAllData(dataList) {
  2.   var currentIndex = 0;
  3.   
  4.   function printNextData() {
  5.     if (currentIndex < dataList.length) {
  6.       printPreview(dataList[currentIndex], function() {
  7.         currentIndex++;
  8.         setTimeout(printNextData, 1000);
  9.       });
  10.     }
  11.   }
  12.   
  13.   printNextData();
  14. }
复制代码

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 14:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表