qb-pc-sdk 1.2.8 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +254 -433
- package/core.min.js +1 -1
- package/index.js +279 -0
- package/inline-loader.js +1 -0
- package/package.json +6 -6
- package/src/ad-sdk-wrapper.js +846 -0
- package/src/example-simple.html +133 -0
- package/inline-loader-cdn.js +0 -1
- package/loader.min.js +0 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Native广告异步加载测试</title>
|
|
7
|
+
<!-- 内联版本:极简引导器,只负责容灾和异步加载,Windows环境检测在loader.min.js中 -->
|
|
8
|
+
<!-- <script>
|
|
9
|
+
(function(g){"use strict";var w=g&&g.window?g.window:(typeof window!=="undefined"?window:g),d=w.document;if(!d||w._qbPcSdkLoading||w.AdSDK)return;w._qbPcSdkLoading=true;var pr="https://unpkg.com/qb-pc-sdk@latest/loader.min.js",fb="https://file.qubiankeji.com/qb-pc-sdk/loader.min.js";var loaded=false;var timeoutId=setTimeout(function(){if(!loaded&&fb&&!d.querySelector('script[src="'+fb+'"]')){loaded=true;var fs=d.createElement("script");fs.src=fb;fs.async=true;fs.onerror=function(){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK加载失败"),AdSDK:null,GDTAdSDK:null}}));};d.head.appendChild(fs);}},2000);var s=d.createElement("script");s.src=pr;s.async=true;s.onload=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);}};s.onerror=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);if(fb&&!d.querySelector('script[src="'+fb+'"]')){var fs=d.createElement("script");fs.src=fb;fs.async=true;fs.onerror=function(){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK加载失败"),AdSDK:null,GDTAdSDK:null}}));};d.head.appendChild(fs);}else{w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK加载失败"),AdSDK:null,GDTAdSDK:null}}));}}};d.head.appendChild(s);})(typeof window!=="undefined"?window:(typeof global!=="undefined"?global:this));
|
|
10
|
+
</script> -->
|
|
11
|
+
<script src="https://www.qubiankeji.com/file/inline-loader.js" defer></script>
|
|
12
|
+
<style>
|
|
13
|
+
body { margin: 0; padding: 20px; font-family: sans-serif; background: #f0f2f5; }
|
|
14
|
+
.control-panel { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); margin-bottom: 20px; display: flex; gap: 15px; max-width: 900px; margin: 0 auto; }
|
|
15
|
+
.input-group { display: flex; flex-direction: column; gap: 6px; flex: 1; }
|
|
16
|
+
button#loadBtn { padding: 10px 24px; background-color: #007bff; color: white; border: none; border-radius: 6px; cursor: pointer; font-weight: 600; height: 42px; }
|
|
17
|
+
button#loadBtn:disabled { background-color: #ccc; cursor: not-allowed; }
|
|
18
|
+
#ad-slot-wrapper { max-width: 900px; margin: 20px auto; background: #fff; padding: 20px; border-radius: 8px; min-height: 240px; border: 2px dashed #e0e0e0; }
|
|
19
|
+
#log-container { max-width: 900px; margin: 20px auto; background: #2d2d2d; color: #00ff00; padding: 15px; border-radius: 8px; font-family: monospace; font-size: 12px; height: 250px; overflow-y: auto; }
|
|
20
|
+
.log-error { color: #ff4444; }
|
|
21
|
+
.log-success { color: #00ff00; }
|
|
22
|
+
</style>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
|
|
26
|
+
<div class="control-panel">
|
|
27
|
+
<div class="input-group">
|
|
28
|
+
<label>App ID</label>
|
|
29
|
+
<input type="text" id="appIdInput" value="2009110913851875373">
|
|
30
|
+
</div>
|
|
31
|
+
<div class="input-group">
|
|
32
|
+
<label>Placement ID</label>
|
|
33
|
+
<input type="text" id="placementIdInput" value="2009111010614468619">
|
|
34
|
+
</div>
|
|
35
|
+
<button id="loadBtn" disabled>SDK 加载中...</button>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<div id="ad-slot-wrapper">
|
|
39
|
+
<div id="ad-initial-tip" style="text-align: center; color: #999; padding-top: 80px;">
|
|
40
|
+
等待 SDK 异步就绪...
|
|
41
|
+
</div>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<div id="log-container"></div>
|
|
45
|
+
<!-- <div class="_krzjgiyls5a"></div> -->
|
|
46
|
+
|
|
47
|
+
<script>
|
|
48
|
+
// (window.slotbydup = window.slotbydup || []).push({
|
|
49
|
+
// id: "u7009528",
|
|
50
|
+
// container: "_krzjgiyls5a",
|
|
51
|
+
// async: true
|
|
52
|
+
// });
|
|
53
|
+
let currentAdInstance = null;
|
|
54
|
+
let isSdkReady = false;
|
|
55
|
+
|
|
56
|
+
function log(msg, type = 'info') {
|
|
57
|
+
const logContainer = document.getElementById('log-container');
|
|
58
|
+
const div = document.createElement('div');
|
|
59
|
+
let colorStyle = '';
|
|
60
|
+
if (type === 'error') colorStyle = 'color:#ff4444;';
|
|
61
|
+
if (type === 'success') colorStyle = 'color:#00ff00;';
|
|
62
|
+
div.innerHTML = `<span style="color:#888">[${new Date().toLocaleTimeString()}]</span> <span style="${colorStyle}">${msg}</span>`;
|
|
63
|
+
logContainer.appendChild(div);
|
|
64
|
+
logContainer.scrollTop = logContainer.scrollHeight;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// --- 核心逻辑:处理异步加载的时序 ---
|
|
68
|
+
|
|
69
|
+
const initUI = () => {
|
|
70
|
+
const loadBtn = document.getElementById('loadBtn');
|
|
71
|
+
loadBtn.disabled = false;
|
|
72
|
+
loadBtn.innerText = '加载广告';
|
|
73
|
+
document.getElementById('ad-initial-tip').innerText = '✅ SDK 已就绪,可以点击加载';
|
|
74
|
+
log('✅ SDK 系统已就绪 (defer 模式)', 'success');
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// 1. 监听自定义就绪事件
|
|
78
|
+
window.addEventListener('qb-pc-sdk-ready', (e) => {
|
|
79
|
+
if (e.detail && e.detail.error) {
|
|
80
|
+
log(`❌ SDK 内部加载失败: ${e.detail.error.message}`, 'error');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (!isSdkReady) {
|
|
84
|
+
isSdkReady = true;
|
|
85
|
+
initUI();
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// 2. 兜底轮询:防止由于 async 脚本执行太快,导致事件监听器还没注册好就错过了事件
|
|
90
|
+
const checkReady = setInterval(() => {
|
|
91
|
+
if (window.AdSDK && !isSdkReady) {
|
|
92
|
+
clearInterval(checkReady);
|
|
93
|
+
isSdkReady = true;
|
|
94
|
+
initUI();
|
|
95
|
+
}
|
|
96
|
+
}, 100);
|
|
97
|
+
|
|
98
|
+
// 10秒超时处理
|
|
99
|
+
setTimeout(() => clearInterval(checkReady), 10000);
|
|
100
|
+
|
|
101
|
+
// --- 广告加载逻辑 ---
|
|
102
|
+
|
|
103
|
+
function handleLoadClick() {
|
|
104
|
+
if (!isSdkReady) return;
|
|
105
|
+
|
|
106
|
+
const appId = document.getElementById('appIdInput').value.trim();
|
|
107
|
+
const placementId = document.getElementById('placementIdInput').value.trim();
|
|
108
|
+
|
|
109
|
+
if (currentAdInstance) {
|
|
110
|
+
currentAdInstance.destroy();
|
|
111
|
+
log('销毁旧广告实例');
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const wrapper = document.getElementById('ad-slot-wrapper');
|
|
115
|
+
wrapper.innerHTML = '<div id="ad-target"></div>';
|
|
116
|
+
|
|
117
|
+
log(`开始请求广告: ${placementId}`);
|
|
118
|
+
|
|
119
|
+
currentAdInstance = new window.AdSDK({
|
|
120
|
+
appId: appId,
|
|
121
|
+
placementId: placementId,
|
|
122
|
+
container: '#ad-target',
|
|
123
|
+
onAdLoaded: () => log('✅ 广告展示成功', 'success'),
|
|
124
|
+
onAdError: (err, msg) => log(`❌ 加载失败: ${msg}`, 'error'),
|
|
125
|
+
onAdExpose: () => log('👀 广告曝光'),
|
|
126
|
+
onAdClick: () => log('🖱️ 广告点击')
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
document.getElementById('loadBtn').onclick = handleLoadClick;
|
|
131
|
+
</script>
|
|
132
|
+
</body>
|
|
133
|
+
</html>
|
package/inline-loader-cdn.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(function(g){"use strict";var w=g&&g.window?g.window:(typeof window!=="undefined"?window:g),d=w.document;if(!d||w._qbPcSdkLoading||w.AdSDK)return;w._qbPcSdkLoading=true;var pr="https://unpkg.com/qb-pc-sdk@latest/loader.min.js",fb="https://file.qubiankeji.com/qb-pc-sdk/loader.min.js";var loaded=false;var timeoutId=setTimeout(function(){if(!loaded&&fb&&!d.querySelector('script[src="'+fb+'"]')){loaded=true;var fs=d.createElement("script");fs.src=fb;fs.async=true;fs.onerror=function(){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK加载失败"),AdSDK:null,GDTAdSDK:null}}));};d.head.appendChild(fs);}},2000);var s=d.createElement("script");s.src=pr;s.async=true;s.onload=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);}};s.onerror=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);if(fb&&!d.querySelector('script[src="'+fb+'"]')){var fs=d.createElement("script");fs.src=fb;fs.async=true;fs.onerror=function(){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK加载失败"),AdSDK:null,GDTAdSDK:null}}));};d.head.appendChild(fs);}else{w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK加载失败"),AdSDK:null,GDTAdSDK:null}}));}}};d.head.appendChild(s);})(typeof window!=="undefined"?window:(typeof global!=="undefined"?global:this));
|
package/loader.min.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
!function(e){"use strict";const window=void 0!==e&&e.window?e.window:void 0!==window?window:e,document=window.document;if(!document||window.AdSDK)return;const n=window.navigator&&window.navigator.userAgent||"",t=window.navigator.platform||"";if(/Android|iPhone|iPad|iPod|Mac|webOS|BlackBerry|IEMobile|Opera Mini/i.test(n)||!/Win|Windows/i.test(n+t))return;window._qbPcSdkLoading=!0;const d=function(){window.GDTAdSDK&&window.AdSDK?(window._qbPcSdkLoading=!1,window.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:window.AdSDK,GDTAdSDK:window.GDTAdSDK}}))):setTimeout(function(){window.GDTAdSDK&&window.AdSDK?(window._qbPcSdkLoading=!1,window.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:window.AdSDK,GDTAdSDK:window.GDTAdSDK}}))):(window._qbPcSdkLoading=!1,window.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK\u521d\u59cb\u5316\u5931\u8d25"),AdSDK:null,GDTAdSDK:null}})))},100)};!function(e,n){if(document.querySelector('script[src="'+e+'"]')||n&&document.querySelector('script[src="'+n+'"]'))return void d();let t=!1;const r=setTimeout(function(){if(!t&&n&&!document.querySelector('script[src="'+n+'"]')){t=!0;const e=document.createElement("script");e.src=n,e.async=!0,e.onload=d,e.onerror=function(){window._qbPcSdkLoading=!1,window.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK\u52a0\u8f7d\u5931\u8d25"),AdSDK:null,GDTAdSDK:null}}))},document.head.appendChild(e)}},2e3),o=document.createElement("script");o.src=e,o.async=!0,o.onload=function(){t||(t=!0,clearTimeout(r),d())},o.onerror=function(){if(!t)if(t=!0,clearTimeout(r),n&&!document.querySelector('script[src="'+n+'"]')){const e=document.createElement("script");e.src=n,e.async=!0,e.onload=d,e.onerror=function(){window._qbPcSdkLoading=!1,window.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK\u52a0\u8f7d\u5931\u8d25"),AdSDK:null,GDTAdSDK:null}}))},document.head.appendChild(e)}else window._qbPcSdkLoading=!1,window.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK\u52a0\u8f7d\u5931\u8d25"),AdSDK:null,GDTAdSDK:null}}))},document.head.appendChild(o)}("https://unpkg.com/qb-pc-sdk@latest/core.min.js","https://file.qubiankeji.com/qb-pc-sdk/core.min.js")}("undefined"!=typeof window?window:"undefined"!=typeof global?global:this);
|