nodebb-plugin-ezoic-infinite 1.5.98 → 1.5.99

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/public/client.js +67 -45
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebb-plugin-ezoic-infinite",
3
- "version": "1.5.98",
3
+ "version": "1.5.99",
4
4
  "description": "Production-ready Ezoic infinite ads integration for NodeBB 4.x",
5
5
  "main": "library.js",
6
6
  "license": "MIT",
package/public/client.js CHANGED
@@ -1344,70 +1344,92 @@ function buildOrdinalMap(items) {
1344
1344
 
1345
1345
 
1346
1346
 
1347
-
1348
-
1349
-
1350
- // ===== V7.1 soft up-scroll purge for ezoic-ad-between =====
1347
+ // ===== V8 between-cap-per-window =====
1351
1348
  (function () {
1352
- var lastY = window.pageYOffset || document.documentElement.scrollTop || 0;
1353
1349
  var ticking = false;
1354
- var lastPurgeTs = 0;
1355
- var PURGE_COOLDOWN_MS = 350;
1350
+ var lastRun = 0;
1351
+ var RUN_COOLDOWN = 220; // ms
1352
+
1353
+ // Keep at most N between-wraps per vertical band around viewport
1354
+ var BAND_PX = 900;
1355
+ var MAX_PER_BAND = 2;
1356
1356
 
1357
- function softPurgeBetweenWraps() {
1357
+ function capBetweenWraps() {
1358
1358
  var now = Date.now();
1359
- if (now - lastPurgeTs < PURGE_COOLDOWN_MS) return;
1360
- lastPurgeTs = now;
1359
+ if (now - lastRun < RUN_COOLDOWN) return;
1360
+ lastRun = now;
1361
1361
 
1362
- var viewportTop = window.pageYOffset || document.documentElement.scrollTop || 0;
1363
- var keepBuffer = 240; // garde les pubs proches du viewport pour éviter le "clignotement"
1362
+ var wraps;
1363
+ try { wraps = Array.prototype.slice.call(document.querySelectorAll('.nodebb-ezoic-wrap.ezoic-ad-between')); }
1364
+ catch (e) { return; }
1364
1365
 
1365
- try {
1366
- document.querySelectorAll('.nodebb-ezoic-wrap.ezoic-ad-between').forEach(function (w) {
1367
- try {
1368
- var r = w.getBoundingClientRect();
1369
- var absBottom = viewportTop + r.bottom;
1370
- // SOFT: supprimer uniquement les wraps largement au-dessus du viewport
1371
- if (absBottom < (viewportTop - keepBuffer)) {
1372
- w.remove();
1373
- }
1374
- } catch (e) {}
1366
+ if (!wraps.length) return;
1367
+
1368
+ var y = window.pageYOffset || document.documentElement.scrollTop || 0;
1369
+ var viewportTop = y;
1370
+ var viewportBottom = y + (window.innerHeight || document.documentElement.clientHeight || 0);
1371
+
1372
+ // Priorité: conserver ce qui est proche/visible, limiter le reste par bande
1373
+ var buckets = Object.create(null);
1374
+
1375
+ wraps.forEach(function (w) {
1376
+ try {
1377
+ var r = w.getBoundingClientRect();
1378
+ var absTop = y + r.top;
1379
+ var absBottom = y + r.bottom;
1380
+
1381
+ var inOrNearViewport = (absBottom >= viewportTop - 200) && (absTop <= viewportBottom + 200);
1382
+ var band = Math.floor(absTop / BAND_PX);
1383
+ var key = String(band);
1384
+
1385
+ if (!buckets[key]) buckets[key] = [];
1386
+ buckets[key].push({
1387
+ node: w,
1388
+ absTop: absTop,
1389
+ absBottom: absBottom,
1390
+ inOrNearViewport: inOrNearViewport
1391
+ });
1392
+ } catch (e) {}
1393
+ });
1394
+
1395
+ Object.keys(buckets).forEach(function (k) {
1396
+ var arr = buckets[k];
1397
+ // garde d'abord proche/visible, puis les plus récents (data-created), puis position
1398
+ arr.sort(function (a, b) {
1399
+ if (a.inOrNearViewport !== b.inOrNearViewport) return a.inOrNearViewport ? -1 : 1;
1400
+ var ac = parseInt((a.node.getAttribute('data-created') || '0'), 10);
1401
+ var bc = parseInt((b.node.getAttribute('data-created') || '0'), 10);
1402
+ if (ac !== bc) return bc - ac; // garder plus récent
1403
+ return a.absTop - b.absTop;
1375
1404
  });
1376
- } catch (e) {}
1405
+
1406
+ for (var i = MAX_PER_BAND; i < arr.length; i++) {
1407
+ try { arr[i].node.remove(); } catch (e) {}
1408
+ }
1409
+ });
1377
1410
  }
1378
1411
 
1379
- function onScroll() {
1412
+ function scheduleCap() {
1380
1413
  if (ticking) return;
1381
1414
  ticking = true;
1382
1415
  requestAnimationFrame(function () {
1383
- var y = window.pageYOffset || document.documentElement.scrollTop || 0;
1384
- var dy = y - lastY;
1385
-
1386
- // uniquement quand on remonte franchement
1387
- if (dy < -12) {
1388
- softPurgeBetweenWraps();
1389
- }
1390
-
1391
- lastY = y;
1416
+ try { capBetweenWraps(); } catch (e) {}
1392
1417
  ticking = false;
1393
1418
  });
1394
1419
  }
1395
1420
 
1396
- window.addEventListener('scroll', onScroll, { passive: true });
1397
-
1398
- // nettoyage doux après chargement infini / navigation ajax
1399
- function postLoadSoftPurge() {
1400
- setTimeout(softPurgeBetweenWraps, 0);
1401
- setTimeout(softPurgeBetweenWraps, 220);
1402
- setTimeout(softPurgeBetweenWraps, 600);
1403
- }
1421
+ window.addEventListener('scroll', scheduleCap, { passive: true });
1422
+ window.addEventListener('resize', scheduleCap, { passive: true });
1404
1423
 
1405
1424
  if (window.jQuery) {
1406
- window.jQuery(window).on('action:ajaxify.end action:infiniteScroll.loaded', postLoadSoftPurge);
1425
+ window.jQuery(window).on('action:ajaxify.end action:infiniteScroll.loaded', function () {
1426
+ setTimeout(scheduleCap, 0);
1427
+ setTimeout(scheduleCap, 200);
1428
+ setTimeout(scheduleCap, 700);
1429
+ });
1407
1430
  }
1408
1431
 
1409
- // premier passage
1410
- setTimeout(softPurgeBetweenWraps, 0);
1432
+ setTimeout(scheduleCap, 0);
1411
1433
  })();
1412
- // ===== /V7.1 =====
1434
+ // ===== /V8 =====
1413
1435