我妈已经三天没打我了 2026-03-23 15:05 采纳率: 86.8%
浏览 4

整个erwm区域(包括上方文字图片,二维码图片和下方的文字)会被绘制成一个图片,覆盖在原始erwm位置。

<div class="fr common_right_btn" onclick="savePlan()" v-show="!role">分享</div>

.con_qr {
    width: 82.7%;
    padding-bottom: .42rem;
  background-color: #f7f7f7;
    border-radius: 0.2rem;
    box-sizing: border-box;
    position: relative;
    margin: 0 auto;
}
.con_qr .page_anme{
    color: #999999;
    font-size: 0.48rem;
    font-family: "微软雅黑";
    text-align: center;
    line-height: 0.5rem;
    margin-bottom:0.3rem;
}
#output {
    width: 7.4rem;
    height: 7.4rem;
    margin: 0 auto;
    padding: 0.4rem;
    box-sizing: border-box;
    background: #fff;
    border: 1px solid #dfdfdf;
}
#output img{
    width: 100%;
  height: 100%;
}
#qrcodeimg{
        position: absolute;
        z-index:100;
}
.temp{
    display: none;
}
#desc{
    text-align: center;
    line-height: 0.82rem;
    font-size: 0.52rem;
    font-family: "微软雅黑";
    color: #959494;
}
/* 二维码 */
.con_qr #my_close{
    width: 0.88rem;
    height: 0.88rem;
    border-radius: 50%;
    background: #cccccc;
    position: absolute;
  top: -0.32rem;
    right: -0.5rem;
    z-index: 999999;
}
#output {
  height: 8.4rem; 
  width: 9rem;
}
/* 二维码样式 */
.erwm{
    background: linear-gradient( 355deg, #D4F2FF 0%, #EBFFFF 100%);
    padding-bottom: 0.8rem;
}
.erwm .ewm_pname{
    font-weight: 600;
    font-size: 0.72rem;
    color: #167AFF;
    text-align: center;
    height: 2.4rem;
    line-height: 3rem;
    width: 100%;
    background: url(../images/ewm_bg.png) no-repeat;
  background-size: 100% 100%;
    margin-bottom: .72rem;
}
#output {
    background: url(../images/ewm_line.png) no-repeat;
    background-size: 100% 100%;
    padding: .56rem .78rem 0rem;
    border: none;
    /* padding-bottom: 0.8rem; */
}
#output .outputline{
    padding: .56rem;
    background-color: #FFFFFF;
    border-radius: 0.2rem;
}
#output p{
    font-weight: 400;
    font-size: .48rem;
    color: #010002;
    line-height: .78rem;
    margin-top: .6rem;
    text-align: center;
}
#desc{
    margin-top: .28rem;
}

.ewm_info,.ewm_add{
    background-color: #FFFFFF;
    width: 92%;
    margin: 0 auto;
    display: flex;
    padding: .32rem 0.2rem 0.32rem 1rem;
    box-sizing: border-box;
    font-size: .48rem;
  line-height: .7rem;
    text-align: left;
    border-radius: .38rem;
}
.ewm_add{
    flex-wrap: wrap; /* 允许换行 */
    gap: 10px; /* 元素间距 */
  color: #167AFF;
}

.ewm_add .ewm_addxing {
    flex: 1 0 calc(40%);
    box-sizing: border-box;
    
    margin: 0;
    min-width: 0; /* 防止内容溢出 */
}
.ewm_addxing{
    display: flex;
    align-items: center;
}
.ewm_addcalc{
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #2FAEFF;
    margin-right: .4rem;
}
.ewm_info{
    flex-direction: column;
    margin-top: .4rem;
    margin-bottom: .8rem;
    color: #444444;
}
.ewm_info_addxing{
    display: flex;
    align-items: center;
}
.qr_suspend {
    padding-top: 16% !important;
}

