diff --git a/assets/javascripts/app.js b/assets/javascripts/app.js index c3b8057..649d171 100644 --- a/assets/javascripts/app.js +++ b/assets/javascripts/app.js @@ -1,7 +1,36 @@ ;(function($, win, undefined) { // ECMAScript 5 嚴格模式 'use strict'; + $(function() { + var $signLanguageBox = $('.orbit-bar-search-sign-language'); + var $headerNav = $('.header-nav'); + var $target = $('.header-nav [accesskey="U"], .header-nav [accesskey="W"]'); + // 移除 color: inherit !important + $target.each(function() { + $(this)[0].style.removeProperty('color'); + }); + + function handleNavMove() { + var windowWidth = window.innerWidth; + + if (windowWidth > 768) { + if ($signLanguageBox.length && $signLanguageBox.find('[accesskey="U"], [accesskey="W"]').length === 0) { + $signLanguageBox.prepend($target); + } + } else { + if ($headerNav.length && $headerNav.find('[accesskey="U"], [accesskey="W"]').length === 0) { + $headerNav.append($target); + } + } + } + + handleNavMove(); + + $(window).on('resize', function() { + handleNavMove(); + }); + }); //header fixed在上方 function initdata1() { if ( $('.homebanner').length != 0) { @@ -278,7 +307,13 @@ $('.mobile-menu').toggleClass('active'); $('body').toggleClass('noscroll'); - $('.mobile-menu .navbar-toggle').removeClass('collapsed'); + + // ★ 修正:依據 active 狀態決定 collapsed 的加/移除 + if ($('.mobile-menu').hasClass('active')) { + $('.mobile-menu .navbar-toggle').removeClass('collapsed'); // 打開 → 叉叉 + } else { + $('.mobile-menu .navbar-toggle').addClass('collapsed'); // 關閉 → 三條橫線 + } // 關閉所有下拉選單 $('.mobile-menu1 > ul, .mobile-menu2 > ul').slideUp(500); @@ -292,6 +327,34 @@ } }); + // ✅ Tab 鍵跳過 .mobile-menu 時,觸發收合邏輯 + $(document).on('focusout', '.mobile-menu', function(e) { + setTimeout(function() { + var $newFocus = $(document.activeElement); + + // 焦點在 body 時代表滑鼠正在點擊中,不處理 + if ($newFocus.is('body')) return; + + if ($('.mobile-menu').hasClass('active') && $newFocus.closest('.mobile-menu').length === 0) { + + var $btn = $('.navbar-toggle').first(); + + if ($btn.attr('data-bs-toggle')) { + var target = $btn.attr('data-bs-target'); + var bsCollapse = window.bootstrap && bootstrap.Collapse.getInstance($(target)[0]); + if (bsCollapse) bsCollapse.hide(); + $('.mobile-menu').removeClass('active'); + $('body').removeClass('noscroll'); + $('.mobile-menu .navbar-toggle').addClass('collapsed'); + $('.mobile-menu1 > ul, .mobile-menu2 > ul').slideUp(500); + $('.mobile-menu1 > .menu-drop, .mobile-menu2 > .menu-drop').removeClass('opened'); + } else { + $btn.trigger('click'); + } + } + }, 50); + }); + $('.mobile-menu1 > .menu-drop').click(function(){ var $that = $(this); var opencheck1 = $that.hasClass('opened'); @@ -760,6 +823,14 @@ $(document).ready(function() { removeEmptyTitles(); }); + + // $(".w-annc__img-wrap a").each(function () { + // var $this = $(this); + // // 確保 內沒有文字節點 (避免重複添加) + // if ($this.text().trim() === "") { + // $this.append('公告圖片'); + // } + // }); $(".widget-link__widget-title").each(function () { if ($(this).text().trim() === "") { $(this).append('公告標題'); @@ -874,224 +945,247 @@ setTimeout(fixImageAccessibility, 500); }); - // 有連結目的之所有a標籤的無障礙處理 - $(function() { - /** - * 全站無障礙 AA 級補強 (整合 HM1240400C 與 HM1240401C 規範) - */ - function fixAccessibilityAll() { - // --- 0. 環境與語言偵測 --- - //1200ms 後執行(確保所有其他 function 執行完畢後才處理) - //Part 1:修正語言選單按鈕 - //Part 2:掃描所有 - //├─ 排除 navbar-brand、javascript: 連結 - //├─ 空連結 → 隱藏 - //├─ 文字是路徑/空 → 補隱藏 span - //├─ 圖片+文字共存 → 圖片 alt 清空 - //├─ 無 title → 自動產出 title - //├─ 有 title 但與連結文字重複 → 只保留開窗提示 - //├─ 有 title 出現空括號 () → 清除並補上正確開窗提示 - //└─ 移除 aria-label - var urlParams = new URLSearchParams(window.location.search); - var isEditMode = urlParams.get('editmode') === 'on'; +// 有連結目的之所有a標籤的無障礙處理 +$(function() { + // Bootstrap 會把原始 title 搬到 data-bs-original-title,先還原回來 + $('a[data-bs-original-title]').each(function() { + var $a = $(this); + var originalTitle = $a.attr('data-bs-original-title'); + if (originalTitle && originalTitle.trim() !== '') { + $a.attr('title', originalTitle); + } + }); - var pageLang = $('html').attr('lang') || 'zh-Hant'; - var isEn = pageLang.toLowerCase().startsWith('en'); + /** + * 全站無障礙 AA 級補強 (整合 HM1240400C 與 HM1240401C 規範) + */ + function fixAccessibilityAll() { + // --- 0. 環境與語言偵測 --- + //1200ms 後執行(確保所有其他 function 執行完畢後才處理) + //Part 1:修正語言選單按鈕 + //Part 2:掃描所有 + //├─ 排除 navbar-brand、javascript: 連結 + //├─ 空連結 → 隱藏 + //├─ 文字是路徑/空 → 補隱藏 span + //├─ 圖片+文字共存 → 圖片 alt 清空 + //├─ 無 title → 自動產出 title + //├─ 有 title 但與連結文字或圖片 alt 重複 → 只保留開窗提示 + //├─ 有 title 出現空括號 () → 清除並補上正確開窗提示 + //└─ 移除 aria-label + var urlParams = new URLSearchParams(window.location.search); + var isEditMode = urlParams.get('editmode') === 'on'; - var i18n = { - langBtn: isEn ? 'Open language menu in this window' : '在本視窗開啟語言選單', - newWin: isEn ? 'Open in new window' : '在新視窗開啟', - selfWin: isEn ? 'Open in this window' : '在本視窗開啟', - link: isEn ? 'Link' : '連結', - openImg: isEn ? 'Open image' : '開啟圖片內容', - sort: isEn ? 'Sort' : '排序' - }; + var pageLang = $('html').attr('lang') || 'zh-Hant'; + var isEn = pageLang.toLowerCase().startsWith('en'); - // --- Part 1: 語言選單修正 --- - var $langBtn = $('#languagebutton'); - if ($langBtn.length > 0) { - $langBtn.attr('title', i18n.langBtn); - $langBtn.removeAttr('aria-label'); + var i18n = { + langBtn: isEn ? 'Open language menu in this window' : '在本視窗開啟語言選單', + newWin: isEn ? 'Open in new window' : '在新視窗開啟', + selfWin: isEn ? 'Open in this window' : '在本視窗開啟', + link: isEn ? 'Link' : '連結', + openImg: isEn ? 'Open image' : '開啟圖片內容', + sort: isEn ? 'Sort' : '排序' + }; + + // --- Part 1: 語言選單修正 --- + var $langBtn = $('#languagebutton'); + if ($langBtn.length > 0) { + $langBtn.attr('title', i18n.langBtn); + $langBtn.removeAttr('aria-label'); + } + + // --- Part 2: 全站連結與圖片邏輯處理 --- + $('a').each(function() { + var $a = $(this); + + // 【條件 1:排除特定 class】 + if ($a.hasClass('navbar-brand')) { + return; } - // --- Part 2: 全站連結與圖片邏輯處理 --- - $('a').each(function() { - var $a = $(this); + var href = ($a.attr('href') || '').toLowerCase(); + if (!href || href.startsWith('javascript:')) return; - // 【條件 1:排除特定 class】 - if ($a.hasClass('navbar-brand')) { - return; + // --- 關鍵修正:先偵測是否有原始 title --- + var rawTitleAttr = $a.attr('title'); + var hasOriginalTitle = (typeof rawTitleAttr !== 'undefined' && rawTitleAttr !== false && rawTitleAttr.trim() !== ""); + + // 清理   與 空白 + var linkText = $a.text().replace(/\u00a0/g, '').trim(); + var $img = $a.find('img'); + var $icons = $a.find('i, svg'); + var currentTitle = ($a.attr('title') || '').trim(); + + // ✅ 在 D 區塊清空 alt 之前,先記錄圖片原始 alt + var imgAltOriginal = $img.length > 0 ? ($img.attr('alt') || '').trim() : ''; + + // --- 【修正 1:隱藏空連結】 --- + if (!isEditMode && linkText === "" && $img.length === 0 && $icons.length === 0) { + $a.hide(); + return; + } + + // --- 【修正 2:文字語意防禦】 --- + if ((linkText === "" || linkText.startsWith('/') || linkText.includes('?')) && $img.length === 0 && $icons.length === 0) { + var accessibleText = i18n.link; + if (href.includes('sort')) { + accessibleText = i18n.sort; } - - var href = ($a.attr('href') || '').toLowerCase(); - if (!href || href.startsWith('javascript:')) return; - - // --- 關鍵修正:先偵測是否有原始 title --- - var rawTitleAttr = $a.attr('title'); - var hasOriginalTitle = (typeof rawTitleAttr !== 'undefined' && rawTitleAttr !== false && rawTitleAttr.trim() !== ""); - - // 清理   與 空白 - var linkText = $a.text().replace(/\u00a0/g, '').trim(); - var $img = $a.find('img'); - var $icons = $a.find('i, svg'); - var currentTitle = ($a.attr('title') || '').trim(); - // --- 【修正 1:隱藏空連結】 --- - if (!isEditMode && linkText === "" && $img.length === 0 && $icons.length === 0) { - $a.hide(); - return; + var $span = $a.find('span'); + if ($span.length > 0) { + $span.text(accessibleText); + } else { + $a.append('' + accessibleText + ''); + $span = $a.find('span').last(); } - // --- 【修正 2:文字語意防禦】 --- - if ((linkText === "" || linkText.startsWith('/') || linkText.includes('?')) && $img.length === 0 && $icons.length === 0) { - var accessibleText = i18n.link; - if (href.includes('sort')) { - accessibleText = i18n.sort; - } - - var $span = $a.find('span'); - if ($span.length > 0) { - $span.text(accessibleText); - } else { - $a.append('' + accessibleText + ''); - $span = $a.find('span').last(); - } + $span.css({ + 'display': 'inline-block', 'position': 'absolute', 'width': '1px', 'height': '1px', + 'padding': '0', 'margin': '-1px', 'overflow': 'hidden', 'clip': 'rect(0, 0, 0, 0)', + 'white-space': 'nowrap', 'border': '0' + }); + linkText = accessibleText; + } - $span.css({ - 'display': 'inline-block', 'position': 'absolute', 'width': '1px', 'height': '1px', - 'padding': '0', 'margin': '-1px', 'overflow': 'hidden', 'clip': 'rect(0, 0, 0, 0)', - 'white-space': 'nowrap', 'border': '0' - }); - linkText = accessibleText; + // A. 視窗動作規範 + var isNewWindow = ($a.attr('target') === '_blank'); + var windowTask = isNewWindow ? i18n.newWin : i18n.selfWin; + + // B. 偵測檔案類型 + var fileExt = ""; + var fileMatches = href.match(/\.(pdf|doc|docx|xls|xlsx|ppt|pptx|odt|ods|odp|zip|rar|jpg|png|csv)$/); + if (fileMatches) { + fileExt = fileMatches[1].toLowerCase(); + } + + // C. 智慧修正標題判斷 + var hasBadSymbol = currentTitle.includes('()') || + currentTitle.includes('Open in new window') || + currentTitle.includes('/uploads/'); + + if (currentTitle.startsWith('/') || currentTitle.includes('?')) { + currentTitle = ""; + } + + // D. 處理【HM1240400C】:圖片與文字毗鄰時,替代文字只能有一份 + if (($img.length > 0 || $icons.length > 0) && linkText !== "") { + if ($img.length > 0) { + $img.attr('alt', ''); } - // A. 視窗動作規範 - var isNewWindow = ($a.attr('target') === '_blank'); - var windowTask = isNewWindow ? i18n.newWin : i18n.selfWin; + var $hiddenSpans = $a.find('span').filter(function() { + return $(this).css('display') === 'none' || $(this).attr('style')?.includes('display: none'); + }); - // B. 偵測檔案類型 - var fileExt = ""; - var fileMatches = href.match(/\.(pdf|doc|docx|xls|xlsx|ppt|pptx|odt|ods|odp|zip|rar|jpg|png|csv)$/); - if (fileMatches) { - fileExt = fileMatches[1].toLowerCase(); - } - - // C. 智慧修正標題判斷 - var hasBadSymbol = currentTitle.includes('()') || - currentTitle.includes('Open in new window') || - currentTitle.includes('/uploads/'); - - if (currentTitle.startsWith('/') || currentTitle.includes('?')) { - currentTitle = ""; - } - - // D. 處理【HM1240400C】:圖片與文字毗鄰時,替代文字只能有一份 - if (($img.length > 0 || $icons.length > 0) && linkText !== "") { - if ($img.length > 0) { - $img.attr('alt', ''); - } - - var $hiddenSpans = $a.find('span').filter(function() { - return $(this).css('display') === 'none' || $(this).attr('style')?.includes('display: none'); - }); - - if ($hiddenSpans.length > 0) { - $hiddenSpans.each(function() { - var $span = $(this); - if ($span.text().includes('/uploads/')) { - $span.text(i18n.openImg); - } - - $span.css({ - 'display': 'inline-block', - 'position': 'absolute', - 'width': '1px', - 'height': '1px', - 'padding': '0', - 'margin': '-1px', - 'overflow': 'hidden', - 'clip': 'rect(0, 0, 0, 0)', - 'white-space': 'nowrap', - 'border': '0' - }); - }); - } - } - - // E. 重新計算標題 (關鍵邏輯:若 hasOriginalTitle 為真,則不進入此區塊) - if (!hasOriginalTitle) { - if (linkText === "" && $img.length > 0) { - var rawAlt = ($img.attr('alt') || '').trim(); - var forbidden = ['這是一張圖片', '圖片', 'image', 'photo', '圖', '']; - var imgAlt = forbidden.some(function(txt) { return rawAlt.toLowerCase() === txt; }) - ? ($a.attr('aria-label') || i18n.link) : rawAlt; + if ($hiddenSpans.length > 0) { + $hiddenSpans.each(function() { + var $span = $(this); + if ($span.text().includes('/uploads/')) { + $span.text(i18n.openImg); + } - var fileInfo = fileExt ? '[' + fileExt.toUpperCase() + '] ' : ''; - $a.attr('title', (fileInfo + imgAlt + " " + windowTask).trim()); - $img.attr('alt', imgAlt); - } - else if (linkText !== "") { - if (fileExt !== "" || hasBadSymbol || currentTitle === "" || currentTitle.includes('/uploads/')) { - if (fileExt !== "") { - $a.attr('title', linkText + " ." + fileExt + " " + windowTask); - } else { - $a.attr('title', windowTask); - } + $span.css({ + 'display': 'inline-block', + 'position': 'absolute', + 'width': '1px', + 'height': '1px', + 'padding': '0', + 'margin': '-1px', + 'overflow': 'hidden', + 'clip': 'rect(0, 0, 0, 0)', + 'white-space': 'nowrap', + 'border': '0' + }); + }); + } + } + + // E. 重新計算標題 (關鍵邏輯:若 hasOriginalTitle 為真,則不進入此區塊) + if (!hasOriginalTitle) { + if (linkText === "" && $img.length > 0) { + var rawAlt = ($img.attr('alt') || '').trim(); + var forbidden = ['這是一張圖片', '圖片', 'image', 'photo', '圖', '']; + var imgAlt = forbidden.some(function(txt) { return rawAlt.toLowerCase() === txt; }) + ? ($a.attr('aria-label') || i18n.link) : rawAlt; + + var fileInfo = fileExt ? '[' + fileExt.toUpperCase() + '] ' : ''; + $a.attr('title', (fileInfo + imgAlt + " " + windowTask).trim()); + $img.attr('alt', imgAlt); + } + else if (linkText !== "") { + if (fileExt !== "" || hasBadSymbol || currentTitle === "" || currentTitle.includes('/uploads/')) { + if (fileExt !== "") { + $a.attr('title', linkText + " ." + fileExt + " " + windowTask); + } else { + $a.attr('title', windowTask); } } } + } - // ✅ 符合 HM1240404E:title 不應與連結文字重複 - if (hasOriginalTitle && currentTitle !== "") { - var titleWithoutWindow = currentTitle - .replace('(在本視窗開啟)', '') - .replace('(在新視窗開啟)', '') - .replace('Open in this window', '') - .replace('Open in new window', '') - .replace('另開新視窗前往', '') - .replace('另開新視窗', '') - .trim(); + // ✅ 符合 HM1240404E:title 不應與連結文字或圖片 alt 重複 + if (hasOriginalTitle && currentTitle !== "") { + var titleWithoutWindow = currentTitle + .replace('(在本視窗開啟)', '') + .replace('(在新視窗開啟)', '') + .replace('Open in this window', '') + .replace('Open in new window', '') + .replace('另開新視窗前往', '') + .replace('另開新視窗', '') + .trim(); - if (titleWithoutWindow === linkText && linkText !== i18n.link) { - $a.attr('title', windowTask); - } - - // ✅ 最終清理:若 title 出現空括號 () 則移除並補上正確開窗提示 - var finalTitle = ($a.attr('title') || '').trim(); - if (finalTitle.includes('()')) { - finalTitle = finalTitle.replace(/\(\)/g, '').trim(); - $a.attr('title', finalTitle + ' ' + windowTask); - } + // ✅ title 去掉開窗字串後,若與連結文字或圖片原始 alt 相同,則只保留開窗提示 + if ( + (titleWithoutWindow === linkText && linkText !== i18n.link) || + (imgAltOriginal !== '' && titleWithoutWindow === imgAltOriginal) + ) { + $a.attr('title', windowTask); } - // F. 最終清理:移除冗餘 label,避免螢幕閱讀器唸兩次 - $a.removeAttr('aria-label'); - }); - - // ✅ G. 補強特定連結(須在迴圈外,因為 javascript: 連結被迴圈跳過) - $('.btn-o a').each(function() { - var $a = $(this); - if (!$a.attr('target')) { - $a.attr('target', '_blank'); - $a.attr('rel', 'noopener noreferrer'); + // ✅ 最終清理:若 title 出現空括號 () 則移除並補上正確開窗提示 + var finalTitle = ($a.attr('title') || '').trim(); + if (finalTitle.includes('()')) { + finalTitle = finalTitle.replace(/\(\)/g, '').trim(); + $a.attr('title', finalTitle + ' ' + windowTask); } - $a.attr('title', isEn ? 'Share to X Open in new window' : '分享至 X 在新視窗開啟'); - }); + } - $('.print-button a').each(function() { - var $a = $(this); - if (!$a.attr('title') || $a.attr('title').trim().toLowerCase() === 'print') { - $a.attr('title', isEn ? 'Print this page' : '列印此頁'); - } - }); - } + // F. 最終清理:移除冗餘 label,避免螢幕閱讀器唸兩次 + $a.removeAttr('aria-label'); + }); - // ✅ 延遲 800ms 確保所有其他 function 執行完畢後才處理 - setTimeout(function() { - fixAccessibilityAll(); - }, 800); - }); - //圖示新增sr-only + // ✅ G. 補強特定連結(須在迴圈外,因為 javascript: 連結被迴圈跳過) + $('.btn-o a').each(function() { + var $a = $(this); + if (!$a.attr('target')) { + $a.attr('target', '_blank'); + $a.attr('rel', 'noopener noreferrer'); + } + $a.attr('title', isEn ? 'Share to X Open in new window' : '分享至 X 在新視窗開啟'); + }); + + $('.print-button a').each(function() { + var $a = $(this); + if (!$a.attr('title') || $a.attr('title').trim().toLowerCase() === 'print') { + $a.attr('title', isEn ? 'Print this page' : '列印此頁'); + } + }); + + $('a.i-archive__file-name').each(function () { + var $a = $(this); + var isNewWindow = ($a.attr('target') === '_blank'); + $a.attr('title', isNewWindow ? i18n.newWin : i18n.selfWin); + }); + } + + // ✅ 延遲 800ms 確保所有其他 function 執行完畢後才處理 + setTimeout(function() { + fixAccessibilityAll(); + }, 800); +}); + + $(function() { function smartFixIcons() { var isEn = $('html').attr('lang') === 'en'; @@ -1173,8 +1267,8 @@ if($('.w-ba-banner__slide a').eq(i).attr('target') == "") $('.w-ba-banner__slide a').eq(i).removeAttr('target'); }; - // 幫無標題之iframe加上title - for(var i=0;i<$('iframe').length;i++) + // 幫無標題之iframe加上title + for(var i=0;i<$('iframe').length;i++) if($('iframe').eq(i).attr('title')=="" || $('iframe').eq(i).attr('title')== undefined ){ if($('iframe').eq(i).attr('src').search('facebook') != -1 ) $('iframe').eq(i).attr('title','facebook'); @@ -1267,14 +1361,13 @@ var selectedText = $(this).text().trim(); $(this).find('span').text(selectedText + '(已選取)'); }); - //jPlayer 控制項無障礙標籤補強 $(function() { - /** - * jPlayer 控制項無障礙標籤補強 - * 1. 修正重複且無意義的 title="按鈕" - * 2. 解決鍵盤焦點無法進入隱藏介面的問題 - */ - function fixJPlayerAccessibility() { + /** + * jPlayer 控制項無障礙標籤補強 + * 1. 修正重複且無意義的 title="按鈕" + * 2. 解決鍵盤焦點無法進入隱藏介面的問題 + */ + function fixJPlayerAccessibility() { var $playerContainer = $('#jp_container_video_file'); // --- A. 修正按鈕標題 (解決語義問題) --- @@ -1328,7 +1421,7 @@ } `) .appendTo("head"); - } + } // 執行補強(設定延遲確保 jPlayer 已生成 DOM) setTimeout(fixJPlayerAccessibility, 500); @@ -1543,86 +1636,60 @@ setTimeout(fixEmptyHref, 500); }); //頁籤無障礙 - $(function () { - function fixTabAccessibility() { - var $tabNav = $('.tab_nav'); - var $tabs = $tabNav.find('li'); // ✅ 你的 HTML 是 li,不是 .filter_tab + $(function() { + /** + * 頁籤導覽 (Tab Navigation) 無障礙補強 + * 1. 容器加入 role="tablist" + * 2. 項目加入 role="tab" + * 3. 動態切換 aria-selected="true/false" + * 4. 確保 Enter 鍵可以觸發切換 (針對 tabindex="0" 的優化) + */ + function fixTabAccessibility() { + var $tabNav = $('.tab_nav'); + var $tabs = $tabNav.find('.filter_tab'); - // --- 1. 初始化結構語意 --- - $tabNav.attr('role', 'tablist'); + // --- 1. 初始化結構語意 --- + $tabNav.attr('role', 'tablist'); - $tabs.each(function () { - var $this = $(this); - var isActive = $this.hasClass('active'); + $tabs.each(function() { + var $this = $(this); + var isActive = $this.hasClass('active'); - $this.attr({ - 'role': 'tab', - 'aria-selected': isActive ? 'true' : 'false', - 'tabindex': isActive ? '0' : '-1' // ✅ 只有 active 的可以被 Tab 聚焦 - }); + // 加入頁籤角色與選取狀態 + $this.attr({ + 'role': 'tab', + 'aria-selected': isActive ? 'true' : 'false' + }); + + // 修正 Title:讓使用者知道這是切換頁籤 + var tabName = $this.text().trim(); + $this.attr('title', '切換至 ' + tabName); + }); - var tabName = $this.text().trim(); - $this.attr('title', '切換至 ' + tabName); - }); + // --- 2. 監聽切換事件 (點擊或鍵盤) --- + // 假設原本已有切換邏輯,我們在此「補強」屬性的變更 + $tabs.on('click', function() { + var $clickedTab = $(this); - // --- 2. 點擊事件:更新 aria-selected 與 tabindex --- - $tabs.on('click', function () { - var $clickedTab = $(this); + // 先將所有頁籤設為未選取 + $tabs.attr('aria-selected', 'false'); - $tabs.attr('aria-selected', 'false').attr('tabindex', '-1'); - $clickedTab.attr('aria-selected', 'true').attr('tabindex', '0'); - }); + // 將當前點擊的頁籤設為已選取 + $clickedTab.attr('aria-selected', 'true'); + }); - // --- 3. 鍵盤操作補強 --- - $tabs.on('keydown', function (e) { - var $current = $(this); - var currentIndex = $tabs.index($current); - var lastIndex = $tabs.length - 1; - var $target = null; + // --- 3. 鍵盤操作補強 (針對 tabindex="0" 的非按鈕元素) --- + $tabs.on('keydown', function(e) { + // 當按下 Enter (13) 或 Space (32) 時觸發點擊 + if (e.which === 13 || e.which === 32) { + e.preventDefault(); + $(this).trigger('click'); + } + }); + } - switch (e.which) { - case 13: // Enter - case 32: // Space - e.preventDefault(); - $current.trigger('click'); - break; - - case 37: // ← 左方向鍵:移到前一個頁籤 - case 38: // ↑ 上方向鍵 - e.preventDefault(); - $target = currentIndex > 0 - ? $tabs.eq(currentIndex - 1) - : $tabs.eq(lastIndex); // 到底了就循環到最後一個 - break; - - case 39: // → 右方向鍵:移到下一個頁籤 - case 40: // ↓ 下方向鍵 - e.preventDefault(); - $target = currentIndex < lastIndex - ? $tabs.eq(currentIndex + 1) - : $tabs.eq(0); // 到底了就循環到第一個 - break; - - case 36: // Home:跳到第一個頁籤 - e.preventDefault(); - $target = $tabs.eq(0); - break; - - case 35: // End:跳到最後一個頁籤 - e.preventDefault(); - $target = $tabs.eq(lastIndex); - break; - } - - // 移動焦點並觸發點擊切換 - if ($target && $target.length) { - $tabs.attr('tabindex', '-1'); - $target.attr('tabindex', '0').focus().trigger('click'); - } - }); - } - - setTimeout(fixTabAccessibility, 500); + // 延遲執行確保頁籤元件已渲染 + setTimeout(fixTabAccessibility, 500); }); //移除 accesskey="W" 之後的 | 符號 $(function() { @@ -1993,7 +2060,14 @@ // if($('.show-announcement').hasClass('show-announcement')) { // $('.').css('', ''); // } - + $(function() { + var $headerNav = $('.header-nav'); + $headerNav.contents().each(function() { + if (this.nodeType === 3 && this.nodeValue.trim() === '|') { + $(this).remove(); + } + }); + }); if($('.s-annc').length){ $(".carousel_images h4").remove(); $('.carousel_images').addClass('carousel_images2'); diff --git a/assets/stylesheets/template/base/_global.scss b/assets/stylesheets/template/base/_global.scss index 39b6952..0b5ad41 100644 --- a/assets/stylesheets/template/base/_global.scss +++ b/assets/stylesheets/template/base/_global.scss @@ -3,6 +3,9 @@ @import "../initial"; @import "variables"; +.fa-classic, .fa-regular, .fa-solid, .far, .fas ,.fa{ + font-family: var(--fa-style-family, "FontAwesome"); +} #orbit-bar .orbit-bar-inner > label:focus, #orbit-bar .orbit-bar-inner > label.focus{ .orbit-bar-search-sign-language{ display: block