開發一個 JS 組件,第三方網站只需嵌入一行 `
如上代碼所示,**核心 UI 放在 iframe 中**,主頁面只負責建立容器與載入 iframe。優勢:
// 組件內頁面 (widget_frame.html) 發送高度調整請求
window.parent.postMessage({
type: 'resize',
height: document.body.scrollHeight
}, 'https://trusted-origin.com'); // 指定目標源,安全
// 主頁面監聽 (可選,若需自動調整容器高度)
window.addEventListener('message', function(event) {
if (event.origin !== 'https://widget.example.com') return; // 驗證來源
if (event.data.type === 'resize') {
var container = document.getElementById(event.data.containerId);
if (container) container.style.height = event.data.height + 'px';
}
});
// widget.core.js - 核心邏輯 (UMD 格式)
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory); // AMD
} else if (typeof exports === 'object') {
module.exports = factory(require('jquery')); // CommonJS
} else {
root.Widget = factory(root.jQuery); // 全域變數
}
})(typeof self !== 'undefined' ? self : this, function($) {
// 核心類別
function Widget(options) {
this.options = $.extend({}, Widget.defaults, options);
this.init();
}
Widget.defaults = { /* 預設配置 */ };
Widget.prototype.init = function() { /* 初始化 */ };
Widget.prototype.render = function() { /* 渲染 */ };
return Widget;
});
// widget.loader.js - 載入器 (第三方嵌入)
(function() {
var script = document.currentScript;
var params = parseParams(script.src);
// 動態載入依賴 (jQuery, CSS, 核心模組)
loadDependencies(function() {
new Widget(params).render();
});
})();