{"id":48915,"date":"2026-03-15T11:03:47","date_gmt":"2026-03-15T03:03:47","guid":{"rendered":"https:\/\/www.geobok.com\/geo-toolkit\/page-geo-health-report\/"},"modified":"2026-04-03T11:08:59","modified_gmt":"2026-04-03T03:08:59","slug":"page-geo-health-report","status":"publish","type":"page","link":"https:\/\/www.geobok.com\/en\/geo-toolkit\/page-geo-health-report\/","title":{"rendered":"Page GEO Health Report"},"content":{"rendered":"\n<style>\n\/* ===== C3 \u7279\u6709\u6837\u5f0f ===== *\/\n\n\/* \u68c0\u6d4b\u9879\u5361\u7247 *\/\n.fr-checks { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 12px; margin-bottom: 24px; }\n.fr-check { padding: 16px; border-radius: var(--geo-radius-md); border: 1px solid var(--geo-border); background: #fff; text-align: center; }\n.fr-check__icon { font-size: 24px; margin-bottom: 6px; }\n.fr-check__name { font-size: 13px; font-weight: 600; color: var(--geo-text-body); margin-bottom: 8px; }\n.fr-check__status { font-size: 12px; font-weight: 700; padding: 3px 12px; border-radius: var(--geo-radius-pill); display: inline-block; }\n.fr-st--pass { background: var(--geo-success-bg); color: #166534; }\n.fr-st--warn { background: var(--geo-warn-bg); color: #92400e; }\n.fr-st--fail { background: var(--geo-danger-bg); color: #991b1b; }\n.fr-st--info { background: var(--geo-info-bg); color: #075985; }\n\n\/* Lighthouse \u73af\u5f62\u56fe\uff08\u590d\u7528 RAG \u5de5\u5177\u6837\u5f0f\uff09 *\/\n.fr-lh-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 24px; }\n.fr-lh-card { background: #fff; border: 1px solid var(--geo-border); border-radius: 12px; padding: 16px 10px; text-align: center; }\n.fr-lh-ring { width: 80px; height: 80px; margin: 0 auto 6px; }\n.fr-lh-label { font-size: 12px; color: var(--geo-text-muted); font-weight: 600; }\n\n\/* \u6f0f\u6597\u6307\u6807 *\/\n.fr-funnel { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 12px; margin-bottom: 24px; }\n.fr-metric { background: #fff; border: 1px solid var(--geo-border); border-radius: 12px; padding: 14px 10px; text-align: center; }\n.fr-metric.highlight { background: linear-gradient(180deg,#f0f9ff,#e0f2fe); border-color: #7dd3fc; }\n.fr-metric__val { font-size: 22px; font-weight: 800; color: var(--geo-text-primary); }\n.fr-metric__label { font-size: 11px; color: var(--geo-text-muted); margin-top: 4px; }\n\n\/* Meta \u8868\u683c *\/\n.fr-meta-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 24px; }\n.fr-meta-item { padding: 14px; border-radius: var(--geo-radius-sm); border: 1px solid var(--geo-border); background: var(--geo-bg-page); }\n.fr-meta-key { font-size: 12px; font-weight: 700; color: var(--geo-text-faint); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px; }\n.fr-meta-val { font-size: 14px; color: var(--geo-text-body); line-height: 1.5; word-break: break-all; }\n.fr-meta-note { font-size: 11px; color: var(--geo-text-faint); margin-top: 4px; }\n\n\/* JS \u4f9d\u8d56\u6761 *\/\n.fr-jsbar { height: 14px; background: var(--geo-border); border-radius: 7px; overflow: hidden; margin: 10px 0; }\n.fr-jsbar__fill { height: 100%; border-radius: 7px; transition: width 0.8s; }\n\n\/* \u53cc\u680f\u5185\u5bb9\u533a *\/\n.fr-two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 30px; margin-top: 16px; }\n\n@media (max-width: 1024px) { .fr-two-col { grid-template-columns: 1fr; } }\n@media (max-width: 768px) {\n    .fr-lh-grid { grid-template-columns: repeat(2, 1fr); }\n    .fr-checks { grid-template-columns: 1fr 1fr; }\n    .fr-meta-grid { grid-template-columns: 1fr; }\n}\n@media (max-width: 480px) {\n    .fr-checks { grid-template-columns: 1fr; }\n}\n<\/style>\n\n<div class=\"geo-card\" id=\"fr-wrapper\">\n    <div class=\"geo-hero\">\n        <h2 class=\"geo-hero__title\">\ud83c\udfe5 GEO Health Report<\/h2>\n        <p class=\"geo-hero__desc\">Enter a URL for a comprehensive AI visibility report: Lighthouse, robots.txt, Schema, Meta, JS rendering, token SNR, and chunking.<\/p>\n    \n<div class=\"geo-about\">\n    <details class=\"geo-about__section\">\n        <summary>\ud83d\udcd6 What can this tool do?<\/summary>\n        <div class=\"geo-about__body\">\n            <p>One URL, multiple checks \u2014 modeled on the 30-Minute Self-Check Checklist from Chapter 4. Runs Lighthouse scoring, robots.txt audit, Schema analysis, token SNR, and chunk breakdown, all in parallel.<\/p>\n            <p class=\"geo-about__ref\">See <em>Make AI Speak for You: The Definitive Guide to GEO<\/em>, Ch. 4.9<\/p>\n        <\/div>\n    <\/details>\n    <details class=\"geo-about__section\">\n        <summary>\u2753 FAQ: GEO Impact<\/summary>\n        <div class=\"geo-about__body\">\n            <div class=\"geo-faq-item\"><h4>Which checklist items does this cover?<\/h4><p>Currently: TTFB\/performance (Lighthouse), robots.txt, Schema, token SNR, chunk analysis. Coming soon: JS rendering check, heading hierarchy, semantic tag audit.<\/p><\/div>\n            <div class=\"geo-faq-item\"><h4>Which metrics matter most?<\/h4><p>In priority order: Are AI crawlers blocked? (critical) \u2192 Performance OK? \u2192 Schema deployed? \u2192 Token SNR healthy?<\/p><\/div>\n            <div class=\"geo-faq-item\"><h4>All green \u2014 am I done?<\/h4><p>A clean foundation is step one. You still need answer-block engineering (Ch. 5), content optimization (Ch. 6), and ongoing monitoring (Ch. 8).<\/p><\/div>\n        <\/div>\n    <\/details>\n<\/div>\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Which checklist items does this cover?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Currently: TTFB\/performance (Lighthouse), robots.txt, Schema, token SNR, chunk analysis. Coming soon: JS rendering check, heading hierarchy, semantic tag audit.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Which metrics matter most?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"In priority order: Are AI crawlers blocked? (critical) \u2192 Performance OK? \u2192 Schema deployed? \u2192 Token SNR healthy?\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"All green \u2014 am I done?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"A clean foundation is step one. You still need answer-block engineering (Ch. 5), content optimization (Ch. 6), and ongoing monitoring (Ch. 8).\"\n      }\n    }\n  ]\n}\n<\/script>\n\n<\/div>\n\n    <div class=\"geo-action\">\n        <div class=\"geo-input-row\">\n            <input type=\"url\" id=\"fr-url\" class=\"geo-input\" placeholder=\"Enter page URL, e.g. https:\/\/example.com\/product\/123\">\n            <button id=\"fr-btn\" class=\"geo-btn\">Generate health report<\/button>\n        <\/div>\n    <\/div>\n\n    <div class=\"geo-progress\" id=\"fr-progress\">\n        <div class=\"geo-progress__track\"><div id=\"fr-pbar\" class=\"geo-progress__bar\"><\/div><\/div>\n        <div id=\"fr-ptext\" class=\"geo-progress__text\"><\/div>\n    <\/div>\n\n    <div id=\"fr-result\" class=\"geo-result\" style=\"padding: 0 var(--geo-space-xl) var(--geo-space-xl);\"><\/div>\n<\/div>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function(){\n    var btn = document.getElementById('fr-btn');\n    var result = document.getElementById('fr-result');\n    var progress = GeoAPI.initProgress(document.getElementById('fr-pbar'), document.getElementById('fr-ptext'));\n\n    var STEPS = [GeoAPI.t('report.s1'),GeoAPI.t('report.s2'),GeoAPI.t('report.s3'),GeoAPI.t('report.s4'),GeoAPI.t('report.s5'),GeoAPI.t('report.s6')];\n\n    btn.addEventListener('click', async function(){\n        var url = document.getElementById('fr-url').value.trim();\n        if(!url.startsWith('http')){ GeoAPI.showError(result, '\u8bf7\u8f93\u5165\u5b8c\u6574\u7684 URL'); return; }\n\n        GeoAPI.disableBtn(btn, GeoAPI.t('btn.generating'));\n        result.style.display = 'none'; result.classList.remove('geo-result--visible');\n        progress.show(); progress.update(5, STEPS[0]);\n\n        var pct = 5;\n        var timer = setInterval(function(){\n            pct = Math.min(pct + 0.4, 93);\n            progress.update(pct, STEPS[Math.min(Math.floor(pct\/16), STEPS.length-1)]);\n        }, 800);\n\n        try {\n            var d = await GeoAPI.post('\/geo\/full-report', { url: url }, { timeout: 300000 });\n            clearInterval(timer); progress.update(100, '\u2705 \u62a5\u544a\u751f\u6210\u5b8c\u6210');\n            setTimeout(function(){ progress.hide(); }, 400);\n            document.getElementById('fr-wrapper').classList.add('geo-card--expanded');\n            renderReport(d);\n        } catch(e) {\n            clearInterval(timer); progress.hide();\n            if(!e._geoAuthHandled) GeoAPI.showError(result, '\u4f53\u68c0\u5931\u8d25: ' + e.message);\n        } finally { GeoAPI.enableBtn(btn); }\n    });\n\n    function circleHtml(score, label){\n        var r=36, c=2*Math.PI*r, o=c*(1-(score\/100));\n        var col = score>=90?'#10b981':score>=50?'#f59e0b':'#ef4444';\n        return '<div class=\"fr-lh-card\"><svg class=\"fr-lh-ring\" viewBox=\"0 0 90 90\"><circle cx=\"45\" cy=\"45\" r=\"'+r+'\" fill=\"none\" stroke=\"#e2e8f0\" stroke-width=\"7\"\/><circle cx=\"45\" cy=\"45\" r=\"'+r+'\" fill=\"none\" stroke=\"'+col+'\" stroke-width=\"7\" stroke-dasharray=\"'+c+'\" stroke-dashoffset=\"'+o+'\" stroke-linecap=\"round\" transform=\"rotate(-90 45 45)\"\/><text x=\"45\" y=\"52\" text-anchor=\"middle\" font-size=\"20\" font-weight=\"800\" fill=\"#334155\">'+parseInt(score)+'<\/text><\/svg><div class=\"fr-lh-label\">'+GeoAPI.escapeHtml(label)+'<\/div><\/div>';\n    }\n\n    function stCls(ok, warn){ return ok ? 'fr-st--pass' : (warn ? 'fr-st--warn' : 'fr-st--fail'); }\n    function stText(ok, warn){ return ok ? '\u901a\u8fc7' : (warn ? '\u9700\u5173\u6ce8' : '\u672a\u901a\u8fc7'); }\n\n    function renderReport(d) {\n        var html = '';\n        var rb = d.robots_check || {};\n        var sc = d.schema_check || {};\n        var mc = d.meta_check || {};\n        var ab = d.answer_block_detected || {};\n        var js = d.js_rendering_check || {};\n        var lh = d.lighthouse || {};\n        var hc = d.heading_check || {};\n        var st = d.semantic_tags || {};\n        var isEn = GeoAPI.LANG === 'en';\n\n        \/* ======== 1. \u68c0\u6d4b\u9879\u603b\u89c8\u5361\u7247 ======== *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">' + (isEn ? '\ud83d\udccb Check Overview' : '\ud83d\udccb \u68c0\u6d4b\u9879\u603b\u89c8') + '<\/h3><\/div>';\n        html += '<div class=\"fr-checks\">';\n\n        var rbOk = rb.overall_status === 'ok';\n        var scOk = sc.status === 'good';\n        var metaOk = mc.title_ok && mc.description_ok;\n        var jsOk = js.risk_level === 'low';\n        var abOk = ab.found && ab.has_specific_data;\n        var hcOk = hc.status === 'good';\n        var stOk = st.status === 'good';\n\n        function checkLabel(zh, en) { return isEn ? en : zh; }\n\n        html += '<div class=\"fr-check\"><div class=\"fr-check__icon\">\ud83e\udd16<\/div><div class=\"fr-check__name\">' + checkLabel('AI \u722c\u866b\u51c6\u5165','AI Crawler Access') + '<\/div><span class=\"fr-check__status '+stCls(rbOk, rb.overall_status==='warning')+'\">'+stText(rbOk, rb.overall_status==='warning')+'<\/span><\/div>';\n        html += '<div class=\"fr-check\"><div class=\"fr-check__icon\">\u26a1<\/div><div class=\"fr-check__name\">' + checkLabel('JS \u6e32\u67d3\u4f9d\u8d56','JS Rendering') + '<\/div><span class=\"fr-check__status '+stCls(jsOk, js.risk_level==='medium')+'\">'+stText(jsOk, js.risk_level==='medium')+'<\/span><\/div>';\n        html += '<div class=\"fr-check\"><div class=\"fr-check__icon\">\ud83c\udff7\ufe0f<\/div><div class=\"fr-check__name\">' + checkLabel('H \u6807\u7b7e\u5c42\u7ea7','Heading Hierarchy') + '<\/div><span class=\"fr-check__status '+stCls(hcOk, hc.status==='warning')+'\">'+stText(hcOk, hc.status==='warning')+'<\/span><\/div>';\n        html += '<div class=\"fr-check\"><div class=\"fr-check__icon\">\ud83d\udce6<\/div><div class=\"fr-check__name\">' + checkLabel('\u8bed\u4e49\u6807\u7b7e','Semantic Tags') + '<\/div><span class=\"fr-check__status '+stCls(stOk, false)+'\">'+stText(stOk, false)+'<\/span><\/div>';\n        html += '<div class=\"fr-check\"><div class=\"fr-check__icon\">\ud83c\udfd7\ufe0f<\/div><div class=\"fr-check__name\">' + checkLabel('Schema \u6807\u6ce8','Schema Markup') + '<\/div><span class=\"fr-check__status '+stCls(scOk, sc.status==='fair')+'\">'+stText(scOk, sc.status==='fair')+'<\/span><\/div>';\n        html += '<div class=\"fr-check\"><div class=\"fr-check__icon\">\ud83d\udcdd<\/div><div class=\"fr-check__name\">' + checkLabel('Meta \u4fe1\u606f','Meta Info') + '<\/div><span class=\"fr-check__status '+stCls(metaOk, mc.title_ok||mc.description_ok)+'\">'+stText(metaOk, mc.title_ok||mc.description_ok)+'<\/span><\/div>';\n        html += '<div class=\"fr-check\"><div class=\"fr-check__icon\">\ud83c\udfaf<\/div><div class=\"fr-check__name\">' + checkLabel('\u9996\u5c4f\u7b54\u6848\u5757','Answer Block') + '<\/div><span class=\"fr-check__status '+stCls(abOk, ab.found)+'\">'+stText(abOk, ab.found)+'<\/span><\/div>';\n        html += '<\/div>';\n\n        \/* ======== 2. Lighthouse ======== *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\u26a1 Lighthouse \u6027\u80fd\u8bc4\u4f30<\/h3><\/div>';\n        html += '<div class=\"fr-lh-grid\">'\n              + circleHtml(lh.performance||0, '\u6027\u80fd')\n              + circleHtml(lh.accessibility||0, '\u65e0\u969c\u788d')\n              + circleHtml(lh.best_practices||0, '\u6700\u4f73\u5b9e\u8df5')\n              + circleHtml(lh.seo||0, 'SEO')\n              + '<\/div>';\n\n        \/* ======== 3. Token \u6f0f\u6597 ======== *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\ud83e\udde0 Token \u4fe1\u566a\u6bd4\u6f0f\u6597<\/h3><\/div>';\n        html += '<div class=\"fr-funnel\">';\n        html += '<div class=\"fr-metric\"><div class=\"fr-metric__val\">'+GeoAPI.formatNumber(d.raw_tokens)+'<\/div><div class=\"fr-metric__label\">\u539f\u59cb Tokens<\/div><\/div>';\n        html += '<div class=\"fr-metric highlight\"><div class=\"fr-metric__val\">'+GeoAPI.formatPercent(d.snr)+'<\/div><div class=\"fr-metric__label\">\u4fe1\u566a\u6bd4 (SNR)<\/div><\/div>';\n        html += '<div class=\"fr-metric\"><div class=\"fr-metric__val\">'+GeoAPI.formatNumber(d.clean_tokens)+'<\/div><div class=\"fr-metric__label\">\u6709\u6548 Tokens<\/div><\/div>';\n        html += '<div class=\"fr-metric\"><div class=\"fr-metric__val\">'+GeoAPI.formatPercent(d.lost_ratio)+'<\/div><div class=\"fr-metric__label\">\u6ea2\u51fa\u4e22\u5931<\/div><\/div>';\n        html += '<div class=\"fr-metric\"><div class=\"fr-metric__val\">'+(d.total_chunks_count||0)+'<\/div><div class=\"fr-metric__label\">\u5207\u7247\u6570\u91cf<\/div><\/div>';\n        html += '<\/div>';\n\n        \/* ======== 4. AI \u722c\u866b\u51c6\u5165\u8be6\u60c5 ======== *\/\n        if(rb.crawlers && rb.crawlers.length > 0) {\n            html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\ud83e\udd16 AI \u722c\u866b\u51c6\u5165\u8be6\u60c5<\/h3>'\n                  + '<span class=\"geo-section__desc\">' + GeoAPI.escapeHtml(rb.overall_msg||'') + '<\/span><\/div>';\n            html += '<div class=\"geo-table-wrap\"><table class=\"geo-table\"><thead><tr><th>\u722c\u866b<\/th><th>\u5e73\u53f0<\/th><th>\u72b6\u6001<\/th><th>\u5339\u914d\u89c4\u5219<\/th><\/tr><\/thead><tbody>';\n            rb.crawlers.forEach(function(c){\n                var cls = c.status==='allowed'?'geo-badge--success':c.status==='blocked'?'geo-badge--danger':'geo-badge--warn';\n                var txt = c.status==='allowed'?'\u5141\u8bb8':c.status==='blocked'?'\u5c01\u9501':'\u90e8\u5206';\n                html += '<tr><td style=\"font-weight:600;\">'+GeoAPI.escapeHtml(c.name)+'<\/td>'\n                      + '<td>'+GeoAPI.escapeHtml(c.org)+'<\/td>'\n                      + '<td><span class=\"geo-badge '+cls+'\" style=\"font-size:11px;padding:2px 10px;\">'+txt+'<\/span><\/td>'\n                      + '<td style=\"font-family:var(--geo-font-mono);font-size:12px;white-space:normal;\">'+GeoAPI.escapeHtml(c.matched_rule||'\u2014')+'<\/td><\/tr>';\n            });\n            html += '<\/tbody><\/table><\/div>';\n        }\n\n        \/* ======== 5. Schema \u68c0\u6d4b ======== *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\ud83c\udfd7\ufe0f Schema \u7ed3\u6784\u5316\u6570\u636e<\/h3><\/div>';\n        if(sc.found_count > 0) {\n            html += '<div style=\"margin-bottom:12px;\"><span class=\"geo-badge geo-badge--success\">\u5df2\u68c0\u6d4b\u5230 '+sc.found_count+' \u79cd<\/span> '\n                  + sc.found_types.map(function(t){ return '<code style=\"background:var(--geo-bg-page);padding:2px 6px;border-radius:3px;font-size:12px;margin:2px;\">'+GeoAPI.escapeHtml(t)+'<\/code>'; }).join(' ')\n                  + '<\/div>';\n        } else {\n            html += '<div class=\"geo-error\" style=\"margin-bottom:12px;\">\u672a\u68c0\u6d4b\u5230\u4efb\u4f55 Schema \u6807\u6ce8\uff0c\u5efa\u8bae\u81f3\u5c11\u6dfb\u52a0 Article + FAQPage<\/div>';\n        }\n        if(sc.missing_high_priority && sc.missing_high_priority.length > 0) {\n            html += '<div style=\"font-size:14px;color:var(--geo-warn);margin-bottom:16px;\">\u26a0 \u7f3a\u5931\u9ad8\u4f18\u5148\u7ea7\uff1a' + sc.missing_high_priority.join('\u3001') + '<\/div>';\n        }\n\n        \/* ======== 6. Meta \u4fe1\u606f ======== *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\ud83d\udcdd Meta \u4fe1\u606f<\/h3><\/div>';\n        html += '<div class=\"fr-meta-grid\">';\n        html += '<div class=\"fr-meta-item\"><div class=\"fr-meta-key\">Title<\/div><div class=\"fr-meta-val\">'+GeoAPI.escapeHtml(mc.title||'\u672a\u8bbe\u7f6e')+'<\/div><div class=\"fr-meta-note\">'+mc.title_length+' \u5b57\u7b26 '+(mc.title_ok?'\u2713':'\u26a0 \u5efa\u8bae 10-60 \u5b57\u7b26')+'<\/div><\/div>';\n        html += '<div class=\"fr-meta-item\"><div class=\"fr-meta-key\">Description<\/div><div class=\"fr-meta-val\">'+GeoAPI.escapeHtml(mc.description||'\u672a\u8bbe\u7f6e')+'<\/div><div class=\"fr-meta-note\">'+mc.description_length+' \u5b57\u7b26 \u00b7 \u4fe1\u606f\u5bc6\u5ea6: '+GeoAPI.escapeHtml(mc.description_info_density)+' '+(mc.description_ok?'\u2713':'\u26a0 \u5efa\u8bae 50-160 \u5b57\u7b26')+'<\/div><\/div>';\n        html += '<\/div>';\n\n        \/* ======== 7. JS \u6e32\u67d3\u4f9d\u8d56 ======== *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\u26a1 JS \u6e32\u67d3\u4f9d\u8d56\u5ea6<\/h3><\/div>';\n        var jsPct = js.js_dependency_ratio || 0;\n        var jsCol = js.risk_level==='low'?'var(--geo-success)':js.risk_level==='medium'?'var(--geo-warn)':'var(--geo-danger)';\n        var jsMsg = js.risk_level==='low'?'\u9875\u9762\u4e3b\u8981\u5185\u5bb9\u901a\u8fc7\u9759\u6001 HTML \u4ea4\u4ed8\uff0cAI \u722c\u866b\u53ef\u76f4\u63a5\u8bfb\u53d6':js.risk_level==='medium'?'\u90e8\u5206\u5185\u5bb9\u4f9d\u8d56 JS \u6e32\u67d3\uff0c\u4e0d\u652f\u6301 JS \u7684\u722c\u866b\u53ef\u80fd\u9057\u6f0f\u4fe1\u606f':'\u8d85\u8fc7 50% \u7684\u5185\u5bb9\u4f9d\u8d56 JS \u6e32\u67d3\uff0c\u5927\u91cf AI \u722c\u866b\u65e0\u6cd5\u83b7\u53d6\u5b8c\u6574\u5185\u5bb9';\n        html += '<div style=\"display:flex;gap:20px;align-items:center;margin-bottom:6px;\"><span style=\"font-size:28px;font-weight:800;color:'+jsCol+';\">'+jsPct+'%<\/span><span style=\"font-size:14px;color:var(--geo-text-muted);\">JS \u6e32\u67d3\u4f9d\u8d56\u6bd4<\/span><\/div>';\n        html += '<div class=\"fr-jsbar\"><div class=\"fr-jsbar__fill\" style=\"width:'+Math.min(100,jsPct)+'%;background:'+jsCol+';\"><\/div><\/div>';\n        html += '<div style=\"display:flex;justify-content:space-between;font-size:12px;color:var(--geo-text-faint);margin-bottom:8px;\"><span>\u9759\u6001\u6587\u672c: '+GeoAPI.formatNumber(js.static_text_length)+' \u5b57\u7b26<\/span><span>\u6e32\u67d3\u540e: '+GeoAPI.formatNumber(js.rendered_text_length)+' \u5b57\u7b26<\/span><\/div>';\n        html += '<div style=\"font-size:13px;color:var(--geo-text-muted);margin-bottom:24px;\">'+GeoAPI.escapeHtml(jsMsg)+'<\/div>';\n\n        \/* ======== 8. \u9996\u5c4f\u7b54\u6848\u5757 ======== *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">' + (isEn ? '\ud83c\udfaf Answer Block Detection' : '\ud83c\udfaf \u9996\u5c4f\u7b54\u6848\u5757\u68c0\u6d4b') + '<\/h3><\/div>';\n        if(ab.found) {\n            html += '<div style=\"display:flex;gap:12px;flex-wrap:wrap;margin-bottom:16px;\">';\n            html += '<span class=\"geo-badge '+(ab.has_conclusion_first?'geo-badge--success':'geo-badge--warn')+'\">'+(isEn?'Conclusion-first: ':'\u7ed3\u8bba\u524d\u7f6e: ')+(ab.has_conclusion_first?(isEn?'\u2713 Yes':'\u2713 \u662f'):(isEn?'\u26a0 No':'\u26a0 \u5426'))+'<\/span>';\n            html += '<span class=\"geo-badge '+(ab.has_specific_data?'geo-badge--success':'geo-badge--warn')+'\">'+(isEn?'Specific data: ':'\u5177\u4f53\u6570\u636e: ')+(ab.has_specific_data?(isEn?'\u2713 Yes':'\u2713 \u6709'):(isEn?'\u26a0 No':'\u26a0 \u65e0'))+'<\/span>';\n            html += '<span class=\"geo-badge geo-badge--info\">Token: '+ab.token_count+'<\/span>';\n            html += '<\/div>';\n        } else {\n            html += '<div class=\"geo-error\" style=\"margin-bottom:16px;\">'+(isEn?'No valid answer block detected in above-the-fold content':'\u672a\u68c0\u6d4b\u5230\u6709\u6548\u7684\u9996\u5c4f\u7b54\u6848\u5757\u5185\u5bb9')+'<\/div>';\n        }\n\n        \/* ======== 9. JS \u6e32\u67d3\u4f9d\u8d56\u8be6\u60c5 ======== *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">' + (isEn ? '\u26a1 JS Rendering Check' : '\u26a1 JS \u6e32\u67d3\u4f9d\u8d56\u68c0\u6d4b') + '<\/h3><\/div>';\n        var jsRisk = js.risk_level || 'low';\n        var jsCls = jsRisk === 'high' ? 'geo-badge--danger' : jsRisk === 'medium' ? 'geo-badge--warn' : 'geo-badge--success';\n        var jsLabel = isEn\n            ? (jsRisk==='high' ? 'High risk \u2014 most content requires JS' : jsRisk==='medium' ? 'Medium risk \u2014 some content requires JS' : 'Low risk \u2014 content is mostly static')\n            : (jsRisk==='high' ? '\u9ad8\u98ce\u9669 \u2014 \u5927\u90e8\u5206\u5185\u5bb9\u4f9d\u8d56 JS \u6e32\u67d3\uff0cAI \u722c\u866b\u53ef\u80fd\u770b\u4e0d\u5230' : jsRisk==='medium' ? '\u4e2d\u98ce\u9669 \u2014 \u90e8\u5206\u5185\u5bb9\u4f9d\u8d56 JS' : '\u4f4e\u98ce\u9669 \u2014 \u5185\u5bb9\u57fa\u672c\u4e3a\u9759\u6001\u76f4\u51fa');\n        html += '<div style=\"display:flex;gap:12px;flex-wrap:wrap;margin-bottom:12px;\">';\n        html += '<span class=\"geo-badge '+jsCls+'\">'+jsLabel+'<\/span>';\n        html += '<span class=\"geo-badge geo-badge--neutral\">'+(isEn?'Static text: ':'\u9759\u6001\u6587\u672c: ')+GeoAPI.formatNumber(js.static_text_length||0)+(isEn?' chars':'\u5b57')+'<\/span>';\n        html += '<span class=\"geo-badge geo-badge--neutral\">'+(isEn?'Rendered text: ':'\u6e32\u67d3\u540e\u6587\u672c: ')+GeoAPI.formatNumber(js.rendered_text_length||0)+(isEn?' chars':'\u5b57')+'<\/span>';\n        html += '<span class=\"geo-badge geo-badge--info\">'+(isEn?'JS dependency: ':'JS \u4f9d\u8d56\u5ea6: ')+(js.js_dependency_ratio||0)+'%<\/span>';\n        html += '<\/div>';\n\n        \/* ======== 10. H \u6807\u7b7e\u5c42\u7ea7 ======== *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">' + (isEn ? '\ud83c\udff7\ufe0f Heading Hierarchy' : '\ud83c\udff7\ufe0f H \u6807\u7b7e\u5c42\u7ea7') + '<\/h3><\/div>';\n        html += '<div style=\"display:flex;gap:12px;flex-wrap:wrap;margin-bottom:12px;\">';\n        var h1Cls = hc.h1_ok ? 'geo-badge--success' : (hc.h1_count > 1 ? 'geo-badge--warn' : 'geo-badge--danger');\n        html += '<span class=\"geo-badge '+h1Cls+'\">H1 \u00d7 '+(hc.h1_count||0)+(hc.h1_ok?(isEn?' \u2713 Correct':' \u2713 \u6b63\u786e'):(hc.h1_count>1?(isEn?' \u26a0 Too many':' \u26a0 \u8fc7\u591a'):(isEn?' \u2717 Missing':' \u2717 \u7f3a\u5931')))+'<\/span>';\n        html += '<span class=\"geo-badge geo-badge--neutral\">H2 \u00d7 '+(hc.h2_count||0)+'<\/span>';\n        html += '<span class=\"geo-badge geo-badge--neutral\">H3 \u00d7 '+(hc.h3_count||0)+'<\/span>';\n        if(hc.has_skip) html += '<span class=\"geo-badge geo-badge--warn\">'+(isEn?'\u26a0 Heading level skipped':'\u26a0 \u6807\u7b7e\u5c42\u7ea7\u8df3\u8dc3')+'<\/span>';\n        html += '<\/div>';\n        if(hc.h1_texts && hc.h1_texts.length > 0) {\n            html += '<div style=\"font-size:13px;color:var(--geo-text-muted);margin-bottom:16px;\">H1: '+hc.h1_texts.map(function(t){return GeoAPI.escapeHtml(t);}).join(' | ')+'<\/div>';\n        }\n\n        \/* ======== 11. \u8bed\u4e49\u6807\u7b7e ======== *\/\n        html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">' + (isEn ? '\ud83d\udce6 Semantic Tags' : '\ud83d\udce6 \u8bed\u4e49\u6807\u7b7e\u68c0\u67e5') + '<\/h3><\/div>';\n        html += '<div style=\"display:flex;gap:12px;flex-wrap:wrap;margin-bottom:16px;\">';\n        function tagBadge(name, has) { return '<span class=\"geo-badge '+(has?'geo-badge--success':'geo-badge--warn')+'\">'+name+': '+(has?(isEn?'\u2713 Found':'\u2713 \u6709'):(isEn?'\u2717 Missing':'\u2717 \u7f3a\u5931'))+'<\/span>'; }\n        html += tagBadge('&lt;main&gt;', st.has_main);\n        html += tagBadge('&lt;article&gt;', st.has_article);\n        html += tagBadge('&lt;nav&gt;', st.has_nav);\n        html += tagBadge('&lt;footer&gt;', st.has_footer);\n        html += '<\/div>';\n        if(!st.content_wrapped) {\n            html += '<div class=\"geo-error\" style=\"margin-bottom:16px;\">'+(isEn?'Content is not wrapped in &lt;main&gt; or &lt;article&gt; \u2014 AI may have difficulty isolating your content from navigation and sidebar noise':'\u6b63\u6587\u672a\u88ab &lt;main&gt; \u6216 &lt;article&gt; \u5305\u88f9\uff0cAI \u53ef\u80fd\u96be\u4ee5\u4ece\u5bfc\u822a\u548c\u4fa7\u8fb9\u680f\u566a\u58f0\u4e2d\u5b9a\u4f4d\u6b63\u6587\u5185\u5bb9')+'<\/div>';\n        }\n\n        \/* ======== 9. \u622a\u56fe + \u5207\u7247\u53cc\u680f ======== *\/\n        if(d.screenshot_base64 || (d.chunks && d.chunks.length > 0)) {\n            html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\ud83d\udc41\ufe0f \u4eba\u7c7b\u89c6\u89d2 vs \ud83e\udd16 AI \u89c6\u89d2<\/h3><\/div>';\n            html += '<div class=\"fr-two-col\">';\n            if(d.screenshot_base64) {\n                html += '<div><img decoding=\"async\" src=\"data:image\/jpeg;base64,'+d.screenshot_base64+'\" style=\"width:100%;border-radius:8px;border:1px solid var(--geo-border);\" alt=\"\u9875\u9762\u622a\u56fe\"><\/div>';\n            }\n            html += '<div>';\n            (d.chunks||[]).forEach(function(c,i){\n                html += '<div style=\"background:#fff;border:1px solid var(--geo-border);border-left:4px solid #3b82f6;padding:12px;border-radius:6px;margin-bottom:10px;\">'\n                      + '<strong style=\"font-size:11px;color:#3b82f6;\">CHUNK #'+(i+1)+'<\/strong>'\n                      + '<div style=\"font-size:13px;color:var(--geo-text-body);line-height:1.6;margin-top:4px;\">'+GeoAPI.escapeHtml(c.substring(0,200))+(c.length>200?'...':'')+'<\/div><\/div>';\n            });\n            if(d.overflow_count > 0) {\n                html += '<div style=\"text-align:center;color:var(--geo-danger);font-size:12px;padding:10px;background:#fff5f5;border-radius:6px;\">\u26a0 \u8fd8\u6709 '+d.overflow_count+' \u4e2a\u5207\u7247\u8d85\u51fa Top-5 \u7a97\u53e3<\/div>';\n            }\n            html += '<\/div><\/div>';\n        }\n\n        GeoAPI.showResult(result, html);\n    }\n});\n<\/script>\n\n        \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":48884,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-48915","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48915","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/comments?post=48915"}],"version-history":[{"count":0,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48915\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48884"}],"wp:attachment":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/media?parent=48915"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}