Để thao tác tốt nhất với các kịch bản mainh họa trong bài viết này, hãy xem nó bằng trình duyệt trên máy tính để bàn. Zalo Wigget mà bạn đang thấy ở trang này được code bằng đúng những gì sẽ trình bày
Zalo SDK được cung cấp sẵn khá là nặng nề và làm nhiều việc, nếu bạn chỉ cần cửa sổ chat thì có thể sẽ đơn giản hơn. Về bản chất, mã javascript của zalosdk sẽ chèn vào trong body của trang web một thẻ iframe là cửa số chat của Zalo. Bạn có thể copy iframe này bằng cách chạy Zalo Widget chuẩn đã được cung cấp tại ví dụ này webchat.html, rồi dùng tính năng "kiểm tra" của trình duyệt để copy mã sinh ra. Mã có dạng như sau:
<div class="zalo-chat-widget"
data-oaid="24667240278009508"
data-welcome-message="Rất vui khi được hỗ trợ bạn!"
data-autopopup="0"
data-width=""
data-height=""
style="border: none; visibility: visible; bottom: 52px; right: 52px; position: fixed; z-index: 2147483644 !important;">
<iframe id="chatiframe"
frameborder="0"
allowfullscreen=""
scrolling="no"
width="440"
height="813"
src="https://page.widget.zalo.me/?
position=null
&oaid=24667240278009508
&welcomemessage=R%E1%...%BA%A1n!
&autopopup=0
&leftside=false
&width=440
&height=813
&style=2
&id=01e9420a-5e61-4364-8bda-e0f8caffc26e
&domain=shopkimkhi.ntha.com
&android=false
&ios=false"
style="width:440px; max-width: 90vw; height:85vh; max-height: 90vh; position: absolute; bottom: 0px; right: 0px;">
</iframe>
</div>
Khi thu nhỏ cửa sổ chat, thì thẻ iframe vẫn giữ nguyên kích thước với nền trong suốt trừ chỗ nút bấm biểu tượng của Zalo khiến cho không thao tác với chuột như click hay bôi đen ở phía sau được. Bạn đánh dấu hộp kiểm "Hiện nền của iframe để dễ quan sát" dưới đây sẽ rõ.
Muốn khắc phụ ta cần hiểu cơ chế của Zalo Chat IFRAME. Mỗi khi trong Frame có sự kiện thì nó gửi message ra ngoài cho window crua DOM. Bạn có thể theo dõi quá trình này bằng cách đánh dấu kiểm dưới đây rồi bật tắt của sổ chat, đồng thời theo dõi tên thông điệp được gửi ra
Giải pháp là ta sẽ bắt sự kiện của cửa sổ chat zalo rồi thay đổi kích thước iframe theo các bước sau
window.addEventListener("message", function(t) {
if (t.data && t.data.cmd == "zchat_widget_toggle_sticker") {
const f = document.getElementById("chatiframe");
if (t.data.width) {
f.style.width = t.data.width;
f.style.height = t.data.height;
} else {
f.style.width = "440px";
f.style.height = "85vh";
}
}
});
Chúc các bạn thành công