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 CHANGED
@@ -4,7 +4,6 @@ pc广告 SDK 封装器 - PC端广告接入工具
4
4
 
5
5
  > ✅ **系统兼容性**:SDK 会自动检测运行环境,仅在 Windows 系统下加载广告。在 Mac、Linux、移动端等非 Windows 环境下会静默处理,不会报错,页面可正常使用。
6
6
 
7
-
8
7
  ## 适用场景
9
8
 
10
9
  ### ✅ 支持的场景
@@ -12,6 +11,7 @@ pc广告 SDK 封装器 - PC端广告接入工具
12
11
  #### 1. PC 端网页(浏览器环境)
13
12
 
14
13
  **完全支持,推荐使用:**
14
+
15
15
  - ✅ **Windows 系统下的所有浏览器**
16
16
  - Chrome、Edge、Firefox、360 浏览器、QQ 浏览器、搜狗浏览器等
17
17
  - 支持所有现代浏览器(IE 11+)
@@ -41,12 +41,13 @@ pc广告 SDK 封装器 - PC端广告接入工具
41
41
  - ⚠️ **注意事项**
42
42
  - 确保 WebView 运行在 Windows 系统上(Mac/Linux 上运行会静默处理)
43
43
  - 确保网络连接正常(需要加载 CDN 资源)
44
- - 如果应用有 CSP(内容安全策略)限制,需要允许 `file.qubiankeji.com` 域名
44
+ - 如果应用有 CSP(内容安全策略)限制,需要允许域名
45
45
 
46
46
  **接入示例(Electron):**
47
+
47
48
  ```javascript
48
49
  // main.js
49
- const { app, BrowserWindow } = require('electron');
50
+ const { app, BrowserWindow } = require("electron");
50
51
 
51
52
  function createWindow() {
52
53
  const win = new BrowserWindow({
@@ -54,12 +55,12 @@ function createWindow() {
54
55
  height: 800,
55
56
  webPreferences: {
56
57
  nodeIntegration: false,
57
- contextIsolation: true
58
- }
58
+ contextIsolation: true,
59
+ },
59
60
  });
60
-
61
+
61
62
  // 加载包含广告的网页
62
- win.loadURL('https://your-website.com');
63
+ win.loadURL("https://your-website.com");
63
64
  }
64
65
 
65
66
  app.whenReady().then(createWindow);
@@ -67,20 +68,23 @@ app.whenReady().then(createWindow);
67
68
 
68
69
  ```html
69
70
  <!-- 在您的网页中正常使用 SDK(内联版本,容灾100%达成) -->
70
- <ins class="qb-adsbyqubian"
71
- style="display:block; width:400px; height:220px;"
72
- data-app-id="your-app-id"
73
- data-placement-id="your-placement-id">
71
+ <ins
72
+ class="qb-adsbyqubian"
73
+ style="display:block; width:400px; height:220px;"
74
+ data-app-id="your-app-id"
75
+ data-placement-id="your-placement-id"
76
+ >
74
77
  </ins>
78
+ <script src="https://unpkg.com/qb-pc-sdk@latest/core.min.js"></script>
75
79
  <script>
