CINXE.COM
お問い合わせ - トレンドラボ
<!DOCTYPE html> <html lang="ja" data-admin-domain="//blog.hatena.ne.jp" data-admin-origin="https://blog.hatena.ne.jp" data-author="okseeme0327" data-avail-langs="ja en" data-blog="ytl.hatenablog.com" data-blog-host="ytl.hatenablog.com" data-blog-is-public="1" data-blog-name="トレンドラボ" data-blog-owner="okseeme0327" data-blog-show-ads="" data-blog-show-sleeping-ads="" data-blog-uri="https://youthtrendlab.net/" data-blog-uuid="6801883189071762764" data-blogs-uri-base="https://youthtrendlab.net" data-brand="pro" data-data-layer="{"hatenablog":{"admin":{},"analytics":{"brand_property_id":"","measurement_id":"G-H1MHKGH6MB","non_sampling_property_id":"","property_id":"","separated_property_id":"UA-29716941-26"},"blog":{"blog_id":"6801883189071762764","content_seems_japanese":"true","disable_ads":"custom_domain","enable_ads":"false","enable_keyword_link":"false","entry_show_footer_related_entries":"true","force_pc_view":"true","is_public":"true","is_responsive_view":"false","is_sleeping":"false","lang":"ja","name":"\u30c8\u30ec\u30f3\u30c9\u30e9\u30dc","owner_name":"okseeme0327","uri":"https://youthtrendlab.net/"},"brand":"pro","page_id":"static_page","permalink_entry":{"author_name":"okseeme0327","categories":"","character_count":9,"date":"2024-09-05","entry_id":"6802340630904127616","first_category":"","hour":"23","title":"\u304a\u554f\u3044\u5408\u308f\u305b","uri":"https://youthtrendlab.net/toiawase"},"pro":"pro","router_type":"blogs"}}" data-device="pc" data-dont-recommend-pro="false" data-global-domain="https://hatena.blog" data-globalheader-color="b" data-globalheader-type="pc" data-has-touch-view="1" data-help-url="https://help.hatenablog.com" data-hide-header="1" data-no-suggest-touch-view="1" data-page="static_page" data-parts-domain="https://hatenablog-parts.com" data-plus-available="1" data-pro="true" data-router-type="blogs" data-sentry-dsn="https://03a33e4781a24cf2885099fed222b56d@sentry.io/1195218" data-sentry-environment="production" data-sentry-sample-rate="0.1" data-static-domain="https://cdn.blog.st-hatena.com" data-version="15b44d6f3386d0946efd031c34207d" itemscope itemtype="http://schema.org/Blog" data-initial-state="{}" > <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# article: http://ogp.me/ns/article#"> <meta name="robots" content="max-image-preview:large" /> <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=7; IE=9; IE=10; IE=11" /> <title>お問い合わせ - トレンドラボ</title> <link rel="canonical" href="https://youthtrendlab.net/toiawase"/> <meta itemprop="name" content="お問い合わせ - トレンドラボ"/> <meta itemprop="image" content="https://cdn.image.st-hatena.com/image/scale/54013d5aa6b7e402e89a793ace4e8e597dd655d6/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fdefault_entry_og_image%2F118762041%2F1704181090781021"/> <meta property="og:title" content="お問い合わせ - トレンドラボ"/> <meta property="og:type" content="article"/> <meta property="og:url" content="https://youthtrendlab.net/toiawase"/> <meta property="og:image" content="https://cdn.image.st-hatena.com/image/scale/54013d5aa6b7e402e89a793ace4e8e597dd655d6/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fdefault_entry_og_image%2F118762041%2F1704181090781021"/> <meta property="og:image:alt" content="お問い合わせ - トレンドラボ"/> <meta property="og:description" content="読み込んでいます…" /> <meta property="og:site_name" content="トレンドラボ"/> <meta property="article:published_time" content="2024-09-05T14:27:13Z" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:image" content="https://cdn.image.st-hatena.com/image/scale/54013d5aa6b7e402e89a793ace4e8e597dd655d6/backend=imagemagick;version=1;width=1300/https%3A%2F%2Fcdn.user.blog.st-hatena.com%2Fdefault_entry_og_image%2F118762041%2F1704181090781021" /> <meta name="twitter:title" content="お問い合わせ - トレンドラボ" /> <meta name="twitter:description" content="読み込んでいます…" /> <meta name="twitter:app:name:iphone" content="はてなブログアプリ" /> <meta name="twitter:app:id:iphone" content="583299321" /> <meta name="twitter:app:url:iphone" content="hatenablog:///open?uri=https%3A%2F%2Fyouthtrendlab.net%2Ftoiawase" /> <meta name="description" content="読み込んでいます…" /> <script id="embed-gtm-data-layer-loader" data-data-layer-page-specific="{"hatenablog":{"blogs_permalink":{"has_related_entries_with_elasticsearch":"false","is_author_pro":"true","blog_afc_issued":"false","is_blog_sleeping":"false","entry_afc_issued":"false"}}}" > (function() { function loadDataLayer(elem, attrName) { if (!elem) { return {}; } var json = elem.getAttribute(attrName); if (!json) { return {}; } return JSON.parse(json); } var globalVariables = loadDataLayer( document.documentElement, 'data-data-layer' ); var pageSpecificVariables = loadDataLayer( document.getElementById('embed-gtm-data-layer-loader'), 'data-data-layer-page-specific' ); var variables = [globalVariables, pageSpecificVariables]; if (!window.dataLayer) { window.dataLayer = []; } for (var i = 0; i < variables.length; i++) { window.dataLayer.push(variables[i]); } })(); </script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-P4CXTW');</script> <!-- End Google Tag Manager --> <link rel="shortcut icon" href="https://youthtrendlab.net/icon/favicon"> <link rel="apple-touch-icon" href="https://youthtrendlab.net/icon/touch"> <link rel="icon" sizes="192x192" href="https://youthtrendlab.net/icon/link"> <link rel="alternate" type="application/atom+xml" title="Atom" href="https://youthtrendlab.net/feed"/> <link rel="alternate" type="application/rss+xml" title="RSS2.0" href="https://youthtrendlab.net/rss"/> <link rel="alternate" type="application/json+oembed" href="https://hatena.blog/oembed?url=https%3A%2F%2Fyouthtrendlab.net%2Ftoiawase&format=json" title="oEmbed Profile of お問い合わせ"/> <link rel="alternate" type="text/xml+oembed" href="https://hatena.blog/oembed?url=https%3A%2F%2Fyouthtrendlab.net%2Ftoiawase&format=xml" title="oEmbed Profile of お問い合わせ"/> <link rel="author" href="http://www.hatena.ne.jp/okseeme0327/"> <link rel="stylesheet" type="text/css" href="https://cdn.blog.st-hatena.com/css/blog.css?version=15b44d6f3386d0946efd031c34207d"/> <link rel="stylesheet" type="text/css" href="https://usercss.blog.st-hatena.com/blog_style/6801883189071762764/7aa244fa72d8134b27d55a091aa1d4cc0830d42c"/> <script> </script> <style> div#google_afc_user, div.google-afc-user-container, div.google_afc_image, div.google_afc_blocklink { display: block !important; } </style> <!-- viewport メタタグの最適化 --> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5"> <!-- Font displayにswapを使用 --> <link rel="preload" href="https://fonts.gstatic.com/s/poppins/v22/pxiEyp8kv8JHgFVrJJfecnFHGPc.woff2" as="font" type="font/woff2" crossorigin="anonymous"> <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap" media="print" onload="this.media='all'"> <!-- メインCSSを非同期ロード --> <link rel="preload" href="https://cdn.blog.st-hatena.com/css/blog.css?version=1ca111bc9f0112690b12e1842a1ce8" as="style" onload="this.onload=null;this.rel='stylesheet'"> <link rel="preload" href="https://usercss.blog.st-hatena.com/68032013480694124/5dac649cc2fa3349" as="style" onload="this.onload=null;this.rel='stylesheet'"> <!-- 重要な外部リソースへのプリコネクト --> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://cdn.blog.st-hatena.com"> <link rel="preconnect" href="https://cdn-ak.f.st-hatena.com"> <link rel="preconnect" href="https://www.googletagmanager.com"> <!-- フォールバック --> <noscript> <link rel="stylesheet" href="https://cdn.blog.st-hatena.com/css/blog.css?version=1ca111bc9f0112690b12e1842a1ce8"> <link rel="stylesheet" href="https://usercss.blog.st-hatena.com/68032013480694124/5dac649cc2fa3349"> </noscript> </head> <body class="page-static_page enable-top-editarea enable-bottom-editarea static-page-toiawase static-page-layout-header-footer globalheader-off globalheader-ng-enabled"> <div id="globalheader-container" data-brand="hatenablog" style="display: none" > <iframe id="globalheader" height="37" frameborder="0" allowTransparency="true"></iframe> </div> <div id="container"> <div id="container-inner"> <header id="blog-title" data-brand="hatenablog"> <div id="blog-title-inner" > <div id="blog-title-content"> <h1 id="title"><a href="https://youthtrendlab.net/">トレンドラボ</a></h1> <h2 id="blog-description">話題のトレンド、衝撃のゴシップ、最新の事件情報をいち早くお届け!知りたいことが今すぐわかる、あなたの好奇心を満たす情報ハブ</h2> </div> </div> </header> <div id="top-editarea"> <script> /** * 最適化コード - Core Web Vitals対策版 * 2025年3月改訂 - パフォーマンス最適化版 */ (function() { // パフォーマンス計測 const perfStart = performance.now(); // デバイス検出と設定 const viewportWidth = window.innerWidth || document.documentElement.clientWidth; const isMobile = viewportWidth < 768 || /iPhone|iPad|iPod|Android/i.test(navigator.userAgent); // LCP要素を早く表示するための設定 function optimizeLCP() { // LCP要素を特定 (p要素で始まる特定のテキストを含む要素) const possibleLCPElements = document.querySelectorAll('p'); possibleLCPElements.forEach(el => { if (el.textContent.includes('ホロライブプロダクション') || el.textContent.includes('バーチャルYouTuber') || (el.parentNode && el.parentNode.classList.contains('entry-content') && el.parentNode.firstElementChild === el)) { // LCP要素に最適化用のクラスを追加 el.classList.add('lcp-element'); // スタイルを直接設定してレンダリングを優先 el.style.contentVisibility = 'auto'; el.style.contain = 'content'; } }); } // 設定 const config = { features: { imageOptimization: true, basicAdLoading: true, existingTocToggle: true, analytics: true, lcpOptimization: true, // LCP最適化を追加 scriptOptimization: true // スクリプト最適化を追加 }, analytics: { id: 'G-H1MHKGH6MB', delayMs: isMobile ? 5000 : 3000 // 遅延時間を増やす }, ads: { enabled: true, client: 'ca-pub-3827812849061768', defaultSlot: '8323635133', delayMs: isMobile ? 4000 : 2500 // 広告の読み込み遅延を追加 }, paths: { selectors: { ads: ['.adsbygoogle'], images: ['img'], existingToc: ['ul.table-of-contents'], lcp: ['.entry-content p:first-of-type'] // LCP要素セレクタ } }, thirdParty: { // 遅延読み込みするサードパーティスクリプト scripts: [ { src: 'widgets.js', domain: 'platform.twitter.com', delay: 3000, condition: () => document.querySelector('.twitter-tweet, .twitter-timeline') !== null }, { src: 'gtm.js', domain: 'www.googletagmanager.com', delay: 3500, critical: true }, { src: 'gtag/js', domain: 'www.googletagmanager.com', delay: 4000, critical: true }, { src: 'jquery.min.js', domain: 'cdn.blog.st-hatena.com', delay: 2000, critical: false, condition: () => window.jQuery === undefined }, { src: 'hatenablog.js', domain: 'cdn.blog.st-hatena.com', delay: 2500, critical: false }, { src: 'vendors.js', domain: 'cdn.blog.st-hatena.com', delay: 3000, critical: false, priority: 'low' } ] } }; //========================================================== // 基本的なユーティリティ関数 //========================================================== // 安全なDOM操作ユーティリティ const safeDOM = { // 安全なクラス操作 classList: (element, operation, ...classNames) => { if (!element || !element.classList) return false; try { switch (operation) { case 'add': element.classList.add(...classNames); return true; case 'remove': element.classList.remove(...classNames); return true; case 'toggle': return element.classList.toggle(...classNames); default: return false; } } catch (e) { return false; } }, // 安全な要素検索 querySelector: (selector) => { try { return document.querySelector(selector); } catch (e) { return null; } }, // 安全な複数要素検索 querySelectorAll: (selector) => { try { return Array.from(document.querySelectorAll(selector)); } catch (e) { return []; } }, // 安全なスタイル設定 setStyle: (element, styleObj) => { if (!element || !element.style) return false; try { Object.keys(styleObj).forEach(key => { element.style[key] = styleObj[key]; }); return true; } catch (e) { return false; } } }; // 基本ユーティリティ const utils = { // 既存の目次要素を探す findExistingToc: () => { const selectors = config.paths.selectors.existingToc.join(','); return safeDOM.querySelector(selectors); }, // リソースを遅延読み込む loadScriptAsync: (src, delay = 0, callback = null) => { setTimeout(() => { try { // すでに読み込まれているか確認 if (document.querySelector(`script[src*="${src}"]`)) { if (callback) callback(); return; } const script = document.createElement('script'); script.async = true; script.defer = true; script.src = src; if (callback) { script.onload = callback; } document.head.appendChild(script); } catch (e) { // エラー無視 } }, delay); }, // サードパーティスクリプトの最適化 optimizeThirdPartyScripts: () => { if (!config.features.scriptOptimization) return; // 現在読み込まれているスクリプトを取得 const loadedScripts = Array.from(document.querySelectorAll('script[src]')).map(script => script.src); // 不要なサードパーティスクリプトをブロック config.thirdParty.scripts.forEach(script => { const scriptPattern = `${script.domain}/${script.src}`; // 条件付きロード - 条件がtrueの場合のみロード(デフォルトはtrue) const shouldLoad = script.condition ? script.condition() : true; if (!shouldLoad) { console.log(`スクリプトスキップ: ${scriptPattern} (不要と判断)`); return; } // すでに読み込まれているスクリプトに一致するものがあるか確認 const existingScript = loadedScripts.find(src => src.includes(scriptPattern)); if (existingScript) { try { // 既存のスクリプト要素を見つける const scriptElement = document.querySelector(`script[src*="${scriptPattern}"]`); if (scriptElement && !script.critical) { // 重要でないスクリプトの場合、削除して遅延読み込みに置き換える if (scriptElement.parentNode) { scriptElement.parentNode.removeChild(scriptElement); // 優先度に応じた遅延読み込み方法を選択 if (script.priority === 'low') { // 最低優先度:ブラウザのアイドル時に読み込み if ('requestIdleCallback' in window) { requestIdleCallback(() => { utils.loadScriptAsync(existingScript, script.delay); }, { timeout: 10000 }); } else { setTimeout(() => utils.loadScriptAsync(existingScript, script.delay), 5000); } } else { // 通常優先度:指定した遅延時間後に読み込み utils.loadScriptAsync(existingScript, script.delay); } } } } catch (e) { // エラー無視 } } }); } }; //========================================================== // 1. 画像処理 - CLSとLCPの改善 //========================================================== const imageOptimizer = { lazyLoadSupported: 'loading' in HTMLImageElement.prototype, initialize() { if (!config.features.imageOptimization) return; try { // 画像を最適化 const allImages = safeDOM.querySelectorAll('img'); allImages.forEach((img) => { // すでに処理済みの画像はスキップ if (img && !img.hasAttribute('data-handled')) { // 画像のサイズ属性を設定して、CLSを減らす if (!img.hasAttribute('width') && !img.hasAttribute('height')) { img.style.aspectRatio = 'auto'; // 画面外の画像を遅延読み込み if (this.lazyLoadSupported) { img.loading = 'lazy'; } } // 処理済みとしてマーク img.setAttribute('data-handled', 'true'); // LCP要素内または近くの重要な画像は優先読み込み const parent = img.closest('.entry-content'); if (parent && img === parent.querySelector('img:first-of-type')) { img.loading = 'eager'; // 優先的に読み込み img.fetchpriority = 'high'; // 既に読み込まれていない場合はプリロード if (!img.complete && img.src) { const preloadLink = document.createElement('link'); preloadLink.rel = 'preload'; preloadLink.as = 'image'; preloadLink.href = img.src; document.head.appendChild(preloadLink); } } } }); } catch (e) { // エラー無視 } } }; //========================================================== // 2. LCP最適化 - 追加 //========================================================== const lcpOptimizer = { initialize() { if (!config.features.lcpOptimization) return; try { // まずLCP要素を最適化 optimizeLCP(); // Intersection Observerを使ってLCP要素を監視 const lcpObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { // LCP要素が表示されるとき、優先的に描画 entry.target.style.visibility = 'visible'; lcpObserver.disconnect(); // 一度表示されたら監視終了 } }); }, { threshold: 0.1, rootMargin: '0px' }); // LCP要素と思われる要素を監視 document.querySelectorAll('.lcp-element, .entry-content p:first-of-type').forEach(el => { lcpObserver.observe(el); }); } catch (e) { // エラー無視 } } }; //========================================================== // 3. 広告管理 - 遅延読み込み対応 //========================================================== const adManager = { initialize() { if (!config.features.basicAdLoading || !config.ads.enabled) return; try { // 広告スクリプトを遅延読み込み setTimeout(() => { this.loadAdScript(); }, config.ads.delayMs); } catch (e) { // エラー無視 } }, loadAdScript() { // すでに読み込み済みならスキップ if (document.querySelector('script[src*="pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"]')) { this.activateAds(); return; } const script = document.createElement('script'); script.async = true; script.defer = true; // 追加: defer属性 script.src = `https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=${config.ads.client}`; script.crossOrigin = 'anonymous'; script.onload = () => { this.activateAds(); }; // スクリプトを挿入 document.head.appendChild(script); }, activateAds() { try { // 広告スロットを非同期で初期化 - Intersection Observerを使用 const adSlots = document.querySelectorAll('.adsbygoogle'); if (adSlots.length > 0) { // Intersection Observerで画面内に入ったら広告を初期化 const adObserver = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { const adElement = entry.target; if (!adElement.hasAttribute('data-ad-status') && window.adsbygoogle) { try { (window.adsbygoogle = window.adsbygoogle || []).push({}); } catch (e) { // エラー無視 } } observer.unobserve(adElement); } }); }, { threshold: 0, rootMargin: '200px' }); // 各広告スロットを監視 adSlots.forEach(slot => { adObserver.observe(slot); }); } } catch (error) { // エラー無視 } } }; //========================================================== // 4. 目次トグル(変更なし) //========================================================== const tocToggler = { initialize() { if (!config.features.existingTocToggle) return; try { // 既存の目次を探す const existingToc = utils.findExistingToc(); if (!existingToc) return; // 目次を非表示にする safeDOM.setStyle(existingToc, { display: 'none' }); // トグルボタンを作成 const tocButton = document.createElement('button'); tocButton.className = 'toc-toggle-button'; tocButton.textContent = '目次を表示'; tocButton.setAttribute('aria-expanded', 'false'); // ボタンをクリックしたときの挙動を設定 tocButton.addEventListener('click', () => { const isOpen = safeDOM.classList(tocButton, 'toggle', 'open'); safeDOM.classList(existingToc, 'toggle', 'show'); tocButton.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); tocButton.textContent = isOpen ? '目次を閉じる' : '目次を表示'; }); // ボタンを目次の前に挿入 if (existingToc.parentNode) { existingToc.parentNode.insertBefore(tocButton, existingToc); } // 標準APIによるスムーズスクロール実装 const tocLinks = existingToc.querySelectorAll('a[href^="#"]'); tocLinks.forEach(link => { if (!link) return; link.addEventListener('click', (e) => { e.preventDefault(); const targetId = link.getAttribute('href'); if (!targetId) return; const targetElement = document.querySelector(targetId); if (targetElement) { // 標準APIでスムーズスクロール targetElement.scrollIntoView({ behavior: 'smooth', block: 'start' }); // 履歴に追加 try { history.pushState(null, null, targetId); } catch (e) { // エラー無視 } // モバイルでは目次を自動で閉じる if (isMobile) { safeDOM.classList(tocButton, 'remove', 'open'); safeDOM.classList(existingToc, 'remove', 'show'); tocButton.setAttribute('aria-expanded', 'false'); tocButton.textContent = '目次を表示'; } } }); }); } catch (e) { // エラー無視 } } }; //========================================================== // 5. スクリプト最適化 - 改善版 //========================================================== const scriptOptimizer = { initialize() { if (!config.features.scriptOptimization) return; try { // 不要なスクリプトを遅延読み込みに変換 utils.optimizeThirdPartyScripts(); // jQuery依存を削減 this.reduceJQueryDependency(); // requestIdleCallbackが利用可能ならそれを使ってスクリプト最適化 if ('requestIdleCallback' in window) { requestIdleCallback(() => { this.cleanupUnusedScripts(); }, { timeout: 5000 }); } else { // フォールバック - 時間をずらして実行 setTimeout(() => { this.cleanupUnusedScripts(); }, 5000); } } catch (e) { // エラー無視 } }, // jQuery依存関係を最小化 - 拡張版 reduceJQueryDependency() { // すでにjQueryが読み込まれている場合は上書きしない if (window.jQuery) return; // 拡張されたjQuery互換ライト実装 const miniQuery = function(selector) { if (typeof selector === 'function') { // $(function(){}) パターン対応 if (document.readyState !== 'loading') { selector(); } else { document.addEventListener('DOMContentLoaded', selector); } return; } return document.querySelector(selector); }; // 主要なjQueryメソッドをモダンJSで実装 miniQuery.fn = { hide: element => { if (element) element.style.display = 'none'; return element; }, show: element => { if (element) element.style.display = ''; return element; }, addClass: (element, className) => { if (element) element.classList.add(className); return element; }, removeClass: (element, className) => { if (element) element.classList.remove(className); return element; }, on: (element, event, callback) => { if (element) element.addEventListener(event, callback); return element; } }; // $(..).addClass() パターン対応 const extendElement = (element) => { if (!element) return element; Object.keys(miniQuery.fn).forEach(key => { element[key] = function(...args) { return miniQuery.fn[key](element, ...args); }; }); return element; }; // セレクタ結果を拡張 const originalFn = miniQuery; miniQuery = function(selector) { const result = originalFn(selector); return (typeof selector === 'function') ? result : extendElement(result); }; // 複数要素対応 miniQuery.all = function(selector) { return Array.from(document.querySelectorAll(selector)).map(extendElement); }; // Ajax簡易実装 miniQuery.get = function(url, callback) { fetch(url) .then(response => response.text()) .then(callback) .catch(err => console.error('miniQuery.get error:', err)); }; // 既存のシンプル実装と併用 window.$ = window.$ || miniQuery; window.$$ = window.$$ || miniQuery.all; }, // 使用されていないスクリプトの検出と整理 - 改善版 cleanupUnusedScripts() { try { // GTMスクリプトの重複チェックと削除を最適化 const gtmScripts = document.querySelectorAll('script[src*="googletagmanager.com/gtm.js"]'); if (gtmScripts.length > 1) { // 最初のスクリプトのID・URL保存 const primaryGtmId = gtmScripts[0].getAttribute('data-gtm-id') || ''; const primarySrc = gtmScripts[0].src; console.log('重複GTMスクリプト検出: ' + gtmScripts.length + '個'); // 2つ目以降を削除(同一IDのみ) for (let i = 1; i < gtmScripts.length; i++) { const currentId = gtmScripts[i].getAttribute('data-gtm-id') || ''; // 同じIDか、IDがない場合のみ削除(異なるGTMコンテナは保持) if (!currentId || currentId === primaryGtmId || gtmScripts[i].src === primarySrc) { if (gtmScripts[i].parentNode) { gtmScripts[i].parentNode.removeChild(gtmScripts[i]); console.log('重複GTMスクリプト削除: ' + (currentId || 'ID未設定')); } } } } // Twitterウィジェットの読み込みを遅延 const twitterScripts = document.querySelectorAll('script[src*="platform.twitter.com/widgets.js"]'); twitterScripts.forEach(script => { if (script.parentNode) { script.parentNode.removeChild(script); // 5秒後に遅延読み込み setTimeout(() => { utils.loadScriptAsync('https://platform.twitter.com/widgets.js', 0); }, 5000); } }); } catch (e) { console.log('GTM重複チェックエラー:', e.message); } } }; //========================================================== // 6. アナリティクス - 遅延時間増加 //========================================================== function loadAnalytics() { try { if (!config.features.analytics) return; const scriptId = 'google-analytics'; if (document.getElementById(scriptId)) return; window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); // データ収集設定の最適化 - 最小限のデータ収集 gtag('config', config.analytics.id, { 'send_page_view': true, 'anonymize_ip': true, 'transport_type': 'beacon', // ビーコンAPIを使用 'custom_map': { 'dimension1': 'client_type' } }); // 既存のGTMが存在する場合は再利用し、なければ遅延読み込み if (!document.querySelector('script[src*="www.googletagmanager.com/gtag/js"]')) { const script = document.createElement('script'); script.id = scriptId; script.async = true; script.defer = true; // defer属性を追加 script.src = `https://www.googletagmanager.com/gtag/js?id=${config.analytics.id}`; document.head.appendChild(script); } } catch (e) { // エラー無視 } } //========================================================== // 初期化(Core Web Vitals対応版) //========================================================== function init() { try { // 1. LCP最適化を最初に実行 lcpOptimizer.initialize(); // 2. 画像の最適化 imageOptimizer.initialize(); // 3. スクリプト最適化(未使用スクリプトの削減) scriptOptimizer.initialize(); // requestIdleCallbackを使って重要度の低い処理を遅延実行 if ('requestIdleCallback' in window) { // 4. 目次トグル requestIdleCallback(() => { tocToggler.initialize(); }, { timeout: 2000 }); // 5. 広告の初期化(優先度低め) requestIdleCallback(() => { adManager.initialize(); }, { timeout: 3000 }); // 6. アナリティクス(最も優先度低い) window.addEventListener('load', () => { requestIdleCallback(() => { setTimeout(loadAnalytics, config.analytics.delayMs); }, { timeout: 4000 }); }); } else { // フォールバック - 通常の順序で実行 tocToggler.initialize(); setTimeout(() => { adManager.initialize(); }, 2000); window.addEventListener('load', () => { setTimeout(loadAnalytics, config.analytics.delayMs); }); } } catch (e) { console.log('初期化エラー'); } } // 重複初期化防止用のグローバルフラグ if (window.optimizerInitialized) { console.log('最適化スクリプトはすでに初期化されています'); } else { window.optimizerInitialized = true; // LCP最適化のために一部の処理を即時実行 if (config.features.lcpOptimization) { optimizeLCP(); } // DOMContentLoadedまたは即時実行 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } } // パフォーマンス記録 console.log(`最適化スクリプト実行時間: ${(performance.now() - perfStart).toFixed(2)}ms (Core Web Vitals対策版)`); })(); </script> </div> <div id="content" class="hfeed" > <div id="content-inner"> <div id="wrapper"> <div id="main"> <div id="main-inner"> <!-- google_ad_section_start --> <!-- rakuten_ad_target_begin --> <article class="entry hentry test-hentry js-entry-article date-first autopagerize_page_element chars-200 words-100 mode-html entry-odd" id="entry-6802340630904127616" data-keyword-campaign="" data-uuid="6802340630904127616" data-publication-type="page"> <div class="entry-inner"> <header class="entry-header"> <h1 class="entry-title"> <a href="https://youthtrendlab.net/toiawase" class="entry-title-link bookmark">お問い合わせ</a> </h1> </header> <div class="entry-content hatenablog-entry"> <p><iframe src="https://docs.google.com/forms/d/e/1FAIpQLSeGu2TMrrZWregtW_zmB4EPCdgNR3KCIMm3ZaAlzbMaE0n-ZA/viewform?embedded=true" width="640" height="439" frameborder="0" marginheight="0" marginwidth="0">読み込んでいます…</iframe></p> </div> </div> </article> <!-- rakuten_ad_target_end --> <!-- google_ad_section_end --> </div> </div> <aside id="box1"> <div id="box1-inner"> </div> </aside> </div><!-- #wrapper --> </div> </div> <div id="bottom-editarea"> <div style="text-align: center;"> <small style="color: #666; font-size: 12px;"> <a href="/Privacy-Policy" style="color: #666;">プライバシーポリシー</a> / <a href="/unei" style="color: #666;">運営者情報</a> / <a href="/toiawase" style="color: #666;">お問い合わせ</a> </small> <p class="copyright"> <small style="color: #666; font-size: 12px;">copyright 2025 トレンドラボ</small> </p> </div> </div> </div> </div> <div class="quote-box"> <div class="tooltip-quote tooltip-quote-stock"> <i class="blogicon-quote" title="引用をストック"></i> </div> <div class="tooltip-quote tooltip-quote-tweet js-tooltip-quote-tweet"> <a class="js-tweet-quote" target="_blank" data-track-name="quote-tweet" data-track-once> <img src="https://cdn.blog.st-hatena.com/images/admin/quote/quote-x-icon.svg?version=15b44d6f3386d0946efd031c34207d" title="引用して投稿する" > </a> </div> </div> <div class="quote-stock-panel" id="quote-stock-message-box" style="position: absolute; z-index: 3000"> <div class="message-box" id="quote-stock-succeeded-message" style="display: none"> <p>引用をストックしました</p> <button class="btn btn-primary" id="quote-stock-show-editor-button" data-track-name="curation-quote-edit-button">ストック一覧を見る</button> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="message-box" id="quote-login-required-message" style="display: none"> <p>引用するにはまずログインしてください</p> <button class="btn btn-primary" id="quote-login-button">ログイン</button> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="error-box" id="quote-stock-failed-message" style="display: none"> <p>引用をストックできませんでした。再度お試しください</p> <button class="btn quote-stock-close-message-button">閉じる</button> </div> <div class="error-box" id="unstockable-quote-message-box" style="display: none; position: absolute; z-index: 3000;"> <p>限定公開記事のため引用できません。</p> </div> </div> <script type="x-underscore-template" id="js-requote-button-template"> <div class="requote-button js-requote-button"> <button class="requote-button-btn tipsy-top" title="引用する"><i class="blogicon-quote"></i></button> </div> </script> <div id="hidden-subscribe-button" style="display: none;"> <div class="hatena-follow-button-box btn-subscribe js-hatena-follow-button-box" > <a href="#" class="hatena-follow-button js-hatena-follow-button"> <span class="subscribing"> <span class="foreground">読者です</span> <span class="background">読者をやめる</span> </span> <span class="unsubscribing" data-track-name="profile-widget-subscribe-button" data-track-once> <span class="foreground">読者になる</span> <span class="background">読者になる</span> </span> </a> <div class="subscription-count-box js-subscription-count-box"> <i></i> <u></u> <span class="subscription-count js-subscription-count"> </span> </div> </div> </div> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> <script src="https://b.st-hatena.com/js/bookmark_button.js" charset="utf-8" async="async"></script> <script type="text/javascript" src="https://cdn.blog.st-hatena.com/js/external/jquery.min.js?v=1.12.4&version=15b44d6f3386d0946efd031c34207d"></script> <script src="https://cdn.blog.st-hatena.com/js/texts-ja.js?version=15b44d6f3386d0946efd031c34207d"></script> <script id="vendors-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/vendors.js?version=15b44d6f3386d0946efd031c34207d" crossorigin="anonymous"></script> <script id="hatenablog-js" data-env="production" src="https://cdn.blog.st-hatena.com/js/hatenablog.js?version=15b44d6f3386d0946efd031c34207d" crossorigin="anonymous" data-page-id="static_page"></script> <script>Hatena.Diary.GlobalHeader.init()</script> </body> </html>