nodebb-plugin-ezoic-infinite 1.7.24 → 1.7.26
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/package.json +1 -1
- package/public/client.js +58 -13
package/package.json
CHANGED
package/public/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* NodeBB Ezoic Infinite Ads — client.js
|
|
2
|
+
* NodeBB Ezoic Infinite Ads — client.js v32
|
|
3
3
|
*
|
|
4
4
|
* Historique des corrections majeures
|
|
5
5
|
* ────────────────────────────────────
|
|
@@ -31,6 +31,18 @@
|
|
|
31
31
|
*
|
|
32
32
|
* v29 Fix ancrage topics : data-index → data-tid.
|
|
33
33
|
*
|
|
34
|
+
* v32 Retour anchorAttr = data-index pour ezoic-ad-between (comme v20.1).
|
|
35
|
+
* data-tid peut être absent sur li[component="category/topic"] → clés
|
|
36
|
+
* invalides → wraps empilés sur pos0. data-index est toujours présent.
|
|
37
|
+
* pruneOrphansBetween cherche li[data-index="N"] — cohérent avec v20.1.
|
|
38
|
+
*
|
|
39
|
+
* v31 pruneOrphans réactivé UNIQUEMENT pour ezoic-ad-between (topics de catégorie).
|
|
40
|
+
* NodeBB NE virtualise PAS les topics dans une liste de catégorie — les ancres
|
|
41
|
+
* restent dans le DOM entre les scrolls. pruneOrphans est donc safe ici et
|
|
42
|
+
* c'est lui qui empêche l'empilement des pubs en haut après un scroll long.
|
|
43
|
+
* Pour ezoic-ad-message (posts de topic), pruneOrphans reste désactivé car
|
|
44
|
+
* NodeBB virtualise les posts hors-viewport → faux-orphelins → bug réinjection.
|
|
45
|
+
*
|
|
34
46
|
* v30 Fix adjacentWrap : ne compte plus les wraps orphelins (ancre hors DOM).
|
|
35
47
|
* Quand NodeBB virtualise et retire des topics du DOM, les wraps restent
|
|
36
48
|
* en place (div dans le ul). adjacentWrap(el) retournait true sur ces
|
|
@@ -91,7 +103,7 @@
|
|
|
91
103
|
*/
|
|
92
104
|
const KIND = {
|
|
93
105
|
'ezoic-ad-message': { sel: SEL.post, baseTag: '', anchorAttr: 'data-pid', ordinalAttr: 'data-index' },
|
|
94
|
-
'ezoic-ad-between': { sel: SEL.topic, baseTag: 'li', anchorAttr: 'data-
|
|
106
|
+
'ezoic-ad-between': { sel: SEL.topic, baseTag: 'li', anchorAttr: 'data-index', ordinalAttr: 'data-index' },
|
|
95
107
|
'ezoic-ad-categories': { sel: SEL.category, baseTag: 'li', anchorAttr: 'data-cid', ordinalAttr: null },
|
|
96
108
|
};
|
|
97
109
|
|
|
@@ -319,15 +331,45 @@
|
|
|
319
331
|
} catch (_) {}
|
|
320
332
|
}
|
|
321
333
|
|
|
322
|
-
// ── Prune
|
|
334
|
+
// ── Prune (topics de catégorie uniquement) ────────────────────────────────
|
|
335
|
+
//
|
|
336
|
+
// pruneOrphans est réactivé UNIQUEMENT pour 'ezoic-ad-between'.
|
|
337
|
+
//
|
|
338
|
+
// Pourquoi safe pour les topics ?
|
|
339
|
+
// NodeBB ne virtualise PAS la liste des topics dans une catégorie.
|
|
340
|
+
// Les <li component="category/topic"> restent dans le DOM pendant toute
|
|
341
|
+
// la session. Leurs ancres (data-tid) sont donc stables — un wrap orphelin
|
|
342
|
+
// signifie vraiment que le topic a été retiré (navigation, filtre, etc.).
|
|
323
343
|
//
|
|
324
|
-
//
|
|
325
|
-
//
|
|
326
|
-
//
|
|
327
|
-
//
|
|
344
|
+
// Pourquoi désactivé pour les posts ?
|
|
345
|
+
// NodeBB virtualise les posts hors-viewport : il retire les <li> du DOM
|
|
346
|
+
// puis les réinsère au scroll retour. pruneOrphans verait des ancres
|
|
347
|
+
// absentes → supprimerait les wraps → réinjection en haut au scroll retour.
|
|
328
348
|
//
|
|
329
|
-
//
|
|
330
|
-
|
|
349
|
+
// MIN_PRUNE_AGE_MS : délai de grâce après création (stabilisation du DOM).
|
|
350
|
+
|
|
351
|
+
const MIN_PRUNE_AGE_MS = 8_000;
|
|
352
|
+
|
|
353
|
+
function pruneOrphansBetween() {
|
|
354
|
+
const klass = 'ezoic-ad-between';
|
|
355
|
+
const cfg = KIND[klass];
|
|
356
|
+
|
|
357
|
+
document.querySelectorAll(`.${WRAP_CLASS}.${klass}`).forEach(w => {
|
|
358
|
+
// Délai de grâce : ne pas pruner un wrap trop récent
|
|
359
|
+
const created = parseInt(w.getAttribute(A_CREATED) || '0', 10);
|
|
360
|
+
if (ts() - created < MIN_PRUNE_AGE_MS) return;
|
|
361
|
+
|
|
362
|
+
const key = w.getAttribute(A_ANCHOR) ?? '';
|
|
363
|
+
const sid = key.slice(klass.length + 1); // partie après "ezoic-ad-between:"
|
|
364
|
+
if (!sid) { mutate(() => dropWrap(w)); return; }
|
|
365
|
+
|
|
366
|
+
// Chercher l'ancre par data-tid
|
|
367
|
+
const anchorEl = document.querySelector(`${cfg.baseTag}[${cfg.anchorAttr}="${sid}"]`);
|
|
368
|
+
if (!anchorEl || !anchorEl.isConnected) {
|
|
369
|
+
mutate(() => dropWrap(w));
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
}
|
|
331
373
|
|
|
332
374
|
|
|
333
375
|
// ── Injection ──────────────────────────────────────────────────────────────
|
|
@@ -520,10 +562,13 @@
|
|
|
520
562
|
'ezoic-ad-message', getPosts,
|
|
521
563
|
cfg.enableMessageAds, cfg.messageIntervalPosts, cfg.showFirstMessageAd, 'posts'
|
|
522
564
|
);
|
|
523
|
-
if (kind === 'categoryTopics')
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
565
|
+
if (kind === 'categoryTopics') {
|
|
566
|
+
pruneOrphansBetween(); // nettoie les wraps dont le topic a disparu du DOM
|
|
567
|
+
return exec(
|
|
568
|
+
'ezoic-ad-between', getTopics,
|
|
569
|
+
cfg.enableBetweenAds, cfg.intervalPosts, cfg.showFirstTopicAd, 'topics'
|
|
570
|
+
);
|
|
571
|
+
}
|
|
527
572
|
return exec(
|
|
528
573
|
'ezoic-ad-categories', getCategories,
|
|
529
574
|
cfg.enableCategoryAds, cfg.intervalCategories, cfg.showFirstCategoryAd, 'categories'
|