76
- (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;var ua=(w.navigator&&w.navigator.userAgent)||"",p=w.navigator.platform||"";if(/Android|iPhone|iPad|iPod|Mac|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua)||!/Win|Windows/i.test(ua+p))return;w._qbPcSdkLoading=true;var pr="https://unpkg.com/qb-pc-sdk@latest/core.min.js",fb="https://file.qubiankeji.com/qb-pc-sdk/core.min.js";var c=function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{setTimeout(function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK初始化失败"),AdSDK:null,GDTAdSDK:null}}));}},100);}};var l=function(p,f){if(d.querySelector('script[src="'+p+'"]')||(f&&d.querySelector('script[src="'+f+'"]'))){c();return;}var loaded=false;var timeoutId=setTimeout(function(){if(!loaded&&f&&!d.querySelector('script[src="'+f+'"]')){loaded=true;var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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=p;s.async=true;s.onload=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);c();}};s.onerror=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);if(f&&!d.querySelector('script[src="'+f+'"]')){var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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);};l(pr,fb);})(typeof window!=="undefined"?window:(typeof global!=="undefined"?global:this));
80
+ (window.qbAds = window.qbAds || []).push({});
77
81
  </script>
78
- <script>(window.qbAds = window.qbAds || []).push({});</script>
79
82
  ```
80
83
 
81
84
  #### 3. 第三方建站平台
82
85
 
83
86
  **完全支持,推荐使用即插即用模式:**
87
+
84
88
  - ✅ WordPress、Discuz!、Drupal、Joomla 等 CMS
85
89
  - ✅ 凡科建站、建站之星等可视化建站工具
86
90
  - ✅ 有赞、微盟等电商平台
@@ -97,165 +101,190 @@ app.whenReady().then(createWindow);
97
101
  ### 🔍 环境检测机制
98
102
 
99
103
  SDK 会自动检测运行环境:
104
+
100
105
  - **Windows 系统**:✅ 正常加载和显示广告
101
106
  - **非 Windows 系统**:✅ 静默处理,不发起广告请求,页面正常运行,不会报错
102
107
 
103
108
  **检测逻辑:**
109
+
104
110
  - 通过 `navigator.platform` 和 `navigator.userAgent` 检测操作系统
105
111
  - 仅在检测到 Windows 系统时加载广告
106
112
  - 其他环境(Mac、Linux、移动端)自动跳过,不报错,不影响页面正常使用
107
113
 
108
114
  ## 安装
109
115
 
110
- ### ⭐ CDN 内联代码模式(强烈推荐)
116
+ ### ⭐ CDN 模式
111
117
 
112
- **推荐所有客户使用 CDN 内联代码模式对接**,这是最简单、最可靠、容灾效果最好的接入方式。
118
+ <script src="https://unpkg.com/qb-pc-sdk@latest/core.min.js" defer></script>
113
119
 
114
- #### ⭐ 内联版本(最推荐,容灾100%达成)
120
+ ````
121
+ ### NPM 方式(模块化项目推荐)
115
122
 
116
- **为什么推荐内联模式?**
117
- - ✅ **容灾100%达成**:即使主 CDN 域名挂了,内联代码依然会运行并自动切换到备用 CDN
118
- - ✅ **2秒超时保护**:如果主 CDN 2秒内没有响应,自动切换到备用 CDN,避免长时间等待
119
- - ✅ **极简内联代码**:内联代码只负责容灾和异步加载,代码极小(约 0.4KB),几乎不阻塞页面
120
- - ✅ **无需维护外部文件**:逻辑直接内联在 HTML 中,不依赖外部文件,部署简单
121
- - ✅ **自动版本更新**:使用 `@latest` 自动获取最新版本,无需手动更新代码
122
- - ✅ **环境检测自动更新**:Windows/Mac 环境检测逻辑在 `loader.min.js` 中,未来支持 Mac 时客户无需修改内联代码
123
- - ✅ **一次接入,永久有效**:客户只需复制粘贴一次内联代码,后续所有功能更新(包括环境检测逻辑)自动生效
124
- - ✅ **完全异步加载**:使用 `async` 属性,不阻塞页面渲染
123
+ 适用于 Vue、React、Webpack、Vite 等模块化打包项目。**仅需安装 `qb-pc-sdk`,无需单独安装或引入 `qb-pc-ad-sdk-origin`**(底层 SDK 已作为依赖自动集成)。
125
124
 
126
- **推荐所有客户使用此方式对接!**
125
+ ```bash
126
+ npm install qb-pc-sdk
127
+ ````
127
128
 
128
- **使用方法:**
129
+ **注意:** 对于静态 HTML 网站或建站平台,**强烈推荐使用 CDN 模式**,而不是 NPM 方式。
129
130
 
130
- ```html
131
- <script>
132
- (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;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));
133
- </script>
134
- ```
131
+ ### 方式一:NPM 接入(模块化项目)
135
132
 
136
- **架构说明:**
137
- - **内联代码**(客户复制粘贴):
138
- - 只负责容灾判断(2秒超时)和异步加载 `loader.min.js`
139
- - 代码极小(约 0.4KB),执行时间 < 1ms,几乎不阻塞页面
140
- - **客户只需复制粘贴一次,永久有效**
141
- - **loader.min.js**(从CDN自动加载,约 2.3KB):
142
- - 包含 Windows/Mac 环境检测逻辑
143
- - 包含加载 `core.min.js` 的完整逻辑和2秒超时机制
144
- - 主 CDN:`https://unpkg.com/qb-pc-sdk@latest/loader.min.js`
145
- - 备用 CDN:`https://file.qubiankeji.com/qb-pc-sdk/loader.min.js`
146
- - **自动热更新**:使用 `@latest` 自动获取最新版本,包含最新的环境检测逻辑
147
- - **core.min.js**(从CDN自动加载,约 300KB):
148
- - SDK核心功能
149
- - 主 CDN:`https://unpkg.com/qb-pc-sdk@latest/core.min.js`
150
- - 备用 CDN:`https://file.qubiankeji.com/qb-pc-sdk/core.min.js`
151
- - **自动热更新**:使用 `@latest` 自动获取最新版本
152
-
153
- **核心优势:**
154
- - ✅ **一次接入,永久有效**:客户只需复制粘贴一次内联代码,后续所有功能更新(包括环境检测逻辑、SDK功能)自动生效
155
- - ✅ **未来扩展无需修改**:如果未来支持 Mac 端展示广告,只需更新 `loader.min.js`,客户无需修改任何内联代码
156
- - ✅ **完全异步加载**:不阻塞页面渲染,不影响首屏加载速度
157
- - ✅ **推荐用于所有生产环境**
133
+ 适用于 Vue、React、Webpack、Vite 等模块化打包项目。**只需引入 `qb-pc-sdk`,无需再 `import qb-pc-ad-sdk-origin`**,底层 SDK 已内置在包内并自动挂载。
158
134
 
159
- ### NPM 方式(模块化项目推荐)
135
+ #### 1. 基本用法(ES6 模块)
160
136
 
161
- 适用于 Vue、React、Webpack、Vite 等模块化打包项目。
137
+ ```javascript
138
+ import AdSDK from "qb-pc-sdk";
162
139
 
163
- ```bash
164
- npm install qb-pc-sdk
140
+ const adSDK = new AdSDK({
141
+ appId: "your-app-id", // 必填,替换为平台申请的应用 ID
142
+ placementId: "your-placement-id", // 必填,替换为平台申请的广告位 ID
143
+ container: "#ad-container", // 必填,广告挂载的容器:CSS 选择器或 DOM 元素
144
+ onAdLoaded: (ad) => {
145
+ console.log("✅ 广告加载成功", ad);
146
+ const size = adSDK.getAdSize(); // 可获取当前广告尺寸
147
+ },
148
+ onAdError: (error, message) => {
149
+ console.error("❌ 广告加载失败", message);
150
+ },
151
+ onAdExpose: () => console.log("👀 广告已曝光"),
152
+ onAdClick: () => console.log("🖱️ 用户点击了广告"),
153
+ });
154
+
155
+ // 页面卸载或组件销毁时调用,避免内存泄漏
156
+ // adSDK.destroy();
165
157
  ```
166
158
 
167
- **注意:** 对于静态 HTML 网站或建站平台,**强烈推荐使用 CDN 内联代码模式**,而不是 NPM 方式。
159
+ **⚠️ 重要:容器必须在实例化时已存在于 DOM 中。**
160
+ 若传入的是选择器(如 `#ad-container`),则创建 `new AdSDK(...)` 时,该元素必须已经被渲染;否则 SDK 不会发起广告请求,广告不会展示。在 Vue/React 等框架中请务必在**容器已挂载后再创建实例**(见下方 Vue2/Vue3 示例)。
168
161
 
169
- ### 异步加载说明
162
+ #### 2. Vue 2 项目接入
170
163
 
171
- **内联引导器已完全支持异步加载:**
164
+ 在 Vue 2 中,请使用 **ref** 获取容器 DOM,并在 **mounted + $nextTick** 之后再创建 AdSDK,确保容器已渲染。
172
165
 
173
- 1. **内联代码本身**:代码极小(约 0.5KB),执行时间 < 1ms,几乎不阻塞页面
174
- 2. **loader.min.js 加载**:使用 `async = true` 异步加载,不阻塞页面渲染
175
- 3. **core.min.js 加载**:由 loader.min.js 异步加载,不阻塞页面渲染
176
- 4. **2秒超时保护**:如果主 CDN 2秒内没有响应,自动切换到备用 CDN,避免长时间等待
166
+ **示例:单文件组件**
177
167
 
178
- **推荐放置位置:**
179
- - ✅ **最佳**:放在 `</body>` 标签之前,页面内容先渲染
180
- - ✅ **也可以**:放在 `<head>` 中,由于代码极小且异步,影响很小
168
+ ```vue
169
+ <template>
170
+ <div class="ad-page">
171
+ <!-- 广告容器:必须设置 ref,并保证有宽高 -->
172
+ <div ref="adContainer" class="ad-container"></div>
173
+ </div>
174
+ </template>
181
175
 
182
- **示例(推荐放在页面底部):**
176
+ <script>
177
+ import AdSDK from "qb-pc-sdk";
178
+
179
+ export default {
180
+ name: "AdPage",
181
+ data() {
182
+ return {
183
+ adSDK: null,
184
+ };
185
+ },
186
+ mounted() {
187
+ this.$nextTick(() => {
188
+ // 必须在 nextTick 后执行,确保 ref 已指向真实 DOM
189
+ const container = this.$refs.adContainer;
190
+ if (!container) return;
191
+
192
+ this.adSDK = new AdSDK({
193
+ appId: "your-app-id",
194
+ placementId: "your-placement-id",
195
+ container: container, // 推荐传 DOM 元素,避免选择器在 SPA 中拿不到
196
+ onAdLoaded: (ad) => {
197
+ console.log("✅ 广告加载成功", ad);
198
+ },
199
+ onAdError: (error, message) => {
200
+ console.error("❌ 广告加载失败", message);
201
+ },
202
+ });
203
+ });
204
+ },
205
+ beforeDestroy() {
206
+ if (this.adSDK && typeof this.adSDK.destroy === "function") {
207
+ this.adSDK.destroy();
208
+ }
209
+ },
210
+ };
211
+ </script>
183
212
 
184
- ```html
185
- <!DOCTYPE html>
186
- <html>
187
- <head>
188
- <meta charset="UTF-8">
189
- <title>页面标题</title>
190
- </head>
191
- <body>
192
- <!-- 页面内容 -->
193
-
194
- <!-- 内联代码放在 </body> 之前(推荐) -->
195
- <script>
196
- (function(g){"use strict";...})();
197
- </script>
198
- </body>
199
- </html>
213
+ <style scoped>
214
+ .ad-container {
215
+ width: 400px;
216
+ height: 220px;
217
+ margin: 0 auto;
218
+ }
219
+ </style>
200
220
  ```
201
221
 
202
- ## 使用方法
222
+ #### 3. Vue 3 项目接入(Composition API)
203
223
 
204
- ### 方式一:NPM 接入(模块化项目)
224
+ Vue 3 中同样需要等容器挂载后再创建实例,使用 **ref + onMounted + nextTick**。
205
225
 
206
- 适用于 Vue、React、Webpack、Vite 等模块化打包项目。
226
+ **示例:`<script setup>`**
207
227
 
208
- #### ES6 模块导入
228
+ ```vue
229
+ <template>
230
+ <div class="ad-page">
231
+ <div ref="adContainerRef" class="ad-container"></div>
232
+ </div>
233
+ </template>
209
234
 
210
- ```javascript
211
- import AdSDK from 'qb-pc-sdk';
235
+ <script setup>
236
+ import { ref, onMounted, onBeforeUnmount, nextTick } from "vue";
237
+ import AdSDK from "qb-pc-sdk";
212
238
 
213
- // 使用
214
- const adSDK = new AdSDK({
215
- appId: 'your-app-id', // 替换为您在平台申请的应用ID
216
- placementId: 'your-placement-id', // 替换为您的在平台申请的广告位ID
217
- container: '#ad-container',
218
- onAdLoaded: (ad) => {
219
- console.log('✅ 广告加载成功', ad);
220
- },
221
- onAdError: (error, message) => {
222
- console.error('❌ 广告加载失败', error, message);
223
- },
224
- onAdExpose: () => {
225
- console.log('👀 广告已曝光');
226
- },
227
- onAdClick: () => {
228
- console.log('🖱️ 用户点击了广告');
239
+ const adContainerRef = ref(null);
240
+ let adSDK = null;
241
+
242
+ onMounted(() => {
243
+ nextTick(() => {
244
+ const container = adContainerRef.value;
245
+ if (!container) return;
246
+
247
+ adSDK = new AdSDK({
248
+ appId: "your-app-id",
249
+ placementId: "your-placement-id",
250
+ container: container,
251
+ onAdLoaded: (ad) => console.log("✅ 广告加载成功", ad),
252
+ onAdError: (error, message) => console.error("❌ 广告加载失败", message),
253
+ });
254
+ });
255
+ });
256
+
257
+ onBeforeUnmount(() => {
258
+ if (adSDK && typeof adSDK.destroy === "function") {
259
+ adSDK.destroy();
229
260
  }
230
261
  });
262
+ </script>
263
+
264
+ <style scoped>
265
+ .ad-container {
266
+ width: 400px;
267
+ height: 220px;
268
+ margin: 0 auto;
269
+ }
270
+ </style>
231
271
  ```
232
272
 
233
- #### Vue2 / Vue3 / React 等模块化环境
273
+ **Vue 3 Options API** 写法与 Vue 2 类似:在 `mounted` 里用 `this.$nextTick`,用 `this.$refs.xxx` 取容器,在 `beforeUnmount` 里调用 `adSDK.destroy()`。
234
274
 
235
- 在某些模块化打包环境中(如 Vue2),如果自动加载失败,需要手动引入底层 SDK 并挂载到 `window`:
275
+ #### 4. NPM 接入常见问题:广告不展示
236
276
 
237
- ```javascript
238
- // main.js 或入口文件
239
- import '';
240
- import AdSDK from 'qb-pc-sdk';
241
- import OriginSDK from 'qb-pc-ad-sdk-origin';
242
-
243
- // 确保 GDTAdSDK 挂载到 window(模块化环境可能需要手动挂载)
244
- if (typeof window !== 'undefined' && !window.GDTAdSDK) {
245
- window.GDTAdSDK = OriginSDK.default || OriginSDK.GDTAdSDK || OriginSDK;
246
- }
277
+ 若按上述方式接入后广告仍不展示,可按下面顺序排查:
247
278
 
248
- // 之后在组件中使用
249
- new AdSDK({
250
- appId: 'your-app-id',
251
- placementId: 'your-placement-id',
252
- container: '#ad-container',
253
- onAdLoaded: (ad) => console.log('✅ 广告加载成功', ad),
254
- onAdError: (error, message) => console.error('❌ 广告加载失败', error, message)
255
- });
256
- ```
279
+ | 可能原因 | 处理方式 |
280
+ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
281
+ | **容器在实例化时不存在** | 在 Vue/React 中必须在容器已挂载后再 `new AdSDK()`,例如在 `mounted` + `$nextTick`(Vue2)或 `onMounted` + `nextTick`(Vue3)中创建,并优先传 **DOM 元素**(ref)而不是选择器。 |
282
+ | **容器无宽高** | 给广告容器设置明确的 `width`、`height`(或通过布局保证有尺寸),否则广告可能不渲染。 |
283
+ | **非 Windows 环境** | 本 SDK 仅在 **Windows 系统**下加载广告,Mac/Linux/移动端会静默跳过,属正常行为。 |
284
+ | **appId / placementId 错误** | 确认从平台复制的应用 ID、广告位 ID 与配置一致,且无多余空格。 |
285
+ | **网络或接口异常** | 打开控制台查看是否有 `onAdError` 报错或网络请求失败;若出现 “SDK Load Timeout”,多为打包环境未正确包含底层依赖,可尝试重新安装:`npm install qb-pc-sdk --force`。 |
257
286
 
258
- > **提示**:如果遇到 "SDK Load Timeout" 错误,通常是 `window.GDTAdSDK` 未正确挂载,请按照上述方式手动挂载。
287
+ **总结:** NPM 接入只需 `import AdSDK from 'qb-pc-sdk'`,无需再引入 `qb-pc-ad-sdk-origin`;**保证在容器已存在于 DOM 且具有宽高时再创建 AdSDK 实例**,即可正常展示广告。
259
288
 
260
289
  ### 方式二:CDN 接入(静态 HTML 页面)
261
290
 
@@ -266,85 +295,80 @@ new AdSDK({
266
295
  ```html
267
296
  <!DOCTYPE html>
268
297
  <html lang="zh-CN">
269
- <head>
270
- <meta charset="UTF-8">
298
+ <head>
299
+ <meta charset="UTF-8" />
271
300
  <title>广告示例</title>
272
301
  <style>
273
- #ad-container {
274
- width: 400px;
275
- height: 220px;
276
- margin: 20px auto;
277
- }
302
+ #ad-container {
303
+ width: 400px;
304
+ height: 220px;
305
+ margin: 20px auto;
306
+ }
278
307
  </style>
279
- </head>
280
- <body>
308
+ </head>
309
+ <body>
281
310
  <div id="ad-container"></div>
311
+ <script src="https://unpkg.com/qb-pc-sdk@latest/core.min.js"></script>
282
312
 
283
- <!-- 内联版本,容灾100%达成(推荐) -->
284
- <script>
285
- (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;var ua=(w.navigator&&w.navigator.userAgent)||"",p=w.navigator.platform||"";if(/Android|iPhone|iPad|iPod|Mac|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua)||!/Win|Windows/i.test(ua+p))return;w._qbPcSdkLoading=true;var pr="https://unpkg.com/qb-pc-sdk@latest/core.min.js",fb="https://file.qubiankeji.com/qb-pc-sdk/core.min.js";var c=function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{setTimeout(function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK初始化失败"),AdSDK:null,GDTAdSDK:null}}));}},100);}};var l=function(p,f){if(d.querySelector('script[src="'+p+'"]')||(f&&d.querySelector('script[src="'+f+'"]'))){c();return;}var loaded=false;var timeoutId=setTimeout(function(){if(!loaded&&f&&!d.querySelector('script[src="'+f+'"]')){loaded=true;var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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=p;s.async=true;s.onload=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);c();}};s.onerror=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);if(f&&!d.querySelector('script[src="'+f+'"]')){var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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);};l(pr,fb);})(typeof window!=="undefined"?window:(typeof global!=="undefined"?global:this));
286
- </script>
287
-
288
313
  <!-- 使用 SDK -->
289
314
  <script>
290
- // 方式1:等待 SDK 加载完成事件(推荐)
291
- window.addEventListener('qb-pc-sdk-ready', function() {
315
+ // 方式1:等待 SDK 加载完成事件(推荐)
316
+ window.addEventListener("qb-pc-sdk-ready", function () {
317
+ const adSDK = new window.AdSDK({
318
+ appId: "your-app-id", // 替换为您在平台申请的应用ID
319
+ placementId: "your-placement-id", // 替换为您的在平台申请的广告位ID
320
+ container: "#ad-container",
321
+ onAdLoaded: (ad) => {
322
+ console.log("✅ 广告加载成功", ad);
323
+ },
324
+ onAdError: (error, message) => {
325
+ console.error("❌ 广告加载失败", error, message);
326
+ },
327
+ onAdExpose: () => {
328
+ console.log("👀 广告已曝光");
329
+ },
330
+ onAdClick: () => {
331
+ console.log("🖱️ 用户点击了广告");
332
+ },
333
+ });
334
+ });
335
+
336
+ // 方式2:在 DOMContentLoaded 后轮询检查(兼容性更好)
337
+ window.addEventListener("DOMContentLoaded", function () {
338
+ const checkSDK = setInterval(function () {
339
+ if (window.AdSDK) {
340
+ clearInterval(checkSDK);
341
+
292
342
  const adSDK = new window.AdSDK({
293
- appId: 'your-app-id', // 替换为您在平台申请的应用ID
294
- placementId: 'your-placement-id', // 替换为您的在平台申请的广告位ID
295
- container: '#ad-container',
296
- onAdLoaded: (ad) => {
297
- console.log('✅ 广告加载成功', ad);
298
- },
299
- onAdError: (error, message) => {
300
- console.error('❌ 广告加载失败', error, message);
301
- },
302
- onAdExpose: () => {
303
- console.log('👀 广告已曝光');
304
- },
305
- onAdClick: () => {
306
- console.log('🖱️ 用户点击了广告');
307
- }
343
+ appId: "your-app-id",
344
+ placementId: "your-placement-id",
345
+ container: "#ad-container",
346
+ onAdLoaded: (ad) => console.log("✅ 广告加载成功", ad),
347
+ onAdError: (error, message) =>
348
+ console.error("❌ 广告加载失败", error, message),
308
349
  });
309
- });
310
-
311
- // 方式2:在 DOMContentLoaded 后轮询检查(兼容性更好)
312
- window.addEventListener('DOMContentLoaded', function() {
313
- const checkSDK = setInterval(function() {
314
- if (window.AdSDK) {
315
- clearInterval(checkSDK);
316
-
317
- const adSDK = new window.AdSDK({
318
- appId: 'your-app-id',
319
- placementId: 'your-placement-id',
320
- container: '#ad-container',
321
- onAdLoaded: (ad) => console.log('✅ 广告加载成功', ad),
322
- onAdError: (error, message) => console.error('❌ 广告加载失败', error, message)
323
- });
324
- }
325
- }, 100);
326
-
327
- // 10秒超时
328
- setTimeout(function() {
329
- clearInterval(checkSDK);
330
- if (!window.AdSDK) {
331
- console.error('❌ SDK 加载超时,请检查网络连接');
332
- }
333
- }, 10000);
334
- });
350
+ }
351
+ }, 100);
352
+
353
+ // 10秒超时
354
+ setTimeout(function () {
355
+ clearInterval(checkSDK);
356
+ if (!window.AdSDK) {
357
+ console.error("❌ SDK 加载超时,请检查网络连接");
358
+ }
359
+ }, 10000);
360
+ });
335
361
  </script>
336
- </body>
362
+ </body>
337
363
  </html>
338
364
  ```
339
365
 
340
366
  #### CDN 版本指定
341
367
 
342
- **推荐使用内联代码模式,自动获取最新版本。**
343
368
 
344
369
  如果需要使用外部文件方式指定特定版本:
345
370
 
346
371
  ```html
347
- <!-- 使用最新版本(不推荐,建议使用内联模式) -->
348
372
  <script src="https://unpkg.com/qb-pc-sdk@latest/core.min.js"></script>
349
373
  ```
350
374
 
@@ -353,6 +377,7 @@ new AdSDK({
353
377
  专为**所有建站平台**设计的**零代码接入方式**,客户只需复制粘贴即可使用,无需任何技术背景。
354
378
 
355
379
  **支持的建站平台:**
380
+
356
381
  - ✅ **WordPress** - 在文章或页面中插入 HTML 代码块
357
382
  - ✅ **Discuz!** - 在模板文件中插入 HTML 代码(X3.5 及所有版本)
358
383
  - ✅ **其他 CMS** - Drupal、Joomla、Typecho、帝国CMS、织梦CMS、PHPCMS 等
@@ -362,242 +387,38 @@ new AdSDK({
362
387
  - ✅ **博客平台** - 新浪博客、网易博客、CSDN、博客园等(支持 HTML 编辑)
363
388
  - ✅ **普通 HTML 网站** - 任何支持 HTML 和 JavaScript 的网站
364
389
 
365
- **核心特点:** 纯 HTML + JavaScript,不依赖任何框架,适用于所有支持 HTML 的建站平台。
366
-
367
- #### 基本用法(一键复制粘贴)
368
-
369
- **步骤 1:** 复制以下代码(内联版本,容灾100%达成,推荐)
370
-
371
- ```html
372
- <ins class="qb-adsbyqubian"
373
- style="display:block; width:400px; height:220px;"
374
- data-app-id="your-app-id"
375
- data-placement-id="your-placement-id">
376
- </ins>
377
- <script>
378
- (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;var ua=(w.navigator&&w.navigator.userAgent)||"",p=w.navigator.platform||"";if(/Android|iPhone|iPad|iPod|Mac|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua)||!/Win|Windows/i.test(ua+p))return;w._qbPcSdkLoading=true;var pr="https://unpkg.com/qb-pc-sdk@latest/core.min.js",fb="https://file.qubiankeji.com/qb-pc-sdk/core.min.js";var c=function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{setTimeout(function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK初始化失败"),AdSDK:null,GDTAdSDK:null}}));}},100);}};var l=function(p,f){if(d.querySelector('script[src="'+p+'"]')||(f&&d.querySelector('script[src="'+f+'"]'))){c();return;}var loaded=false;var timeoutId=setTimeout(function(){if(!loaded&&f&&!d.querySelector('script[src="'+f+'"]')){loaded=true;var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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=p;s.async=true;s.onload=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);c();}};s.onerror=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);if(f&&!d.querySelector('script[src="'+f+'"]')){var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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);};l(pr,fb);})(typeof window!=="undefined"?window:(typeof global!=="undefined"?global:this));
379
- </script>
380
- <script>(window.qbAds = window.qbAds || []).push({});</script>
381
- ```
382
-
383
- **步骤 2:** 替换参数
384
- - 将 `your-app-id` 替换为您的应用 ID
385
- - 将 `your-placement-id` 替换为您的广告位 ID
386
- - 根据需要调整 `width` 和 `height`(广告位尺寸)
387
-
388
- **步骤 3:** 粘贴到您的网站
389
- - 在需要显示广告的位置粘贴代码
390
- - 保存并刷新页面即可看到广告
391
-
392
- **💡 提示:** 如果页面有多个广告位,脚本只需引入一次,放在页面底部即可。
393
-
394
390
  #### 多个广告位
395
391
 
396
392
  支持在同一个页面中插入多个广告位,每个广告位使用独立的 `<ins>` 标签:
397
393
 
398
394
  ```html
399
395
  <!-- 广告位 1:横幅广告 (728x90) -->
400
- <ins class="qb-adsbyqubian"
401
- style="display:block; width:728px; height:90px;"
402
- data-app-id="your-app-id"
403
- data-placement-id="your-placement-id-1">
396
+ <ins
397
+ class="qb-adsbyqubian"
398
+ style="display:block; width:728px; height:90px;"
399
+ data-app-id="your-app-id"
400
+ data-placement-id="your-placement-id-1"
401
+ >
404
402
  </ins>
405
403
 
406
404
  <!-- 广告位 2:中等尺寸 (400x220) -->
407
- <ins class="qb-adsbyqubian"
408
- style="display:block; width:400px; height:220px;"
409
- data-app-id="your-app-id"
410
- data-placement-id="your-placement-id-2">
405
+ <ins
406
+ class="qb-adsbyqubian"
407
+ style="display:block; width:400px; height:220px;"
408
+ data-app-id="your-app-id"
409
+ data-placement-id="your-placement-id-2"
410
+ >
411
411
  </ins>
412
412
 
413
413
  <!-- 广告位 3:窄条横幅 (780x60) -->
414
- <ins class="qb-adsbyqubian"
415
- style="display:block; width:780px; height:60px;"
416
- data-app-id="your-app-id"
417
- data-placement-id="your-placement-id-3">
418
- </ins>
419
-
420
- <!-- 脚本只需引入一次,放在页面底部即可(内联版本,容灾100%达成) -->
421
- <script>
422
- (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;var ua=(w.navigator&&w.navigator.userAgent)||"",p=w.navigator.platform||"";if(/Android|iPhone|iPad|iPod|Mac|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua)||!/Win|Windows/i.test(ua+p))return;w._qbPcSdkLoading=true;var pr="https://unpkg.com/qb-pc-sdk@latest/core.min.js",fb="https://file.qubiankeji.com/qb-pc-sdk/core.min.js";var c=function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{setTimeout(function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK初始化失败"),AdSDK:null,GDTAdSDK:null}}));}},100);}};var l=function(p,f){if(d.querySelector('script[src="'+p+'"]')||(f&&d.querySelector('script[src="'+f+'"]'))){c();return;}var loaded=false;var timeoutId=setTimeout(function(){if(!loaded&&f&&!d.querySelector('script[src="'+f+'"]')){loaded=true;var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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=p;s.async=true;s.onload=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);c();}};s.onerror=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);if(f&&!d.querySelector('script[src="'+f+'"]')){var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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);};l(pr,fb);})(typeof window!=="undefined"?window:(typeof global!=="undefined"?global:this));
423
- </script>
424
- <script>(window.qbAds = window.qbAds || []).push({});</script>
425
- ```
426
-
427
- #### 可选回调配置(高级用法)
428
-
429
- 如果需要监听广告加载、点击等事件,可以在 `push` 中传入回调函数:
430
-
431
- ```html
432
- <script>
433
- (window.qbAds = window.qbAds || []).push({
434
- onAdLoaded: function(ad, instance, element) {
435
- console.log('✅ 广告加载成功', element);
436
- // 可以在这里进行统计等操作
437
- },
438
- onAdError: function(err, msg, element) {
439
- console.error('❌ 广告加载失败', err, msg, element);
440
- // 可以在这里进行错误处理
441
- },
442
- onAdExpose: function(element) {
443
- console.log('👀 广告曝光', element);
444
- // 可以在这里进行曝光统计
445
- },
446
- onAdClick: function(element) {
447
- console.log('🖱️ 广告被点击', element);
448
- // 可以在这里进行点击统计
449
- }
450
- });
451
- </script>
452
- ```
453
-
454
- #### 参数说明
455
-
456
- | 参数 | 说明 | 必填 | 示例 |
457
- |------|------|------|------|
458
- | `class="qb-adsbyqubian"` | 必需的类名,用于标识广告位 | ✅ | `class="qb-adsbyqubian"` |
459
- | `data-app-id` | 您的应用 ID | ✅ | `data-app-id="1999336062823956569"` |
460
- | `data-placement-id` | 广告位 ID | ✅ | `data-placement-id="1999381081819709520"` |
461
- | `style` | 广告位尺寸样式 | 建议 | `style="display:block; width:400px; height:220px;"` |
462
-
463
- #### 特点
464
-
465
- - ✅ **零代码接入**:客户只需复制粘贴,无需技术背景
466
- - ✅ **自动适配**:广告会根据容器尺寸自动适配布局(横幅、中等、小尺寸)
467
- - ✅ **即插即用**:支持动态添加的广告位(SPA、Ajax 等场景)
468
- - ✅ **多广告位**:支持在同一个页面中插入多个广告位
469
- - ✅ **事件回调**:支持监听广告加载、点击、曝光等事件
470
-
471
- #### Discuz! 论坛接入详细步骤
472
-
473
- **Discuz! X3.5 及所有版本都支持接入,推荐使用最简单的方法二(广告位功能)。**
474
-
475
- ##### 方法一:使用 Discuz! 广告位功能(最简单,推荐!)
476
-
477
- **这是最简单的方法,不需要修改模板文件,适合所有用户:**
478
-
479
- 1. **登录 Discuz! 后台**
480
- - 访问:`http://您的域名/admin.php`
481
- - 输入管理员账号密码登录
482
-
483
- 2. **进入广告管理**
484
- - 点击左侧菜单:**运营** → **广告**
485
- - 或者直接访问:`http://您的域名/admin.php?action=adv&operation=ad&adtype=`
486
-
487
- 3. **添加新广告**
488
- - 点击 **添加广告** 按钮
489
- - 选择广告位类型(如:**页头通栏广告**、**页尾通栏广告** 等)
490
- - 填写广告名称(随便填,如:趣变广告)
491
-
492
- 4. **填写广告代码(包含脚本,一次搞定)**
493
- - 在 **广告 HTML 代码** 框中,粘贴以下**完整代码**(包含脚本,不需要单独找模板文件):
494
-
495
- ```html
496
- <ins class="qb-adsbyqubian"
497
- style="display:block; width:728px; height:90px; margin:10px auto;"
498
- data-app-id="your-app-id"
499
- data-placement-id="your-placement-id">
500
- </ins>
501
- <script>
502
- (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;var ua=(w.navigator&&w.navigator.userAgent)||"",p=w.navigator.platform||"";if(/Android|iPhone|iPad|iPod|Mac|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua)||!/Win|Windows/i.test(ua+p))return;w._qbPcSdkLoading=true;var pr="https://unpkg.com/qb-pc-sdk@latest/core.min.js",fb="https://file.qubiankeji.com/qb-pc-sdk/core.min.js";var c=function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{setTimeout(function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK初始化失败"),AdSDK:null,GDTAdSDK:null}}));}},100);}};var l=function(p,f){if(d.querySelector('script[src="'+p+'"]')||(f&&d.querySelector('script[src="'+f+'"]'))){c();return;}var loaded=false;var timeoutId=setTimeout(function(){if(!loaded&&f&&!d.querySelector('script[src="'+f+'"]')){loaded=true;var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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=p;s.async=true;s.onload=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);c();}};s.onerror=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);if(f&&!d.querySelector('script[src="'+f+'"]')){var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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);};l(pr,fb);})(typeof window!=="undefined"?window:(typeof global!=="undefined"?global:this));
503
- </script>
504
- <script>(window.qbAds = window.qbAds || []).push({});</script>
505
- ```
506
-
507
- - 将 `your-app-id` 和 `your-placement-id` 替换为您的实际 ID
508
- - **重要:** 把脚本代码也一起粘贴进去,这样就不需要找模板文件了!
509
-
510
- 5. **保存广告**
511
- - 点击 **提交** 保存广告
512
- - 返回后台首页,点击 **工具** → **更新缓存**
513
-
514
- 6. **完成!** 刷新前台页面即可看到广告
515
-
516
- **💡 提示:** 如果后续要添加更多广告位,只需要:
517
- - 再添加一个新广告,只粘贴 `<ins>` 标签部分(不需要再粘贴脚本)
518
- - 脚本已经在第一个广告中加载过了,后续广告会自动识别
519
-
520
- **⚠️ 重要:必须同时添加广告位标签和脚本!**
521
-
522
- 只添加脚本代码是不够的,还必须添加 `<ins class="qb-adsbyqubian">` 标签。完整步骤如下:
523
-
524
- 1. **在需要显示广告的位置添加广告位标签**(例如:在帖子内容区域、页面顶部等):
525
-
526
- ```html
527
- <ins class="qb-adsbyqubian"
528
- style="display:block; width:728px; height:90px; margin:10px auto;"
529
- data-app-id="your-app-id"
530
- data-placement-id="your-placement-id">
414
+ <ins
415
+ class="qb-adsbyqubian"
416
+ style="display:block; width:780px; height:60px;"
417
+ data-app-id="your-app-id"
418
+ data-placement-id="your-placement-id-3"
419
+ >
531
420
  </ins>
532
- ```
533
-
534
- 2. **在 footer.htm 中添加脚本**(只需添加一次,内联版本,容灾100%达成):
535
-
536
- ```html
537
- <script>
538
- (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;var ua=(w.navigator&&w.navigator.userAgent)||"",p=w.navigator.platform||"";if(/Android|iPhone|iPad|iPod|Mac|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua)||!/Win|Windows/i.test(ua+p))return;w._qbPcSdkLoading=true;var pr="https://unpkg.com/qb-pc-sdk@latest/core.min.js",fb="https://file.qubiankeji.com/qb-pc-sdk/core.min.js";var c=function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{setTimeout(function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK初始化失败"),AdSDK:null,GDTAdSDK:null}}));}},100);}};var l=function(p,f){if(d.querySelector('script[src="'+p+'"]')||(f&&d.querySelector('script[src="'+f+'"]'))){c();return;}var loaded=false;var timeoutId=setTimeout(function(){if(!loaded&&f&&!d.querySelector('script[src="'+f+'"]')){loaded=true;var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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=p;s.async=true;s.onload=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);c();}};s.onerror=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);if(f&&!d.querySelector('script[src="'+f+'"]')){var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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);};l(pr,fb);})(typeof window!=="undefined"?window:(typeof global!=="undefined"?global:this));
539
- </script>
540
- <script>(window.qbAds = window.qbAds || []).push({});</script>
541
- ```
542
-
543
- **如果广告没有显示,请检查:**
544
- - 是否添加了 `<ins class="qb-adsbyqubian">` 标签(必须添加)
545
- - `data-app-id` 和 `data-placement-id` 是否正确填写
546
- - 浏览器控制台(F12)是否有错误信息
547
- - Network 标签中是否成功加载了 SDK 文件
548
-
549
- ##### 方法二:在模板文件中插入(需要修改模板)
550
-
551
- **如果方法一找不到模板文件,可以尝试这个方法:**
552
-
553
- 1. **登录后台** → **界面** → **风格管理**
554
-
555
- 2. **找到当前使用的风格**
556
- - 看到风格列表后,找到当前正在使用的风格(通常显示为"默认"或"当前")
557
- - 点击该风格右侧的 **编辑** 按钮
558
-
559
- 3. **查找模板文件**
560
- - 左侧会显示文件列表,找到以下文件之一:
561
- - **footer.htm** - 页面底部(推荐,在文件末尾添加)
562
- - **header.htm** - 页面头部(在 `</head>` 之前添加)
563
- - **forum/viewthread.htm** - 帖子内容页(在帖子内容区域添加)
564
-
565
- 4. **如果还是找不到,使用 FTP 工具**
566
- - 使用 FTP 工具(如 FileZilla)连接服务器
567
- - 进入路径:`/template/当前风格名称/`
568
- - 找到 `footer.htm` 或 `header.htm` 文件
569
- - 下载到本地,用记事本打开编辑,再上传回去
570
-
571
- 5. **插入广告代码**
572
- - 在合适位置插入广告代码(见方法一的第4步)
573
- - 在 `</body>` 标签之前添加脚本(见方法一的第5步)
574
- - 保存文件
575
-
576
- 6. **清除缓存**
577
- - 后台 → **工具** → **更新缓存**
578
-
579
- ##### 方法三:最简单的方法(如果以上都不会)
580
-
581
- **如果以上方法都不会操作,可以联系技术人员帮忙,或者使用以下最简单的方法:**
582
-
583
- 1. **在任意帖子或页面中插入代码**
584
- - 发一个新帖子,或者编辑现有帖子
585
- - 切换到 **HTML 模式**(如果支持)
586
- - 粘贴完整的广告代码(包括脚本):
587
-
588
- ```html
589
- <ins class="qb-adsbyqubian"
590
- style="display:block; width:728px; height:90px; margin:10px auto;"
591
- data-app-id="your-app-id"
592
- data-placement-id="your-placement-id">
593
- </ins>
594
- <script>
595
- (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;var ua=(w.navigator&&w.navigator.userAgent)||"",p=w.navigator.platform||"";if(/Android|iPhone|iPad|iPod|Mac|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua)||!/Win|Windows/i.test(ua+p))return;w._qbPcSdkLoading=true;var pr="https://unpkg.com/qb-pc-sdk@latest/core.min.js",fb="https://file.qubiankeji.com/qb-pc-sdk/core.min.js";var c=function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{setTimeout(function(){if(w.GDTAdSDK&&w.AdSDK){w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{AdSDK:w.AdSDK,GDTAdSDK:w.GDTAdSDK}}));}else{w._qbPcSdkLoading=false;w.dispatchEvent(new CustomEvent("qb-pc-sdk-ready",{detail:{error:new Error("SDK初始化失败"),AdSDK:null,GDTAdSDK:null}}));}},100);}};var l=function(p,f){if(d.querySelector('script[src="'+p+'"]')||(f&&d.querySelector('script[src="'+f+'"]'))){c();return;}var loaded=false;var timeoutId=setTimeout(function(){if(!loaded&&f&&!d.querySelector('script[src="'+f+'"]')){loaded=true;var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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=p;s.async=true;s.onload=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);c();}};s.onerror=function(){if(!loaded){loaded=true;clearTimeout(timeoutId);if(f&&!d.querySelector('script[src="'+f+'"]')){var fs=d.createElement("script");fs.src=f;fs.async=true;fs.onload=c;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);};l(pr,fb);})(typeof window!=="undefined"?window:(typeof global!=="undefined"?global:this));
596
- </script>
597
- <script>(window.qbAds = window.qbAds || []).push({});</script>
598
- ```
599
-
600
- - 发布帖子,广告就会显示在该帖子中
421
+ - 发布帖子,广告就会显示在该帖子中
601
422
 
602
423
  **注意:** 这种方法只会在特定帖子中显示广告,不会在整个网站显示。
603
424
 
@@ -703,7 +524,7 @@ new AdSDK({
703
524
  ### 构造函数
704
525
 
705
526
  ```javascript
706
- new AdSDK(config)
527
+ new AdSDK(config);
707
528
  ```
708
529
 
709
530
  #### 参数
@@ -724,15 +545,15 @@ new AdSDK(config)
724
545
 
725
546
  ```javascript
726
547
  const adSDK = new AdSDK({
727
- appId: 'your-app-id',
728
- placementId: 'your-placement-id',
729
- container: '#ad-container'
548
+ appId: "your-app-id",
549
+ placementId: "your-placement-id",
550
+ container: "#ad-container",
730
551
  });
731
552
 
732
- // 在广告加载成功后获取尺寸
553
+ // 在广告加载成功后获取尺寸
733
554
  adSDK.onAdLoaded = (ad) => {
734
555
  const size = adSDK.getAdSize();
735
- console.log('广告尺寸:', size);
556
+ console.log("广告尺寸:", size);
736
557
  // 输出: { imageWidth: 640, imageHeight: 360, hasVideo: false, videoUrl: undefined }
737
558
  };
738
559
  ```
@@ -750,9 +571,9 @@ adSDK.onAdLoaded = (ad) => {
750
571
 
751
572
  ```javascript
752
573
  const adSDK = new AdSDK({
753
- appId: 'your-app-id',
754
- placementId: 'your-placement-id',
755
- container: '#ad-container'
574
+ appId: "your-app-id",
575
+ placementId: "your-placement-id",
576
+ container: "#ad-container",
756
577
  });
757
578
 
758
579
  // 销毁广告
@@ -789,33 +610,33 @@ adSDK.destroy();
789
610
  ### NPM 方式示例
790
611
 
791
612
  ```javascript
792
- import AdSDK from 'qb-pc-sdk';
613
+ import AdSDK from "qb-pc-sdk";
793
614
 
794
615
  const adSDK = new AdSDK({
795
- appId: 'your-app-id',
796
- placementId: 'your-placement-id',
797
- container: '#ad-container',
616
+ appId: "your-app-id",
617
+ placementId: "your-placement-id",
618
+ container: "#ad-container",
798
619
  onAdLoaded: (ad) => {
799
- console.log('✅ 广告加载成功');
620
+ console.log("✅ 广告加载成功");
800
621
  // 获取广告尺寸
801
622
  const size = adSDK.getAdSize();
802
- console.log('广告尺寸:', size);
623
+ console.log("广告尺寸:", size);
803
624
  },
804
625
  onAdError: (error, message) => {
805
- console.error('❌ 广告加载失败:', message);
626
+ console.error("❌ 广告加载失败:", message);
806
627
  },
807
628
  onAdExpose: () => {
808
- console.log('👀 广告已曝光');
629
+ console.log("👀 广告已曝光");
809
630
  },
810
631
  onAdClick: () => {
811
- console.log('🖱️ 用户点击了广告');
812
- }
632
+ console.log("🖱️ 用户点击了广告");
633
+ },
813
634
  });
814
635
 
815
636
  // 销毁广告示例
816
637
  // 方式1:点击广告右上角的关闭按钮(自动销毁)
817
638
  // 方式2:手动调用 destroy 方法
818
- document.getElementById('close-ad-btn').addEventListener('click', () => {
639
+ document.getElementById("close-ad-btn").addEventListener("click", () => {
819
640
  adSDK.destroy();
820
641
  });
821
642
 
@@ -862,7 +683,7 @@ useEffect(() => {
862
683
 
863
684
  ## 依赖
864
685
 
865
- - `qb-pc-ad-sdk-origin`: 底层广告 SDK(已自动在浏览器环境加载)
686
+ - `qb-pc-ad-sdk-origin`: 底层广告 SDK,作为 `qb-pc-sdk` 的 npm 依赖自动安装;**接入时只需使用 `qb-pc-sdk`,无需单独安装或 import 该包**。
866
687
 
867
688
  ## License
868
689