商品番号:TikTok41
質問者名:kococara
質問内容:(() => {
// ========= スクロール・midashi 対象要素取得 =========
const scroller = document.querySelector('.scroll-listing'); // スクロール対象の外枠
const gridList = scroller?.querySelector('.jet-listing-grid__items'); // Listing Grid の中身
const midashi = document.querySelector('.hidden-midashi'); // 「まだ質問はありません」など
// ========= スクロール最下部へ移動する関数 =========
const scrollToBottom = (behavior = 'smooth') => {
if (!scroller) return;
scroller.scrollTo({
top: scroller.scrollHeight,
behavior
});
};
// ========= Midashi 表示切り替え(空なら表示) =========
const toggleMidashi = () => {
if (!scroller || !midashi) return;
const hasItem = scroller.querySelector('.jet-listing-grid__item');
midashi.style.display = hasItem ? 'none' : 'block';
};
// ========= フォーム初期化(ボタン制御・送信後リセット) =========
document.querySelectorAll('.jet-form-builder').forEach(form => {
const textarea = form.querySelector('textarea');
const button = form.querySelector('[type="submit"]');
if (!textarea || !button) return;
// 入力チェックしてボタン制御
const toggleButton = () => {
const isBlank = textarea.value.trim() === '';
button.disabled = isBlank;
button.style.opacity = isBlank ? '0.5' : '1';
button.style.cursor = isBlank ? 'not-allowed' : 'pointer';
};
textarea.addEventListener('input', toggleButton);
toggleButton();
// 送信成功時にフォーム状態リセット
document.addEventListener('jet-form-builder/ajax/on-success', e => {
if (e.detail?.form !== form) return;
textarea.value = '';
toggleButton();
form.classList.remove('jet-form-builder__locked');
button.disabled = true;
button.classList.remove(
'jet-form-builder__submit--loading',
'jet-form-builder__submit--disabled',
'jet-form-builder__submit--success'
);
});
});
// ========= テキストエリアの高さ自動調整(複数行対応) =========
document.querySelectorAll('textarea.auto-grow').forEach(textarea => {
const wrapper = textarea.closest('.form-wrapper');
if (!wrapper) return;
const BASE = 50, PAD = 30;
// 高さ反映処理
const setH = h => {
textarea.style.height = h + 'px';
wrapper.style.height = h + PAD + 'px';
};
setH(BASE);
// 入力による高さ調整
textarea.addEventListener('input', () => {
const lines = textarea.value.replace(/n+$/, '').split('n').length;
if (lines {
textarea.value = '';
setH(BASE);
});
});
// ========= Grid に新しい投稿が追加されたときスクロール =========
if (scroller && gridList) {
const observer = new MutationObserver(mutations => {
const added = mutations.some(m =>
[...m.addedNodes].some(n =>
n.nodeType === 1 && n.matches('.jet-listing-grid__item')
)
);
if (added) {
toggleMidashi(); // Midashi 表示切り替え
setTimeout(() => scrollToBottom('smooth'), 200); // 少し待ってからスクロール
}
});
observer.observe(gridList, { childList: true, subtree: true });
}
// ========= JetFormBuilder送信成功時:Grid更新+スクロール =========
document.addEventListener('jet-form-builder/ajax/on-success', () => {
// SmartFilters を通じて再取得
if (window.JetSmartFilters?.setProviderRefresh) {
window.JetSmartFilters.setProviderRefresh('chat-provider');
}
// Midashiとスクロールを少し遅延して実行
setTimeout(() => {
toggleMidashi();
scrollToBottom('smooth');
}, 600);
});
// ========= ページ初回ロード時:Midashi確認+スクロール =========
window.addEventListener('load', () => {
toggleMidashi();
setTimeout(() => scrollToBottom('auto'), 500);
});
})();
// ========= ボタンクリック時にmidashi強制非表示(フォーム送信前でも) =========
document.addEventListener('DOMContentLoaded', () => {
const form = document.querySelector('.jet-form-builder');
const button = form?.querySelector('[type="submit"]');
const midashi = document.querySelector('.hidden-midashi.chat-empty');
if (form && button && midashi) {
button.addEventListener('click', () => {
midashi.style.setProperty('display', 'none', 'important');
midashi.classList.add('force-hidden');
});
}
});
// ========= textarea単独の高さ初期化と入力でのリサイズ =========
document.addEventListener('DOMContentLoaded', function () {
const textarea = document.querySelector('.jet-form-builder textarea');
const formWrapper = document.querySelector('.form-wrapper');
const BASE_HEIGHT = 50;
if (!textarea) return;
// 初期高さ
textarea.style.height = BASE_HEIGHT + 'px';
textarea.style.overflow = 'hidden';
// 入力で高さ変化
const autoResize = () => {
textarea.style.height = BASE_HEIGHT + 'px'; // 一度リセット
textarea.style.height = textarea.scrollHeight + 'px';
formWrapper.style.height = ''; // wrapperも初期化
};
textarea.addEventListener('input', autoResize);
// 送信成功後にリセット
document.addEventListener('jet-form-builder/ajax/on-success', () => {
textarea.value = '';
textarea.style.height = BASE_HEIGHT + 'px';
formWrapper.style.height = '';
});
});
回答案内:まだ回答されていません。