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.
- package/package.json +1 -1
- package/public/client.js +67 -45
package/package.json
CHANGED
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
|
|
1355
|
-
var
|
|
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
|
|
1357
|
+
function capBetweenWraps() {
|
|
1358
1358
|
var now = Date.now();
|
|
1359
|
-
if (now -
|
|
1360
|
-
|
|
1359
|
+
if (now - lastRun < RUN_COOLDOWN) return;
|
|
1360
|
+
lastRun = now;
|
|
1361
1361
|
|
|
1362
|
-
var
|
|
1363
|
-
|
|
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
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
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
|
-
|
|
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
|
|
1412
|
+
function scheduleCap() {
|
|
1380
1413
|
if (ticking) return;
|
|
1381
1414
|
ticking = true;
|
|
1382
1415
|
requestAnimationFrame(function () {
|
|
1383
|
-
|
|
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',
|
|
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',
|
|
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
|
-
|
|
1410
|
-
setTimeout(softPurgeBetweenWraps, 0);
|
|
1432
|
+
setTimeout(scheduleCap, 0);
|
|
1411
1433
|
})();
|
|
1412
|
-
// ===== /
|
|
1434
|
+
// ===== /V8 =====
|
|
1413
1435
|
|