鱼C论坛

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

求助, jquery 打印的问题!

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

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

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

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

我有一个表格 ,  如图, 希望 点击 打印 按钮时,   会把选中的 行  通过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[i].spdm + '</td>';
      content += '<td>' + dataDetail[i].ys + '</td>';

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

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

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

      content += '<td>' + dataDetail[i].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('<div  class="container"><span>dh:</span>'+ dataInfo[0]
                                       +'<span>rq:' + dataInfo[5]  + ' </span></div>');
    $printDocument.find('body').append('<div  class="container"><span>gh: ' + dataInfo[3]
                                       +'</span><span>ck:' + dataInfo[6] +'</span></div>');
    $printDocument.find('body').append(content);
    $printDocument.find('body').append('<div  class="container"><span>bz:'+ dataInfo[7] +'</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[currentIndex], 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[i]);  
        }

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



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

使用道具 举报

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

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

修改后的代码如下:
function printAllData(dataList) {  var currentIndex = 0;  function printNextData() {    if (currentIndex < dataList.length) {      printPreview(dataList[currentIndex], 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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`函数中改动的代码:
function printAllData(dataList) {  var currentIndex = 0;  function printNextData() {    if (currentIndex < dataList.length) {      var selectedRowsData = dataList[currentIndex]; // 获取当前索引对应的数据      printPreview(selectedRowsData, function() { // 将当前数据传递给printPreview函数        currentIndex++;        setTimeout(printNextData, 1000);      });    }  }  printNextData();}
在这个修改后的代码中,通过 `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 文件:
<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[i];    // 拼接数据内容    // ...    content += '<div class="print-page">' + selectedRowsData + '</div>';  }  // 打印所有数据  printJS(content, 'html');}
这样,点击表格的打印按钮后,会直接将所选数据打印出来,而不需要弹出预览页面。

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

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

以上回复来自 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` 函数来达到这个目的。以下是更新后的代码:
function printAllData(dataList) {  var currentIndex = 0;    function printNextData() {    if (currentIndex < dataList.length) {      printPreview(dataList[currentIndex], function() {        currentIndex++;        setTimeout(printNextData, 1000);      });    }  }    printNextData();}
这样,每次调用 `printPreview` 函数时,传入的参数是 `dataList[currentIndex]`,也就是当前索引对应的数据。然后在回调函数中,递增索引 `currentIndex` 并调用 `setTimeout` 来延时执行下一次打印操作。

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-31 02:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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