'js'
This commit is contained in:
parent
4e8adc697e
commit
27d35c6da1
|
|
@ -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);
|
||||
// // 確保 <a> 內沒有文字節點 (避免重複添加)
|
||||
// if ($this.text().trim() === "") {
|
||||
// $this.append('<span class="sr-only">公告圖片</span>');
|
||||
// }
|
||||
// });
|
||||
$(".widget-link__widget-title").each(function () {
|
||||
if ($(this).text().trim() === "") {
|
||||
$(this).append('<span class="sr-only">公告標題</span>');
|
||||
|
|
@ -874,224 +945,247 @@
|
|||
setTimeout(fixImageAccessibility, 500);
|
||||
});
|
||||
|
||||
// 有連結目的之所有a標籤的無障礙處理
|
||||
$(function() {
|
||||
/**
|
||||
* 全站無障礙 AA 級補強 (整合 HM1240400C 與 HM1240401C 規範)
|
||||
*/
|
||||
function fixAccessibilityAll() {
|
||||
// --- 0. 環境與語言偵測 ---
|
||||
//1200ms 後執行(確保所有其他 function 執行完畢後才處理)
|
||||
//Part 1:修正語言選單按鈕
|
||||
//Part 2:掃描所有 <a>
|
||||
//├─ 排除 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:掃描所有 <a>
|
||||
//├─ 排除 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('<span>' + accessibleText + '</span>');
|
||||
$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('<span>' + accessibleText + '</span>');
|
||||
$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');
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue