Если вы часто сидите в одном длинном диалоге с ChatGPT, то наверняка замечали: сначала всё работает нормально, а потом чат начинает подвисать, дёргаться, медленно прокручиваться и иногда даже тормозить при вводе текста.
Причина чаще всего простая: чем длиннее переписка, тем больше сообщений браузер держит прямо на странице. Весь этот огромный чат остаётся в DOM, а значит браузеру приходится постоянно отрисовывать, пересчитывать и хранить большое количество элементов. Чем больше текста и сообщений в одном диалоге, тем тяжелее становится странице, особенно если чат очень длинный.
Проще говоря: проблема не всегда в самом ChatGPT, а в том, что браузеру становится тяжело тянуть огромную ленту сообщений.
Как это исправить
Есть простой способ разгрузить страницу: убрать из DOM старые сообщения и оставить только последние. Тогда браузеру становится легче, и чат начинает работать заметно быстрее.
Делается это через консоль браузера.
Нажимаете F12, открываете вкладку Console и вставляете туда специальный скрипт.
Если консоль открыта впервые, браузер может не дать сразу вставить код. Тогда нужно вручную ввести команду:
allow pasting
После этого можно вставлять сам код:
(() => {
'use strict';
// Если уже запущен — сначала аккуратно выключаем старую копию
if (window.__chatgptAntiLagPro?.cleanup) {
window.__chatgptAntiLagPro.cleanup();
}
const CONFIG = {
KEEP_LAST: 2, // сколько последних сообщений держать в DOM
NEAR_BOTTOM_PX: 220, // считать, что пользователь "внизу" чата
PANEL_RIGHT: 20,
PANEL_BOTTOM: 20
};
const state = {
enabled: true,
archived: [], // [{ node, parent, nextSibling }]
placeholder: null,
observer: null,
rafScheduled: false,
restoring: false,
hiddenCount: 0
};
function getMessages() {
return Array.from(document.querySelectorAll('[data-message-author-role]'));
}
function isConnectedNode(node) {
return !!node && node.isConnected;
}
function isNearBottom() {
const scroller =
document.scrollingElement ||
document.documentElement ||
document.body;
const distance = scroller.scrollHeight - (scroller.scrollTop + window.innerHeight);
return distance <= CONFIG.NEAR_BOTTOM_PX;
}
function makePlaceholder() {
const wrap = document.createElement('div');
wrap.id = 'chatgpt-anti-lag-pro-placeholder';
wrap.style.cssText = [
'margin:12px auto',
'max-width:900px',
'padding:10px 12px',
'border:1px solid rgba(127,127,127,.25)',
'border-radius:12px',
'background:rgba(127,127,127,.08)',
'color:inherit',
'font:13px/1.4 sans-serif',
'opacity:.95'
].join(';');
const top = document.createElement('div');
top.style.cssText = 'display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap';
const text = document.createElement('div');
text.id = 'chatgpt-anti-lag-pro-text';
text.textContent = 'Ранние сообщения скрыты';
const actions = document.createElement('div');
actions.style.cssText = 'display:flex;gap:8px;flex-wrap:wrap';
const restoreBtn = document.createElement('button');
restoreBtn.textContent = 'Показать всё';
restoreBtn.style.cssText = buttonCss();
restoreBtn.onclick = () => restoreAll();
const disableBtn = document.createElement('button');
disableBtn.textContent = 'Выключить Anti-Lag';
disableBtn.style.cssText = buttonCss();
disableBtn.onclick = () => {
state.enabled = false;
restoreAll();
updatePanel();
};
actions.appendChild(restoreBtn);
actions.appendChild(disableBtn);
top.appendChild(text);
top.appendChild(actions);
wrap.appendChild(top);
return wrap;
}
function buttonCss() {
return [
'border:0',
'border-radius:10px',
'padding:7px 10px',
'cursor:pointer',
'background:#2b2b2b',
'color:#fff',
'font:12px sans-serif'
].join(';');
}
function updatePlaceholder() {
if (!state.placeholder) return;
const text = state.placeholder.querySelector('#chatgpt-anti-lag-pro-text');
if (text) {
text.textContent = `Скрыто ранних сообщений: ${state.hiddenCount}`;
}
}
function ensurePlaceholder(beforeNode) {
if (!state.placeholder) {
state.placeholder = makePlaceholder();
}
if (!state.placeholder.isConnected && beforeNode?.parentNode) {
beforeNode.parentNode.insertBefore(state.placeholder, beforeNode);
}
updatePlaceholder();
}
function removePlaceholderIfEmpty() {
if (state.hiddenCount === 0 && state.placeholder?.isConnected) {
state.placeholder.remove();
}
}
function archiveOldMessages() {
if (!state.enabled || state.restoring) return;
const messages = getMessages();
if (messages.length <= CONFIG.KEEP_LAST) {
removePlaceholderIfEmpty();
return;
}
const toArchive = messages.slice(0, messages.length - CONFIG.KEEP_LAST)
.filter(node => node !== state.placeholder);
if (!toArchive.length) return;
const keepScrollPinned = isNearBottom();
const anchor = toArchive[0];
ensurePlaceholder(anchor);
for (const node of toArchive) {
if (!isConnectedNode(node)) continue;
if (node === state.placeholder) continue;
state.archived.push({
node,
parent: node.parentNode,
nextSibling: node.nextSibling
});
node.remove();
state.hiddenCount += 1;
}
updatePlaceholder();
updatePanel();
if (keepScrollPinned) {
requestAnimationFrame(() => {
window.scrollTo(0, document.documentElement.scrollHeight);
});
}
}
function restoreAll() {
if (state.restoring) return;
state.restoring = true;
try {
for (const item of state.archived) {
const { node, parent, nextSibling } = item;
if (!node || !parent) continue;
if (nextSibling && nextSibling.parentNode === parent) {
parent.insertBefore(node, nextSibling);
} else {
parent.appendChild(node);
}
}
state.archived = [];
state.hiddenCount = 0;
if (state.placeholder?.isConnected) {
state.placeholder.remove();
}
updatePanel();
} finally {
state.restoring = false;
}
}
function updatePanel() {
const count = document.getElementById('chatgpt-anti-lag-pro-count');
const toggle = document.getElementById('chatgpt-anti-lag-pro-toggle');
const keep = document.getElementById('chatgpt-anti-lag-pro-keep');
if (count) count.textContent = String(state.hiddenCount);
if (toggle) toggle.textContent = state.enabled ? 'ON' : 'OFF';
if (keep) keep.textContent = String(CONFIG.KEEP_LAST);
updatePlaceholder();
}
function scheduleTrim() {
if (state.rafScheduled) return;
state.rafScheduled = true;
requestAnimationFrame(() => {
state.rafScheduled = false;
archiveOldMessages();
});
}
function createPanel() {
const old = document.getElementById('chatgpt-anti-lag-pro-panel');
if (old) old.remove();
const panel = document.createElement('div');
panel.id = 'chatgpt-anti-lag-pro-panel';
panel.style.cssText = [
'position:fixed',
`right:${CONFIG.PANEL_RIGHT}px`,
`bottom:${CONFIG.PANEL_BOTTOM}px`,
'z-index:2147483647',
'background:rgba(17,17,17,.96)',
'color:#fff',
'padding:12px 14px',
'border-radius:14px',
'font:13px/1.4 sans-serif',
'box-shadow:0 10px 30px rgba(0,0,0,.35)',
'min-width:220px',
'backdrop-filter:blur(6px)'
].join(';');
panel.innerHTML = `
<div style="font-weight:700;margin-bottom:8px;">⚡ Anti-Lag Pro</div>
<div style="margin-bottom:4px;">Скрыто: <span id="chatgpt-anti-lag-pro-count">0</span></div>
<div style="margin-bottom:10px;">Держать в DOM: <span id="chatgpt-anti-lag-pro-keep">${CONFIG.KEEP_LAST}</span></div>
<div style="display:flex;gap:8px;flex-wrap:wrap;">
<button id="chatgpt-anti-lag-pro-toggle" style="${buttonCss()}">ON</button>
<button id="chatgpt-anti-lag-pro-show" style="${buttonCss()}">Показать всё</button>
<button id="chatgpt-anti-lag-pro-stop" style="${buttonCss()}">Стоп</button>
</div>
`;
document.body.appendChild(panel);
document.getElementById('chatgpt-anti-lag-pro-toggle').onclick = () => {
state.enabled = !state.enabled;
if (!state.enabled) {
restoreAll();
} else {
scheduleTrim();
}
updatePanel();
};
document.getElementById('chatgpt-anti-lag-pro-show').onclick = () => {
restoreAll();
};
document.getElementById('chatgpt-anti-lag-pro-stop').onclick = () => {
cleanup();
};
}
function cleanup() {
try {
state.enabled = false;
if (state.observer) {
state.observer.disconnect();
}
restoreAll();
const panel = document.getElementById('chatgpt-anti-lag-pro-panel');
if (panel) panel.remove();
if (state.placeholder?.isConnected) {
state.placeholder.remove();
}
} finally {
delete window.__chatgptAntiLagPro;
}
}
createPanel();
state.observer = new MutationObserver(() => {
scheduleTrim();
});
state.observer.observe(document.body, {
childList: true,
subtree: true
});
window.__chatgptAntiLagPro = {
cleanup,
restoreAll,
state,
config: CONFIG
};
scheduleTrim();
updatePanel();
console.log('⚡ Anti-Lag Pro started');
})();
Что делает этот скрипт
Он автоматически скрывает старые сообщения из страницы и оставляет в DOM только несколько последних. За счёт этого снижается нагрузка на браузер, и длинный чат перестаёт так сильно тормозить.
При этом скрипт добавляет маленькую панель управления, где можно:
- включить или выключить режим;
- показать все сообщения обратно;
- полностью остановить скрипт.
То есть это не удаление чата, а просто временная разгрузка страницы.
Почему это помогает
Потому что браузеру уже не нужно постоянно держать перед глазами всю огромную переписку. Чем меньше элементов остаётся в DOM, тем легче работает интерфейс.
Особенно хорошо это помогает в очень длинных чатах, где сообщений уже много и страница начинает откровенно лагать.
Безопасно ли это
Коротко: да, если вы вставляете именно этот код.
Он не отправляет данные куда-то на сторону, не ворует аккаунт, не просит пароль и не лезет за пределы открытой страницы. Он просто работает с отображением сообщений внутри текущей вкладки.
Но общее правило простое: в консоль нельзя вставлять непонятный код из случайных источников. Если код проверенный и вы понимаете, что он делает, тогда использовать можно спокойно.
Что можно изменить в коде под себя
Если хотите, чтобы на экране оставалось больше видимых сообщений, нужно изменить вот эту строку:
KEEP_LAST: 2
Цифра 2 означает, что в DOM будут оставаться только два последних сообщения, а более ранние скрипт будет скрывать.
Например:
- KEEP_LAST: 5 — оставить 5 последних сообщений
- KEEP_LAST: 10 — оставить 10 последних сообщений
- KEEP_LAST: 20 — оставить 20 последних сообщений
Чем больше число, тем больше сообщений будет видно одновременно.
Итог
Если ChatGPT начинает виснуть в длинном диалоге, проблема часто в том, что браузер перегружается из-за слишком большой ленты сообщений. Этот скрипт решает проблему просто: скрывает старые сообщения из DOM, разгружает страницу и делает чат заметно быстрее.
Для тех, кто работает с длинными переписками каждый день, это реально удобное решение.