Next.js-如何确保<;标题>;是否在触发历史记录更改事件时设置?
在我的Next.js应用程序中,我将使用推荐的方法为各个页面设置Next.js-如何确保<;标题>;是否在触发历史记录更改事件时设置?,next.js,Next.js,在我的Next.js应用程序中,我将使用推荐的方法为各个页面设置标记: import Head from 'next/head' export default () => <> <Head><title>My page title</title></Head> </> 在页面之间导航时,您应该注意URL和标题经常不匹配。URL的价值总是正确的,但标题的价值无处不在。它可以有: 正确的值 它在上一页上的值
标记:
import Head from 'next/head'
export default () => <>
<Head><title>My page title</title></Head>
</>
在页面之间导航时,您应该注意URL和标题经常不匹配。URL的价值总是正确的,但标题的价值无处不在。它可以有:
- 正确的值
- 它在上一页上的值
- 毫无价值
/pages/
下组件的第一次呈现
谢谢 这是一个小技巧
setTimeout(()=>{console.log(document.title)},0)
我找到了一个解决办法,截取发送到window.dataLayer.push的事件,并在事件为gtm.historyChange
的情况下添加一秒延迟
这是我的GtagScript
组件,我正在\u document.js
下添加到
:
export const GtagScript = () => {
function intercept() {
const scriptTag = document.querySelector('#gtm-js');
if (scriptTag !== null)
scriptTag.addEventListener('load', () => {
window.dataLayer.pushOrig = window.dataLayer.push;
window.dataLayer.push = (e) => {
if (e.event === 'gtm.historyChange') {
setTimeout(function () {
window.dataLayer.pushOrig(e);
console.log(`URL: ${window.location.href} Title: ${document.title}`);
}, 1000);
} else {
window.dataLayer.pushOrig(e);
}
};
});
}
return <>
<script
id="gtm-js"
async
src={`https://www.googletagmanager.com/gtm.js?id=${GA_TRACKING_ID}`}
/>
<script
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${GA_TRACKING_ID}');
${intercept.toString()}
intercept();`
}}
/>
</>
};
export const GtagScript=()=>{
函数截距(){
const scriptTag=document.querySelector('#gtm js');
if(scriptTag!==null)
scriptTag.addEventListener('load',()=>{
window.dataLayer.pushOrig=window.dataLayer.push;
window.dataLayer.push=(e)=>{
如果(e.event==='gtm.historyChange'){
setTimeout(函数(){
window.dataLayer.pushOrig(e);
log(`URL:${window.location.href}Title:${document.Title}`);
}, 1000);
}否则{
window.dataLayer.pushOrig(e);
}
};
});
}
返回
};
我将等待一段时间,看看是否有一个正式的修复来自ZEIT团队。我的解决方案实际上没有回答这个问题。它不设置
,它只是延迟事件,这不是最优的。您可以使用setInterval
const firstPageViewEvent = setInterval(() => {
if (document.title) {
// send pageview event
clearInterval(firstPageViewEvent);
}
}, 200);
“黑客”可以工作(延迟更大),但问题是我们无法控制GTM如何检测历史更改事件。因此,即使我们的代码得到了正确的标题,GTM也得到了错误的值。@Andrei检查一下,他们报告它在5.1.0
中工作。但最新版本(7
,8
)似乎有倒退。无论如何,我通过截获发送到window.dataLayer.push
的事件并在事件为gtm.historyChange
@Andrei发布您的解决方案作为答案解决了这个问题。有时,时间加载页面将超过1000毫秒。它不起作用了。
const firstPageViewEvent = setInterval(() => {
if (document.title) {
// send pageview event
clearInterval(firstPageViewEvent);
}
}, 200);