// 引入二维码/复制插件
document.write("<script src='../../lib/html2canvas.js?v=1.34'></script>");
document.write("<script src='../../lib/jquery.qrcode.min.js?v=1.34'></script>");
document.write("<script src='../../lib/clipboard.min.js'></script>");
document.write("<script src='../../js/common/wxxcx.js?v=2019.11.21.18'></script>");
$("#mask").before('<div class="qr_suspend"><div class="con_qr"><img id="my_close" src="../../images/icon_myclose.png" alt=""><div class="erwm"><p class="ewm_pname"></p><div class="ewm_add"><div class="ewm_addxing"><div class="ewm_addcalc"></div><p class="ewm_addcalc_name"></p></div></div><div class="ewm_info"><div class="ewm_info_addxing"><div class="ewm_addcalc"></div><p>交费期:<span class="ewm_num"></span></p></div><div class="ewm_info_addxing"><div class="ewm_addcalc"></div><p>保额:<span class="ewm_amount"></span>元</p></div><div class="ewm_info_addxing"><div class="ewm_addcalc"></div><p>首年合计保费:<span class="ewm_premium"></span>元</p></div></div><div id="output"><div class="outputline"><img id="qrcodeimg" src=""><div id="qrcode"></div></div><p>投保链接</p></div></div><p class="copy-links"><span class="btn copy-button" data-clipboard-text="1">复制链接</span></p><p id="desc">长按保存或者转发,建议不要直接<br>扫码,防止中途退出,找不到入口</p></div></div>')//20260212-6236二维码生成

 function savePlan() {
    var link = "";
    link = commonurl_front + "blank.html?product_no=" + _URL_PRODUCT_NO + "&special_apply_no=" + special_apply_no;
    //20260212-6236二维码生成
    $("#qrcode").empty().hide();
    var widthq = $(document ).width() / 2.5;
    var qrcode = new QRCode(document.getElementById("qrcode"), {
        width: widthq,
        height: widthq,
        correctLevel: QRCode.CorrectLevel.L
    });
    qrcode.makeCode(link);
    // 等待QRCode完全渲染
    setTimeout(function() {
        // 隐藏原始二维码图片
        $("#qrcode img").hide();
        // 获取原始canvas
        var originalCanvas = document.getElementById('qrcode').getElementsByTagName('canvas')[0];
        if (!originalCanvas) {
            console.error("未找到原始二维码canvas");
            return;
        }
        // 创建最终canvas
        var newCanvas = document.createElement('canvas');
        newCanvas.width = widthq;
        newCanvas.height = widthq;
        // 获取上下文
        var ctx = newCanvas.getContext('2d');
        // 绘制白色背景
        ctx.fillStyle = '#ffffff';
        ctx.fillRect(0, 0, newCanvas.width, newCanvas.height);
        // 将原始二维码绘制到新canvas
        ctx.drawImage(originalCanvas, 0, 0, widthq, widthq);
        // 加载并绘制logo
        var img = new Image();
        img.src = "../../images/ruilogo.png";
        img.onload = function() {
            // 绘制logo
            var logoWidth = 40;
            var logoHeight = 25;
            var logoX = (widthq - logoWidth) / 2;
            var logoY = (widthq - logoHeight) / 2;
            // 重新获取上下文以确保状态正确
            ctx = newCanvas.getContext('2d');
            ctx.drawImage(img, logoX, logoY, logoWidth, logoHeight);
            // 转换为图片
            var newCanvasDataURL = newCanvas.toDataURL("image/png", 1.0);
            // 先设置容器样式
            $(".outputline").css({
                'min-height': widthq + 'px',
                'display': 'flex',
                'justify-content': 'center',
                'align-items': 'center',
            });
            // 显示二维码图片
            $("#qrcodeimg").css({
                'max-width': '100%',
                'max-height': widthq + 'px',
                'height': 'auto',
                'width': 'auto',
                'margin': '0 auto',
                'display': 'block'
            });
            // 设置图片源
            $("#qrcodeimg").attr("src", newCanvasDataURL);
            // replaceEwm();
            if(!isWeixin) {
                $(".qr_suspend").show();
                $("#qrcode").show();
            }
        };
    }, 100);
    //二维码兼容性问题修改
    var btn = document.getElementsByClassName("btn")[0];
    var clipboard = new ClipboardJS(btn);
    $(".btn").attr("data-clipboard-text", link);
    $(".copy-links").hide();
    clipboard.on('success', function (e) {
        hxui.toast("链接复制成功");
    });
    clipboard.on('error', function (e) {
        hxui.toast("链接复制失败");
    });
    $.ajax({
        type: 'POST',
        url: commonurl + 'plan/saveseed',
        data: JSON.stringify(aaa),
        timeout: 30000,
        dataType: 'json',
        contentType: "application/json",
        success: function (req) {
            //mini半自助小程序分享
            var recalljump = function () {
                // 会客厅
                loShare();
                // 二维码
                ewmAjax()
                $('#loadingToast').hide();
                if (iswxxcx) {
                    var share_url;
                    var str = "";
                    if (link.indexOf("?") != -1) {
                        share_url = link.split("?")[1];
                    }
                    var path = encodeURIComponent(commonurl_front + "xcxshare.html?" + share_url + "&xcx_page=2")
                    wx.miniProgram.navigateTo({
                        url: '/pages/comshare/comshare?url=' + path
                    })
                    return;
                }
            }
            Recall.recallEnd(return_appid.seed_no, recalljump)
        },
        complete: function (XMLHttpRequest, status) {
            if (status == 'timeout') {
                $('#loadingToast').hide();
                $("#errInfo").show();
            }
        },
        error: function (xhr, type) {
            hxui.toast("网络请求出错");
            $('#loadingToast').hide();
        }
    });
}
function ewmAjax() {
    var ewmdata={
        "seed_no": hxcjs.getUrlString("seed_no")||return_appid.seed_no,
        "plan_no": "",
        "sales_agent":  _URL_SALES_AGENT,
    }
    $.ajax({
        type: 'POST',
        url: commonurl + 'qrcode/tip/query',
        data: JSON.stringify(ewmdata),
        timeout: 30000,
        dataType: 'json',
        contentType: "application/json",
        success: function (req) {
            $(".ewm_amount").text(req.risks[0].amount_insured);//保额
            $(".ewm_premium").text(req.premium);//首年合计保费
            $(".ewm_pname").text(req.risks[0].risk_short_name);//主险名称
            // 处理交费期的显示逻辑
            var paymentPeriodValue = req.risks[0].payment_period_value;
            var paymentPeriodText = "";
            if (paymentPeriodValue === "1") {
                paymentPeriodText = "一次交清";
            } else if (paymentPeriodValue) {
                paymentPeriodText = paymentPeriodValue + "年交";
            }
            // 设置交费期显示
            $(".ewm_num").text(paymentPeriodText);
            // 获取.ewm_add容器
            var $ewmAddContainer = $(".ewm_add");
            if ($ewmAddContainer.length > 0) {
                // 清空.ewm_addxing内部的所有内容
                $ewmAddContainer.find('.ewm_addxing').remove();
                // 检查是否有险种数据
                if (req.risks && req.risks.length > 0) {
                    // 循环创建每个险种的.ewm_addxing展示块
                    $.each(req.risks, function(index, riskItem) {
                        // 忽略第一个元素(索引0),从第二个元素(索引1)开始
                        if (index > 0) {
                            var html = '<div class="ewm_addxing">' +
                                            '<div class="ewm_addcalc"></div>' +
                                            '<p class="ewm_addcalc_name">' + riskItem.risk_short_name + '</p>' +
                                        '</div>';
                                        // 将.ewm_addxing插入到.ewm_add容器内
                                        $ewmAddContainer.append(html);
                        }
                    });
                }
                // 控制显示/隐藏
                if (req.risks && req.risks.length == 1) {
                    $(".ewm_add").hide();
                } else {
                    $(".ewm_add").show();
                }
            }
            // replaceEwm()
        },
        complete: function (XMLHttpRequest, status) {
            if (status == 'timeout') {
                $('#loadingToast').hide();
                $("#errInfo").show();
            }
        },
        error: function (xhr, type) {
            hxui.toast("网络请求出错");
            $('#loadingToast').hide();
        }
    });
}
  

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-03-23 15:20
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你描述的是一个网页中需要将整个 ERWM 区域(包含上方文字、二维码图片和下方文字) 绘制为一个图片,并将其覆盖在原始位置。这通常用于生成一张完整的二维码页面,供用户下载或分享。

    问题核心分析:

    • 你希望将 .con_qr 容器中的所有内容(包括文字、二维码、描述等)绘制为一张图片。
    • 这张图片会覆盖在原 ERWM 的位置上(可能是某个遮罩层或者弹窗)。
    • 需要使用 JavaScript 工具如 html2canvas 来完成这个任务。

    ✅ 解决方案:

    1. 引入必要的库

      • html2canvas.js:用于将 DOM 元素渲染为图片。
      • jquery.qrcode.min.js:用于生成二维码。
      • clipboard.min.js:用于复制文本到剪贴板(可选)。
    2. 确保 HTML 结构正确

      • 确保 .con_qr 是一个容器,包含所有需要绘制的元素(如文字、二维码、描述等)。
    3. 编写 JavaScript 代码实现截图功能

      • 使用 html2canvas.con_qr 渲染为图片。
      • 将图片插入到指定的位置(例如遮罩层)。
    4. 添加点击事件触发截图功能

      • 比如点击“分享”按钮时调用截图函数。
    5. 优化样式和布局

      • 确保截图区域在渲染时不会被其他元素遮挡。

    📌 示例代码

    HTML 结构

    <div class="fr common_right_btn" onclick="savePlan()" v-show="!role">分享</div>
    
    <div class="qr_suspend">
      <div class="con_qr">
        <!-- 你的 ERWM 内容 -->
        <div class="erwm">
          <p class="ewm_pname">产品名称</p>
          <div class="ewm_add">
            <div class="ewm_addxing">
              <div class="ewm_addcalc"></div>
              <p class="ewm_addcalc_name">附加险名称</p>
            </div>
          </div>
          <div class="ewm_info">
            <div class="ewm_info_addxing">
              <div class="ewm_addcalc"></div>
              <p>交费期:<span class="ewm_num">20年</span></p>
            </div>
            <div class="ewm_info_addxing">
              <div class="ewm_addcalc"></div>
              <p>保额:<span class="ewm_amount">100万</span>元</p>
            </div>
            <div class="ewm_info_addxing">
              <div class="ewm_addcalc"></div>
              <p>首年合计保费:<span class="ewm_premium">5000</span>元</p>
            </div>
          </div>
          <div id="output">
            <div class="outputline">
              <img id="qrcodeimg" src="" />
              <div id="qrcode"></div>
            </div>
            <p>投保链接</p>
          </div>
        </div>
        <p class="copy-links"><span class="btn copy-button" data-clipboard-text="https://example.com">复制链接</span></p>
      </div>
    </div>
    

    JavaScript 代码(修改后的)

    // 引入 html2canvas
    document.write("<script src='../../lib/html2canvas.js?v=1.34'></script>");
    document.write("<script src='../../lib/jquery.qrcode.min.js?v=1.34'></script>");
    document.write("<script src='../../lib/clipboard.min.js?v=1.34'></script>");
    
    function savePlan() {
      // 生成二维码
      $("#qrcode").qrcode({
        text: "https://example.com",
        width: 200,
        height: 200
      });
    
      // 使用 html2canvas 截图
      html2canvas(document.querySelector(".con_qr"), {
        scale: 2, // 提高清晰度
        useCORS: true, // 如果有跨域图片,需设置
        allowTaint: false
      }).then(canvas => {
        // 创建图片元素
        const img = document.createElement("img");
        img.src = canvas.toDataURL("image/png");
    
        // 将图片插入到遮罩层中
        const qrContainer = document.querySelector(".qr_suspend");
        qrContainer.innerHTML = ""; // 清空原有内容
        qrContainer.appendChild(img);
      });
    }
    

    ✅ 注意事项:

    • 确保 QR 二维码已生成:在调用 html2canvas 前,必须先通过 qrcode 插件生成二维码。
    • 样式兼容性:某些 CSS 属性(如 background-imagefilter)可能会影响截图效果,建议测试后调整。
    • 性能问题:如果内容复杂,截图可能会较慢,可以考虑优化 DOM 结构或使用懒加载。

    ✅ 总结

    • 核心目标:将 .con_qr 中的所有内容(文字、图片、二维码等)绘制为一张图片。
    • 实现方式:使用 html2canvas 库进行截图。
    • 关键点:确保二维码生成后再截图,合理处理样式与布局。

    如果你还有其他问题,比如如何保存为文件、如何展示在弹窗中等,也可以继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 3月23日