;(function($, win, undefined) { // ECMAScript 5 嚴格模式 'use strict'; $(document).ready(function() { // 確保兩個元素都存在 if ($('.header-nav blockquote').length && $('.orbit-bar-menu').length) { $('.header-nav blockquote').appendTo('.orbit-bar-menu'); } }); //header fixed在上方 $(function(){ function initdata1(){ if (!$('.homebanner').length) return; // 取得 65.5em 對應的 px var em = parseFloat($('body').css('font-size')); var minHeight = 65.5 * em; // 判斷 .layout-content 高度 if ($('.layout-content').height() < minHeight) return; var scrollTop = $(window).scrollTop(); $('.outdropdowns').toggleClass('navFixed', scrollTop > 5); } initdata1(); $(window).on('scroll', function(){ requestAnimationFrame(initdata1); }); }); // 初始函數: 把所有的程式碼都包在init裡面,方便在之後的jQuery ready 函數裡一次呼叫 function init() { // 快取一些常用的變數 var doc = document; var lang = doc.documentElement.lang; var pageModule = doc.body.getAttribute('data-module'); var resizeTimer = -1; // 把所有的函數都包在orbit這個物件裡並按模組做簡單的分類 var orbit = { // 工具函數,裡面包含可以重覆使用的函數 utils: { // 字數限制函數, 因為系統預設沒有,所以使用JS來做 // els = 元素, maxLen = 限制長度 truncateText: function(els, maxLen) { var els = doc.querySelectorAll(els); var newTitle = ''; var i = -1; var elsLen = els.length; for (i = 0; i < elsLen; i++) { if (els[i].firstChild !== null) { if (els[i].firstChild.length > maxLen) { newTitle = els[i].firstChild.textContent; els[i].textContent = newTitle.substring(0, maxLen) + '...'; } } } } }, // 外掛,所有的外掛都可以放到這個物件裡 // plugins: { // // 自適應圖片裁切,Ray的外掛 // bullEye: function() { // $('.bullseye').bullseye({ // fadeEffect: false // }); // } // }, member: { // 欄位相同高度,小心這個函數沒有計算到圖片高度,所以可能要搭配 jQuery load函數使用,或是之後使用更好的方式例如 CSS3 flexbox equalHeight: function(el) { var bigbrother = -1; var $el = $(el); $el.each(function(i) { bigbrother = bigbrother > $el.eq(i).height() ? bigbrother : $el.eq(i).height(); }); $el.height(bigbrother); }, // 把沒有完成資料的表格列藏起來, 因為後台不管有沒有資料都會輸出項目,所以需要在前台藏起來… removeEmptyRow: function() { // index 頁面項目 $('.i-member-profile-item .i-member-value').each(function() { if ($(this).text().trim() === '' || $(this).text().trim() === ':') { $(this).parent().addClass('hide'); } }); // show 頁面項目 $('.show-member .member-data th, .show-member .member-data td').each(function() { if ($(this).text().trim() === '') { $(this).parent('tr').addClass('hide'); } }); }, }, archives: { // 把沒有文字內容的標題藏起來,因為就算是標題裡沒有文字系統仍然會輸出,這樣會造成一些多餘的CSS margins, paddings,或許之後也可以使用 CSS3 :empty selector 處理 // el = 要移除的元素 removeEmptyTitle: function(el) { var $el = $(el); var $els = $el.children(); $.each($els, function(i, val) { if ($els.eq(i).text().trim() === '') { $els.eq(i).addClass('hide'); } }); $.each($el, function(i, val) { if ($el.eq(i).children('.hide').length >= 2) { $el.eq(i).addClass('hide'); } }); }, // bootstarp panel 功能擴充,因為原本的功能不支援多個panel extendPanel: function() { var len = $('.i-archive .panel-title').length; var i = -1; if (len > 0) { // 新增數字到要對應的panel按鈕id及href上面 for (i = 0; i < len; i++) { $('.panel-title:eq(' + i + ') .collapsed').attr('href', '#collapse' + i); $('.panel-collapse:eq(' + i + ')').attr('id', 'collapse' + i); } } } }, adBanner: { // 讓AD banner 的圖片可以點選,因為系統預設輸出的圖片是沒有連結的 // els = 要可以點選的元素(需要配合有data-link這個參數及data-targe才能使用) addLinkOnADBanner: function(els) { $.each(els, function() { if ($(this).data('link') !== '' && !$(this).hasClass('youtube')) { $(this).on('click', function() { var target = $(this).data('target'); var link = $(this).data('link'); // 設定頁面打開的方式,記得要加上data-bs-target在HTML裡面 if (target === '_blank') { window.open(link, target); } else { window.location.href = link; } }).addClass('cursor'); // cursor類別樣式定義在CSS裡面 } }); }, }, // 移除行動版下拉選單 removeDropdown: function() { var $nav = $('#main-nav'); $nav .find('.menu-drop') .remove(); $nav .find('.opened') .removeClass('opened'); }, // 網站次選單設定,如果次選單有第三層就新增下拉選單的圖示及加上bootstrap class // els = 選單元素 sitemenuDropdown: function(els) { var els = doc.querySelectorAll('.sitemenu-list.level-2'); var len = els.length; var i = -1; var caret = null; for (i = 0; i < len; i++) { if (els[i].children.length) { caret = doc.createElement('span'); caret.className = 'sitemenu-dropdown-toggle fa fa-caret-down'; caret.setAttribute('data-bs-toggle', 'dropdown'); els[i].parentNode.insertBefore(caret, els[i]); els[i].className += ' dropdown-menu'; } } }, // 回到頁面最頂端,動態產生DOM // txt = 按鈕的文字, speed = 捲動時的速度 goBackTop: function(txt, speed) { var top = document.createElement('div'); top.className = 'go-back-top no-print'; top.textContent = txt || 'top'; doc.body.appendChild(top); // 判斷是否顯示按鈕 $(window).scroll(function() { if ($(this).scrollTop() !== 0) { $('.go-back-top').fadeIn(); } else { $('.go-back-top').fadeOut(); } }); // 捲動效果 $('.go-back-top').on('click', function() { $('body, html').animate({ scrollTop: 0 }, speed || 300); return false; }); }, // Multi-column layout, passing ID or class string as parameters and a // Bootstrap col class for full width, eg: col-md-12 setColumn: function(leftCol, rightCol, columnCls) { var $leftCol = $(leftCol); var $rightCol = $(rightCol); var columnCls = columnCls || 'col-sm-12'; if ($leftCol.length && $rightCol.length) { $.each([$leftCol, $rightCol], function() { if ($(this).is(':empty')) { $(this) .addClass('empty-column') .siblings() .removeClass(function(index, css) { return (css.match(/(^|\s)col-\S+/g) || []).join(' '); }) .addClass(columnCls); } }); } }, MobileMenu: function() { var $menu = $('[data-menu-level="0"]'); $menu.find('ul[data-menu-level="1"]').parent().addClass('mobile-menu1'); $menu.find('ul[data-menu-level="2"]').parent().addClass('mobile-menu2'); var $caret1 = $(''); var $caret2 = $(''); // 如果有第二層選單,新增對應的類別到parent元素上 $('.nav-level-1') .parent('li') .addClass('has-dropdown level-1'); // 檢查是否已經有dropdown-toggle-icon這個元素,才不會在resize事件中重覆新增 if ($('.has-dropdown.level-1 .menu-drop').length < 1) { $('.mobile-menu1').append($caret1); // 如果有第三層選單,新增對應的類別到parent元素上 $('.nav-level-2') .parent('li') .addClass('has-dropdown level-2'); $caret2.appendTo('.has-dropdown.level-2'); } }, ClickMenuHandler: function() { // 處理主選單切換(漢堡 icon) $(document).on('click', '.navbar-toggle', function (e) { e.preventDefault(); // 確保 .navbar-toggle 放到 .modules-menu 後面 $('.mobile-menu').each(function () { var $menu = $(this); if ($menu.find('.modules-menu').length && !$menu.find('.modules-menu + .navbar-toggle').length) { $menu.find('.modules-menu').after($menu.find('.navbar-toggle')); } }); $('.mobile-menu').toggleClass('active'); $('body').toggleClass('noscroll'); $('.mobile-menu .navbar-toggle').removeClass('collapsed'); // 關閉所有下拉選單 $('.mobile-menu1 > ul, .mobile-menu2 > ul').slideUp(500); $('.mobile-menu1 > .menu-drop, .mobile-menu2 > .menu-drop').removeClass('opened'); // 無障礙:聚焦第一個互動元素 if ($('.mobile-menu').hasClass('active')) { setTimeout(function () { $('.modules-menu').find('input, button, select, textarea, a').first().focus(); }, 100); } }); $('.mobile-menu1 > .menu-drop').click(function(){ var $that = $(this); var opencheck1 = $that.hasClass('opened'); if ( opencheck1 == 0 ) { $('.mobile-menu1 > ul').not($that.siblings('ul')).slideUp(500); $('.mobile-menu1 > .menu-drop').not($that).removeClass('opened'); $('.mobile-menu2 > ul').slideUp(500); $('.mobile-menu2 > .menu-drop').removeClass('opened'); $that.siblings('ul').slideDown(500); $that.addClass('opened'); } else if (opencheck1 == 1) { $that.siblings('ul').slideUp(500); $('.mobile-menu2 > ul').slideUp(500); $('.mobile-menu2 > .menu-drop').removeClass('opened'); $that.removeClass('opened'); } }) $('.mobile-menu2 > .menu-drop').click(function(){ var $that = $(this); var opencheck2 = $that.hasClass('opened'); if ( opencheck2 == 0 ) { $('.mobile-menu2 > ul').not($that.siblings('ul')).slideUp(500); $('.mobile-menu2 > .menu-drop').not($that).removeClass('opened'); $that.siblings('ul').slideDown(500); $that.addClass('opened'); } else if (opencheck2 == 1) { $that.siblings('ul').slideUp(500); $that.removeClass('opened'); } }) } }; // 把orbit物件加到window物件裡面並改名為ORBITFRONT來減少名稱衝突的機會 win.ORBITFRONT = orbit; // 在switch裡測試頁面模組後執行對應的函數 switch (pageModule) { case 'home': break; case 'member': orbit.member.removeEmptyRow(); $('.index-member-3 .member-data-title-email').empty(); break; case 'archive': orbit.archives.removeEmptyTitle('.i-archive__category-item'); orbit.archives.extendPanel(); break; case 'gallery': orbit.utils.truncateText('.show-description', 15); break; default: break; } // 在所有的頁面(包含首頁)執行下面這幾個函數 orbit.sitemenuDropdown(); orbit.goBackTop('top', 800); // orbit.plugins.bullEye(); orbit.setColumn('.left-column', '.right-column'); // 自適應網頁使用,當網頁載入時,如果視窗寬度小於769,就執行orbit.nav.setDropdown函數 if ($(window).width() < 769) { // orbit.nav.setDropdown(); orbit.MobileMenu(); $('.mobile-menu').append($('.modules-menu')); $('.header-buttom').appendTo($('.modules-menu')); orbit.ClickMenuHandler(); } // 自適應網頁使用,當使用者改變瀏覽器寬度時呼叫orbit.nav.setDropdown函數 $(window).resize(function() { if ($(window).width() < 769) { if (resizeTimer) clearTimeout(resizeTimer); resizeTimer = setTimeout(function() { // if ( $('.modules-menu i').length == 0 ) { // orbit.MobileMenu(); // } if( $('.mobile-menu .modules-menu').length == 0 ) { $('.mobile-menu').append($('.modules-menu')); $('.header-buttom').appendTo($('.modules-menu')); orbit.MobileMenu(); orbit.ClickMenuHandler(); // $('.navbar-toggle').bind('click', orbit.ClickMenuHandler); // $('.navbar-toggle').bind(orbit.ClickMenuHandler()); } },500 )} else { resizeTimer = setTimeout(function(){ if( $('.mobile-menu .modules-menu').length > 0 ) { $('.layout-header .outdropdowns .dropdowns').append($('.modules-menu')); $('.dropdowns').append($('.header-buttom')); } orbit.removeDropdown(); }, 500); } }); // if($(window).width()<769){ // $('.header-buttom').appendTo($('.modules-menu')); // }else{ // $('.header-buttom').appendTo($('.dropdowns')); // } function forFreeGo() { setTimeout(function() { $('h1, h2, h3, h4, h5, h6').each(function() { var $heading = $(this); // 檢查是否為空 (去除空白後) if ($.trim($heading.text()) === '' && $heading.children().length === 0) { $heading.remove(); } }); }, 500); //zoom $(function () { $('.fnav a').each(function () { const $a = $(this); // 若已經有可見文字(非 icon),直接通過 const visibleText = $a.clone() .children('.icon, i, svg, .caret') .remove() .end() .text() .trim(); if (visibleText.length > 0) return; // 取得可用標籤文字(優先順序) let label = $a.attr('aria-label') || $a.attr('title') || $a.find('i[title]').attr('title') || ''; label = $.trim(label); // 若真的完全沒有,就給一個保底(避免空字串違規) if (!label) { label = '功能按鈕'; } // aria-label 一定要有 $a.attr('aria-label', label); // icon 對螢幕閱讀器隱藏 $a.find('i, svg').attr('aria-hidden', 'true'); // 若沒有隱藏文字才補 if ($a.find('.sr-only, .visually-hidden').length === 0) { $a.append(`${label}`); } }); }); //播放驗證碼語音 $(function () { $('.ask-question') .find('.controls button.fas.fa-volume-up') .each(function () { const $btn = $(this); // 已經補過就不重複處理 if ($btn.attr('aria-label')) return; $btn.attr({ 'aria-label': '播放驗證碼語音', 'aria-controls': 'captcha_audio', 'role': 'button' }); }); }); //刪除td的id $('td[id]').removeAttr('id'); //刪除空的title $('[class*="title"]').each(function () { const $el = $(this); // 取純文字(忽略 HTML tag、空白、換行) const text = $.trim($el.text()); if (text === '') { $el.remove(); } }); //表單legend $("fieldset").each(function () { const $fieldset = $(this); const hasLegend = $fieldset.children("legend").length > 0; if (!hasLegend) { // 嘗試抓最上層的群組標題,例如 "Apply" const headingText = $fieldset.find(".form-group:first").text().trim() || "表單填寫"; // 插入 legend 為第一個元素 $fieldset.prepend(`${headingText}`); } }); // 處理「上一頁」按鈕 $(".cmdBackward").each(function () { $(this) .attr("title", "上一頁") .attr("aria-label", "上一頁"); if ($(this).find(".sr-only").length === 0) { $(this).append('上一頁'); } $(this).find("i").attr("aria-hidden", "true"); $(this).find(".icon").attr("aria-hidden", "true"); }); // 處理「下一頁」按鈕 $(".cmdForward").each(function () { $(this) .attr("title", "下一頁") .attr("aria-label", "下一頁"); if ($(this).find(".sr-only").length === 0) { $(this).append('下一頁'); } $(this).find("i").attr("aria-hidden", "true"); $(this).find(".icon").attr("aria-hidden", "true"); }); $('.pagination li.active a').attr('aria-current', 'page'); $('path').each(function () { $(this) .attr('aria-hidden', 'true') .attr('focusable', 'false') .attr('tabindex', '-1'); }); $('.controlplay a[role="radio"]').on('click', function () { // 取消所有的 aria-checked 並還原文字 $('.controlplay a[role="radio"]').attr('aria-checked', 'false'); $('.controlplay a[role="radio"] span').each(function () { var text = $(this).text().replace('(已選取)', ''); $(this).text(text); }); // 設定目前被點擊的按鈕為已選取 $(this).attr('aria-checked', 'true'); var selectedText = $(this).text().trim(); $(this).find('span').text(selectedText + '(已選取)'); }); // 遍历所有的 .s-annc__tag-wrap 元素 $('.s-annc__tag-wrap').each(function() { // 遍历 .s-annc__tag-wrap 下的每个 a 元素 $(this).find('a').each(function() { // 如果 .s-annc__tag 元素为空或没有内容 if ($(this).find('.s-annc__tag').is(':empty')) { // 移除该 a 元素 $(this).remove(); } }); }); $('.w-ba-banner__caption li button').each(function (index) { const $slide = $('.w-ba-banner__slide').eq(index); const title = $slide.attr('data-cycle-title')?.trim(); if (title) { const fullText = title + '的pager'; $(this).attr('aria-label', fullText); $(this).attr('title', fullText); } }); // 當 focus 到 menu link 時,顯示對應 ul $('.sitemenu-item > a').on('focus', function () { $(this).siblings('ul').addClass('show'); }); // 當 focus 離開最後一個子選單 link 時,移除 .show $('.sitemenu-item').each(function () { const $submenuLinks = $(this).find('ul a'); if ($submenuLinks.length > 0) { $submenuLinks.last().on('blur', function () { // 當最後一個子項 blur 時關閉 ul $(this).closest('ul').removeClass('show'); }); } else { // 若沒有子項,當主選單項 blur 也隱藏 $(this).find('> a').on('blur', function () { $(this).siblings('ul').removeClass('show'); }); } }); if (document.documentElement.lang === 'zh_tw') { document.documentElement.lang = 'zh-Hant'; } //tab鍵按下 $(document).on('keydown', function(e) { if (e.key === "Tab" || e.keyCode === 9) { $('.header-nav, .dropdowns').css('display', 'block'); } }); function handleHover() { // 先統一移除舊事件,避免重複綁定 $('li').off('mouseenter mouseleave focusin focusout'); if ($(window).width() > 769) { // 1. 處理滑鼠 Hover $('li').hover( function() { $(this).children('ul').addClass('show'); }, function() { $(this).children('ul').removeClass('show'); } ); // 2. 處理鍵盤 Tab 聚焦 (關鍵修正) $('li').on('focusin', function() { // 當焦點進入 li 或其子元素時,顯示選單 $(this).children('ul').addClass('show'); }); $('li').on('focusout', function() { var $this = $(this); // 延遲偵測焦點是否真的「離開」了這個 li 區塊 setTimeout(function() { // 如果新的焦點不在當前這個 li 裡面,才移除 show if ($this.find(':focus').length === 0) { $this.children('ul').removeClass('show'); } }, 10); }); } } // 初始化與 Resize 監聽保持不變 handleHover(); $(window).on('resize', function() { handleHover(); }); //刪除空的h1 $('h1').each(function() { if ($(this).text().trim() === '') { $(this).remove(); } }); //refresh_btn加上aria-label $('#refresh_btn').each(function() { var $this = $(this); // 如果 button 尚未有 aria-label,則新增 if (!$this.attr('aria-label')) { $this.attr('aria-label', '重新整理'); } }); //無障礙會員表格刪除沒有顯示的th $('.i-member-tr-head').each(function() { if ($(this).css('display') === 'none') { $(this).remove(); } }); //無障礙公告a是空的 $('.w-annc__subtitle').each(function () { var $this = $(this); var $link = $this.find('a'); // 檢查 a 是否存在,且去除空白後是否為空字串 if ($link.length && $link.text().trim() === '') { $this.remove(); // 移除外層 .w-annc__subtitle } }); //無障礙單位轉換 $(function() { $('style:contains("font-size")').each(function() { let css = $(this).html(); css = css.replace(/font-size\s*:\s*([\d.]+)px\s*;?/gi, (_, px) => `font-size: ${(parseFloat(px) / 16).toFixed(3)}em;` ); $(this).html(css); }); }); $("[style*='font-size']").each(function() { var fontSize = $(this).css("font-size"); if (fontSize.includes("px")) { var pxValue = parseFloat(fontSize); // 取得數值 var emValue = pxValue / 16; // 假設 1em = 16px $(this).css("font-size", emValue + "em"); } }); $("[style*='font-size']").each(function() { var fontSize = $(this).css("font-size"); if (fontSize.includes("pt")) { var ptValue = parseFloat(fontSize); // 取得數值 var emValue = ptValue / 12; // 1em = 12pt(一般轉換標準) $(this).css("font-size", emValue + "em"); } }); $("[style*='font-size']").each(function() { var styleAttr = $(this).attr("style"); // 取得原始 style 屬性字串 var match = styleAttr.match(/font-size\s*:\s*(\d+(?:\.\d+)?)pt/i); if (match) { var ptValue = parseFloat(match[1]); var emValue = ptValue / 12; // 替換 style 屬性字串中的 pt 為 em var newStyle = styleAttr.replace(/font-size\s*:\s*\d+(?:\.\d+)?pt/i, `font-size: ${emValue}em`); $(this).attr("style", newStyle); } }); //表格scope $("table").each(function() { $(this).find("tr").each(function(rowIndex) { $(this).find("th").each(function(colIndex) { if (rowIndex === 0) { // 第一列的 th,適用於該欄 $(this).attr("scope", "col"); } else if (colIndex === 0) { // 其他列的第一個 th,適用於該行 $(this).attr("scope", "row"); } }); }); }); $(".banner-pager button").addClass('banner-pagerbtn'); $(".banner-pager button").attr("type","button"); $(".banner-pager button").append('下一張'); $("button").attr("role", "button"); $("select").attr("title","選擇類別"); $(".jarallax-video-audio").attr("role", "button"); $('button').each(function() { var $this = $(this); if (!$this.attr('title') || $this.attr('title').trim() === '') { $this.attr('title', '按鈕'); } }); //img無障礙 $('img').each(function() { var $img = $(this); var currentAlt = $img.attr('alt'); var currentTitle = $img.attr('title'); // --- 1. 處理裝飾性圖片 (最高優先權) --- // 若開發者標註為 "裝飾圖片",則清空 alt 並移除 title,這是 AA 級的最優解 if (currentAlt === "裝飾圖片" || currentTitle === "裝飾圖片") { $img.attr('alt', ''); $img.removeAttr('title'); return; // 處理完畢,跳過這張圖 } // --- 2. 處理缺失 alt 或空的 alt (需要補強的圖片) --- if (typeof currentAlt === 'undefined' || currentAlt.trim() === '') { let finalAlt = ""; // 預設值 // A. 嘗試從父層 (如 ) 的 title 抓取描述 var parentTitle = $img.parent().attr('title'); // B. 嘗試抓取同區域內的標題文字 (常見於新聞/公告列表) // 會往上找最近的連結,再往下找標題標籤 var nearbyTitle = $img.closest('a').find('h1, h2, h3, h4, h5, h6').first().text().trim(); if (parentTitle && parentTitle.trim() !== '') { finalAlt = parentTitle.trim(); } else if (nearbyTitle !== '') { finalAlt = nearbyTitle; } // 3. 寫入結果 // 如果 finalAlt 仍為空,則設為 "" (這符合 AA 規範,將無來源的圖視為裝飾) $img.attr('alt', finalAlt); // 4. 同步處理 title 屬性 // 在 AA 級中,如果 img 已經有 alt,通常不需要重複的 title if (currentTitle && currentTitle.trim() === finalAlt) { $img.removeAttr('title'); // 移除重複資訊,避免部分閱讀器讀兩次 } } }); $(".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('公告標題'); } }); $(".sitemenu-title").each(function () { if ($(this).text().trim() === "") { $(this).append('次選單'); } }); $(".annc-title").each(function () { if ($(this).text().trim() === "") { $(this).append('內頁公告標題'); } }); $(".event-annc-title").each(function () { if ($(this).text().trim() === "") { $(this).append('內頁活動公告標題'); } }); $(".show-title").each(function () { if ($(this).text().trim() === "") { $(this).append('內頁活動公告標題'); } }); $(".w-annc__widget-title").each(function () { if ($(this).text().trim() === "") { $(this).append('公告標題'); } }); $(".widget-title").each(function () { if ($(this).text().trim() === "") { $(this).append('網路資源標題'); } }); $(".widget-title").each(function () { if ($(this).text().trim() === "") { $(this).append('網路資源標題'); } }); $('input').each(function() { var $this = $(this); if (!$this.attr('title') || $this.attr('title').trim() === '') { $this.attr('title', '網內搜尋'); } }); $('.rucaptcha-image').each(function() { var $button = $(this).next('button'); // 取得緊接在 .rucaptcha-image 之後的 button if ($button.length && !$button.attr('aria-label')) { $button.attr('aria-label', '播放驗證碼語音'); } }); //有連結目的之所有a標籤加上aria-label和title $('a').each(function() { var $a = $(this); var href = $a.attr('href'); if (!href) return; // 1. 檢查是否有 .sr-only (給螢幕閱讀器專用的隱藏文字) var hasSrOnly = $a.find('.sr-only').length > 0; // 若有 .sr-only,移除屬性避免重複朗讀,這是最符合 AA 的作法 if (hasSrOnly) { $a.removeAttr('aria-label'); $a.removeAttr('title'); $a.removeAttr('alt'); // a 標籤不應有 alt return; } // 2. 移除 a 標籤上錯誤的 alt 屬性 (AA級規範 a 不可有 alt,alt 應在 img 上) if ($a.attr('alt')) { $a.removeAttr('alt'); } // 3. 開始組合描述字串 let contentDesc = ''; // 用來存放連結本身的內容描述 let windowTask = ''; // 用來存放開啟視窗的提示 // --- 視窗開啟方式判定 --- if ($a.attr('target') === '_blank') { windowTask = '(在新視窗開啟)'; } else if ($a.attr('target') === '_self') { windowTask = '(在本視窗開啟)'; } // --- 連結內容判定 --- var $img = $a.find('img'); if ($img.length > 0) { // 優先抓取圖片的 alt,如果沒有 alt 則嘗試抓取圖片的 title contentDesc = $img.attr('alt') || $img.attr('title') || ''; } // 如果圖片沒描述,或者根本沒圖片,則抓取連結內的文字 if (!contentDesc.trim()) { contentDesc = $a.text().trim(); } // 如果還是沒文字,檢查是否只有單個 span if (!contentDesc.trim() && $a.children('span').length === 1) { contentDesc = $a.children('span').text().trim(); } // --- 最終組合 --- // 確保內容描述在前,視窗提示在後,這符合語音操作邏輯 let finalLabel = (contentDesc + ' ' + windowTask).trim(); if (finalLabel) { // 4. 同步設定 aria-label (輔具優先) 與 title (滑鼠提示) // 如果原本沒有設定,才進行補強 if (!$a.attr('aria-label')) { $a.attr('aria-label', finalLabel); } if (!$a.attr('title')) { $a.attr('title', finalLabel); } } }); if (location.href.search('editmode=on') === -1){ $('a').each(function () { const $link = $(this); const linkText = $link.text().trim(); $link.find('img').each(function () { const $img = $(this); const altText = $img.attr('alt')?.trim(); // 如果圖片 alt 是空的,就略過(已符合) if (altText === '') return; // 如果圖片 alt 等於文字內容,就將 alt 清空,避免重複 if (altText === linkText) { $img.attr('alt', ''); } }); }); $('a').each(function () { const $a = $(this); // 取得可見文字(去掉空白) const text = $a.text().replace(/\u00a0/g, '').trim(); // 是否有圖片 const hasImg = $a.find('img').length > 0; // 若沒有文字、也沒有圖片 → 移除 if (text === '' && !hasImg) { $a.remove(); } }); } // 刪除banner-slide的空連結和空連結目標 for(var i=0;i<$('.w-ba-banner__slide a').length;i++){ if($('.w-ba-banner__slide a').eq(i).attr('href')=="") $('.w-ba-banner__slide a').eq(i).removeAttr('href'); 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++) 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'); else if($('iframe').eq(i).attr('src').search('google') != -1 ) $('iframe').eq(i).attr('title','google'); else if($('iframe').eq(i).attr('src').search('youtube') != -1 ) $('iframe').eq(i).attr('title','youtube'); else if($('iframe').eq(i).attr('src').search('twitframe') != -1 ) $('iframe').eq(i).attr('title','twitter'); else $('iframe').eq(i).attr('title','unknown'); }; //button是空的就加上內容 $('button').each(function() { var $this = $(this); var titleText = $this.attr('title') || ''; // 檢查 button 是否是空的(沒有可見文字或子元素) if ($this.text().trim() === '' && !$this.children().length && titleText) { // 新增隱藏的 span,內容為 title $this.append('' + titleText + ''); } }); // 刪除空的檔案室 var archievelen = $('dd a.i-archive-files-item').length; for(i=archievelen-1;i>=0;i--) if($('dd a.i-archive-files-item').eq(i).html().trim()=="") $('dd a.i-archive-files-item').eq(i).parent('dd').remove(); // 刪除具有空連結欄位的橫列 for(var i = 0;i < $('*[data-list] tr td a').length ; i++) if($('*[data-list] tr td a').eq(i).html().trim()=="") $('*[data-list] tr td a').eq(i).parent('td').parent('tr').remove(); // tab按鍵選到menu,會顯示下層的menu(為了符合無障礙) $('.nav-level-0>li>a').focus(function(e) { e.stopPropagation(); $(this).parent().focus(); if ($(this).parent().find('.nav-level-1').hasClass('show')) { } else { $('.nav-level-1').removeClass('show'); $(this).parent().find('.nav-level-1').addClass('show'); } }); $('.nav-level-1>li>a').focus(function(e) { e.stopPropagation(); if ($(this).parent().find('.nav-level-2').hasClass('show')) { }else{ $('.nav-level-2').removeClass('show'); $(this).parent().find('.nav-level-2').addClass('show'); } }); $('show').parent('li').focus(); $('.controlplay a[role="radio"]').on('click', function () { // 取消所有的 aria-checked 並還原文字 $('.controlplay a[role="radio"]').attr('aria-checked', 'false'); $('.controlplay a[role="radio"] span').each(function () { var text = $(this).text().replace('(已選取)', ''); $(this).text(text); }); // 設定目前被點擊的按鈕為已選取 $(this).attr('aria-checked', 'true'); var selectedText = $(this).text().trim(); $(this).find('span').text(selectedText + '(已選取)'); }); } forFreeGo(); //header banner setting if ( location.href.search('editmode=on') != -1 ) { $('.header-banner').css('z-index','2'); } else { $('.header-banner').css({ 'position': 'relative', 'top': '0', 'z-index': '-2', }); }; //公告頁籤 function annc_widget_nav() { $('.tab_nav').nextAll().addClass('tab_content'); $('.tab_content').css("display","none"); $('.tab_content').eq(0).css('display', 'block'); var num = $('.tab_nav li').length; $('.tab_content').eq(num).css('display', 'block'); $('.tab_content').eq(num).nextAll().css('display', 'block'); $('.tab_nav li').off('click').on('click',function() { $('.tab_nav li').removeClass('active'); $(this).addClass('active'); var fa = $(this).index(); $('.tab_content').attr('style',''); $('.tab_content').css("display","none"); $('.tab_content').eq(fa).css('display','block'); var num = $('.tab_nav li').length; $('.tab_content').eq(num).css('display', 'block'); $('.tab_content').eq(num).nextAll().css('display', 'block'); }); var url = window.location.search; if (url == "?editmode=on") { $('.tab_content').css({'position': 'relative','display':'block'}); } } annc_widget_nav(); //切換語言停留在同一頁 if(window.location.pathname!="/") $("#en").attr("href",window.location.pathname.replace("zh_tw","en")) //檔案室 下載檔案 hover 彈出備註訊息 $('[data-bs-toggle="tooltip"]').tooltip() //下載檔案格式dot pdf分色 $(".i-archive .label.label-primary").each(function() { var downloadType = $(this).text(); $(this).addClass(downloadType); }) //檔案室模組 Widget 手風琴 function extendPanelWidget() { var len = $('.panel-title').length; var i = -1; if (len > 0) { // 新增數字到要對應的panel按鈕id及href上面 for (i = 0; i < len; i++) { $('.panel-title:eq(' + i + ') .collapsed').attr('href', '#collapse' + i); $('.panel-collapse:eq(' + i + ')').attr('id', 'collapse' + i); } } } extendPanelWidget(); // member show tab scroll $('.nav-pills').scrollingTabs({ scrollToTabEdge: true, enableSwiping: true, leftArrowContent: [ '
', '
' ].join(''), rightArrowContent: [ '
', '
' ].join('') }); } $(document).ready(function () { // 處理所有 .fnav-item 裡的
$(".fnav-item a").each(function () { const $a = $(this); // 如果內部已經有 .sr-only,就略過 if ($a.find(".sr-only").length > 0) return; // 嘗試從 title 擷取語意文字 let label = $a.attr("title") || ""; // 如果還是空字串,再嘗試用 i 的 title if (!label.trim()) { const iconTitle = $a.find("i").attr("title"); if (iconTitle) label = iconTitle; } // 如果真的都沒有語意,預設一個 generic label(也可加入 warning log) if (!label.trim()) { label = "操作按鈕"; } // 加上 title 和 aria-label $a.attr("title", label).attr("aria-label", label); // 加上 sr-only 輔助文字 $a.append(`${label}`); // 確保 icon 不被閱讀器讀取 $a.find("i").attr("aria-hidden", "true"); $a.find(".icon").attr("aria-hidden", "true"); }); }); //video js $(document).ready(function () { if ($(".main-content .video_detail").length > 0) { $('.videopagenone').css("display","none"); $('.videopage').css('display', 'block'); $('.sitemenu').css("display","none"); $('span img[alt="HD"]').parent().hide(); $('span img[alt="觀看人數"]').remove(); $(".video_detail .view_info span").each(function () { var text = $(this).text().trim(); // 取得 裡的文字,去掉前後空格 var number = text.replace(/\D/g, ""); // 只保留數字部分 if (number) { $(this).text(`・觀看次數:${number}次`); // 更新內容格式 } }); $(".movie_desc").before('

影片內容

'); $(".movie_desc").each(function () { var decodedHtml = $("
").html($(this).text()).html(); // 轉換轉義的 HTML $(this).html(decodedHtml); // 設置為真正的 HTML }); $(".video_group_time").each(function () { var $this = $(this); // 找到對應的 ,並移動到 .video_group_time 內部 var $q = $this.closest(".imglst_desc").find(".movie_desc q"); if ($q.length) { $this.append($q.clone()); // 將 複製並添加到 .video_group_time $q.remove(); // 移除 .movie_desc 裡的 } // 移動 .view_info 到 .video_group_time 的內部 $this.append($this.siblings(".view_info")); // 取得內容並移除 "SystemAdmin | " 前綴 var text = $this.text().trim(); var newText = text.replace(/^.*\|\s*/, ""); // 移除 "SystemAdmin | " $this.text(newText); // 更新內容 $(this).insertBefore($(this).closest(".imglst_desc").siblings("h3")); }); $(".main-content").css({ "max-width": "920px", "margin": "auto" }); $(".video_box_wrap").css("padding-bottom", "56%"); $(".video_detail .video_yt_box").insertBefore(".video_detail .video_group_time"); }; function getYouTubeThumbnail() { var $ytThumb = $(".ytp-cued-thumbnail-overlay-image"); if ($ytThumb.length) { var imageUrl = $ytThumb.css("background-image"); // 檢查背景圖格式:url("https://...") var urlMatch = imageUrl.match(/url\(["']?(.*?)["']?\)/); var extractedUrl = urlMatch ? urlMatch[1] : null; if (extractedUrl) { // console.log("成功獲取縮圖:", extractedUrl); $(".background").css("background-image", `url("${extractedUrl}")`); } else { // console.log("背景圖格式不對,改用影片 ID 生成縮圖"); setThumbnailFromVideoId(); } } else { // console.log("找不到 .ytp-cued-thumbnail-overlay-image,改用影片 ID 生成縮圖"); setThumbnailFromVideoId(); } } function setThumbnailFromVideoId() { var $iframe = $("iframe[src*='youtube.com/embed']"); if ($iframe.length) { var src = $iframe.attr("src"); var videoIdMatch = src.match(/youtube\.com\/embed\/([^?]+)/); var videoId = videoIdMatch ? videoIdMatch[1] : null; if (videoId) { var fallbackImageUrl = `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`; // console.log("透過影片 ID 取得縮圖:", fallbackImageUrl); $(".background").css("background-image", `url("${fallbackImageUrl}")`); } } } // 嘗試多次加載 var interval = setInterval(function () { if ($(".ytp-cued-thumbnail-overlay-image").length || $("iframe[src*='youtube.com/embed']").length) { getYouTubeThumbnail(); clearInterval(interval); } }, 1000); //改變日期格式 $(".video_group_time").each(function () { var $this = $(this); var originalText = $this.text().trim(); // 把 YYYY-MM-DD 轉換成 M月D日 var formattedText = originalText.replace(/(\d{4})-(\d{2})-(\d{2})/g, function (match, year, month, day) { return parseInt(month, 10) + "月" + parseInt(day, 10) + "日"; }); // 找到對應的 ,並複製 var $q = $this.closest(".video_data").find(".video_desc q").clone(); // 更新內容並加上 $this.html(formattedText).append($q); }); }); //rucaptcha-image $(document).ready(function () { $('.rucaptcha-image').removeAttr('onload'); // 檢查是否已插入過 if (!$('#captcha_audio').length) { const audioButton = $(` `); const audio = $(''); $('.rucaptcha-image').after(audioButton, audio); } }); //萬用表格searchbtn2 $(document).ready(function () { $('.searchbtn2').click(function (event) { event.preventDefault(); // 防止預設行為 $(".searchbox").slideToggle(300, function () { updateAriaExpanded(); }); $(this).closest('.ken-click').toggleClass('ken-click2'); }); let triggeredByFocus = false; function updateAriaExpanded() { const isVisible = $(".searchbox").is(":visible"); $(".searchbtn2").attr("aria-expanded", isVisible ? "true" : "false"); } // 預設 aria-expanded 為 false $(".searchbtn2").attr("aria-expanded", "false"); }); // 強制保持全站search展開 $(document).ready(function () { const $searchBox = $('.search-box'); const $input = $searchBox.find('.input-search'); const $btn = $('.btn-search'); // 輔助函式:安全地檢查輸入框是否為空 // 解決 Cannot read properties of undefined (reading 'trim') function isInputEmpty() { if ($input.length === 0) return true; // 如果找不到 input,視為空 var val = $input.val(); return !val || val.toString().trim() === ''; } // search移位 function moveSearchIfWide() { // 如果 input 正在輸入中,不要移動位置,避免鍵盤消失或閃爍 if ($input.is(':focus')) return; if ($(window).width() > 769) { // 如果已經在正確位置就不動 if (!$('.modules-menu-level-0 .searchclass').length) { $('.searchclass').appendTo('.modules-menu-level-0'); } } else { // 行動版位置 if ($('.navbar-brand').length > 0) { $('.navbar-brand').after($('.searchclass')); } } } // 初始化與 Resize 監聽 moveSearchIfWide(); $(window).on('resize', moveSearchIfWide); // 點擊 btn 時:若未展開則展開,展開後才可送出 $btn.on('click', function (e) { if (!$searchBox.hasClass('searching')) { e.preventDefault(); // 第一次點擊不送出 // 延遲讓 Android 不會立即 blur setTimeout(() => { $searchBox.addClass('searching'); if ($input.length > 0) $input[0].focus(); }, 100); } else if (isInputEmpty()) { // 沒有輸入值 → 不送出,focus 回去 e.preventDefault(); if ($input.length > 0) $input[0].focus(); } // 有輸入值就正常送出 }); // 點外面收起(無字才收) $(document).on('click touchstart', function (e) { if ( $searchBox.length > 0 && !$searchBox.is(e.target) && $searchBox.has(e.target).length === 0 && isInputEmpty() ) { $searchBox.removeClass('searching'); } }); // focus 時延遲加 .searching $input.on('focus', function () { setTimeout(() => { $searchBox.addClass('searching'); }, 50); }); // blur 時延遲移除 .searching $input.on('blur', function () { setTimeout(() => { if (isInputEmpty()) { $searchBox.removeClass('searching'); } }, 150); }); }); // 當文件物件模型(DOM)載入後,執行init函數 $(document).ready(function() { //常用到的js // $('.').after($('.')); // $('.').before($('.')); // $('.').append($('.')); // if($('.show-announcement').hasClass('show-announcement')) { // $('.').css('', ''); // } $('.i-publication__table').each(function () { const $table = $(this); const $tbody = $table.find('tbody'); if ($tbody.find('tr').length === 0) { $table.hide(); } }); if ($('.fatfooter').length === 0) { $('.btn-fatfooter').hide(); }; if($('.s-annc').length){ $(".carousel_images h4").remove(); $('.carousel_images').addClass('carousel_images2'); $(".carousel_images .w-ba-banner").next("div").find(".button-mid").remove(); $(".s-annc__post-wrap").next("hr").remove(); // $(".carousel_images").insertAfter(".s-annc__meta-wrap"); $('.breadcrumb-wrap').css('display', 'block'); // $(".main-content").css({ // "max-width": "920px", // "margin": "auto" // }); } $('.s-annc__tag-wrap ').after($('.s-annc__post-orbithashtags')); $('a').each(function () { const $a = $(this); // 有圖示或圖片就不刪 if ($a.find('i, img').length > 0) return; // 沒有任何實際文字內容(去除空白) const hasVisibleText = $a.text().trim().length > 0; // 進一步判斷 span 內部是否完全為空 const allChildrenEmpty = $a.children().length > 0 && $a.children().toArray().every(child => { return $(child).text().trim().length === 0; }); // 如果沒有文字內容且子元素全為空,則移除 if (!hasVisibleText && allChildrenEmpty) { $a.remove(); } }); $('.i-member-pic-wrap a').removeAttr('target'); function markCheckStatusButton() { $('.ask-question').each(function () { var $prev = $(this).prev(); // 取得前一個元素 // 如果前一個元素是 且 class 包含 "btn" if ($prev.is('a') && $prev.hasClass('btn')) { $prev.addClass('CheckStatus'); // 加上 class } }); }; markCheckStatusButton(); // 綁定滑動事件 $(".cycle-slideshow").swipe({ swipeLeft: function () { $(this).cycle("next"); }, swipeRight: function () { $(this).cycle("prev"); }, threshold: 50, // 滑動靈敏度(數值越小越敏感) }); $('#check_history_form input[type="submit"][value="Check History"]').addClass('CheckHistory'); $(".mybooking").append(''); //內頁dattpp移位 $('.i-annc__page-title').after($('.sitemenu-wrap2')); $('.i-archive-title').after($('.sitemenu-wrap2')); $('.page-module-title').after($('.sitemenu-wrap2')); $('.box-social-share').before($('.sitemenu-wrap3')); $('.box-social-share').before($('.sitemenu-wrap3')); $('.box-social-share').before($('.sitemenu-wrap3')); // $(".member-data2-tr").before($(".show-member .table-striped > tbody > tr:nth-of-type(4)")); // $(".nav-pills").before($(".show-member .table-striped > tbody > tr:last-child")); //檔案室手風琴 $('.panel-title>.collapsed').click(function(){ $(this).find('.fa').toggleClass("fa-chevron-down"); $(this).find('.fa').toggleClass("fa-chevron-up"); }); //背景widget設定 if ( location.href.search('editmode=on') != -1 ) { $('.background').css('z-index','2'); $('.background').css('position','relative'); } else { $('.background').css('z-index','-1'); $('.background').css('position','fixed'); }; //公告類別顏色 // $(".w-annc .w-annc__category-wrap").each(function() { // var SaveCategory = $(this).find(".w-annc__category").text(); // $(this).addClass(SaveCategory); // }) // $(".w-annc__item ").each(function() { // var SaveCategory2 = $(this).find(".w-annc__category").text(); // $(this).addClass(SaveCategory2); // }) $(".i-annc__item .i-annc__category-wrap").each(function() { var SaveCategory = $(this).find(".i-annc__category").text(); $(this).addClass(SaveCategory); }) $(".i-annc__item ").each(function() { var SaveCategory2 = $(this).find(".i-annc__category").text(); $(this).addClass(SaveCategory2); }) //預約 if ($(window).width() > 821) { $('.form-horizontal').append($('.cancelbooking')); $(".hire-ken-click").click(function(){ // $(".searchbox").slideToggle(300); $('.form-horizontal').toggleClass('hire-ken-click2'); $('.col-lg-5').toggleClass('shadowblock'); $(".cancelbooking").click(function(){ $('.form-horizontal').removeClass('hire-ken-click2'); $('.col-lg-5').removeClass('shadowblock'); }); }); } //navrwd移到選單 if ($(window).width() <769) { $('.modules-menu-level-0').after($('.header-nav')); }else{ $('.dropdowns').before($('.header-nav')); }; $('.sitemenu-vertical .sitemenu-dropdown-toggle').click(function(){ $('.sitemenu-vertical .dropdown-menu').slideToggle(); $(".sitemenu-vertical .sitemenu-dropdown-toggle").toggleClass("fa-caret-down"); $(".sitemenu-vertical .sitemenu-dropdown-toggle").toggleClass("fa-caret-up"); }); //頁尾選單開合 $('.btn-fatfooter').click(function(){ $('.fatfooter').slideToggle(); $(".btn-fatfooter .fa-chevron-down").toggleClass("rotate"); }); $(".menu-toggle").on('click', function() { $(this).toggleClass("on"); $('.menu-section').toggleClass("on"); $("nav ul").toggleClass('hidden'); }); $('.morebken').click(function(){ $('.list-unstyled>li:nth-child(n+5)').slideToggle(); $(".morebken .fa-chevron-down").toggleClass("rotate"); $(".openmorebken").toggleClass("closemorebken"); }); //RWD 自動縮放headerbannner function headerH() { if ($(window).width() < 769) { const navH = $('.layout-header .navbar-header').outerHeight(); $('.header-banner').css('height', navH ); } } headerH(); //downIcon $(".downIcon").click(function () { var move_to_target = function (stop) { var theTop; if (stop) { // $(".kenjohn").addClass('navFixed'); if ($('.layout-content2.topcontent').length != 0 && $('.layout-content2.topcontent').offset().top < 400) { $('.layout-content2').css('margin-top', $('.kenjohn').height() - $('#orbit-bar').height()); } if (parseInt($('.layout-content2').css('margin-top') == 0)) { theTop = $('.layout-content2.topcontent').offset().top - $(".kenjohn").position().top - 95; } else { theTop = $('.layout-content2.topcontent').offset().top - $(".kenjohn").position().top - $(".kenjohn").height() - 95; } } else { theTop = 5; } // console.log(theTop); $("html, body").animate({ scrollTop: theTop }, { duration: 400, easing: "swing", complete: function () { // console.log('finish'); if (!stop) { move_to_target(true); } } }); } move_to_target(false); return false; }); $(window).resize(function() { if ($(window).width() <769) { $('.modules-menu-level-0').after($('.header-nav')); }else{ $('.dropdowns').before($('.header-nav')); }; if ($(window).width() > 821) { $('.form-horizontal').append($('.cancelbooking')); $(".hire-ken-click").click(function(){ // $(".searchbox").slideToggle(300); $('.form-horizontal').toggleClass('hire-ken-click2'); $('.col-lg-5').toggleClass('shadowblock'); $(".cancelbooking").click(function(){ $('.form-horizontal').removeClass('hire-ken-click2'); $('.col-lg-5').removeClass('shadowblock'); }); }); } headerH(); }) // $(window).scroll(function() { // if ($(this).scrollTop() > 100) { /* 要滑動到選單的距離 */ // $('.outdropdowns').addClass('navFixed'); /* 幫選單加上固定效果 */ // } else { // $('.outdropdowns').removeClass('navFixed'); /* 移除選單固定效果 */ // } // }); // $('.navbar-brand h2').replaceWith(function() { // return $("

", { // class: this.className, // html: $(this).html() // }); // }); $('#search'). attr('title', '另開新視窗'); $(window).scroll(function () { var windowTop = $(window).scrollTop(); var windowBottom = windowTop + $(window).innerHeight(); function handleAnimationOnce(selector, animationClass, offsetRatio = 0.5) { $(selector).each(function () { var elementTop = $(this).offset().top; var elementHeight = $(this).height(); var triggerPoint = elementTop + elementHeight * offsetRatio; if ( triggerPoint >= windowTop && triggerPoint <= windowBottom && !$(this).hasClass(animationClass) ) { $(this).addClass(animationClass); } }); } handleAnimationOnce('.hide0', 'animationvisible', 0.1); handleAnimationOnce('.hide1', 'animationvisible1', 0.5); handleAnimationOnce('.hide2', 'animationvisible2', 0.5); handleAnimationOnce('.hide3', 'animationvisible3', 0.5); handleAnimationOnce('.rotate0', 'animationrotate0', 0.5); handleAnimationOnce('.zoomin', 'animationvisible5', 0.5); }); init(); }); //orbitbar無障礙js $(document).ready(function() { const isEnglish = document.documentElement.lang === 'en'; if (isEnglish) { $('.navbar-toggle').attr({ title: 'menu', 'aria-label': 'menu' }); $('label[for="open-orbit-nav"]').attr({ title: 'Site search and language menu', 'aria-label': 'Site search and language menu' }); $('.mobile-button').attr({ title: 'Language menu', 'aria-label': 'Language menu' }); } else { $('label[for="open-orbit-nav"]').attr({ title: '全站収尋及語言切換選單', 'aria-label': '全站収尋及語言切換選單' }); $('.mobile-button').attr({ title: '語言切換選單', 'aria-label': '語言切換選單' }); } $('label[for="open-orbit-login"]').removeAttr('tabindex'); $('#orbit-bar').find('li').each(function() { var $li = $(this); // 如果
  • 中没有 元素,则为
  • 设置 tabindex="0" if ($li.children('a').length === 0) { $li.attr('tabindex', '0'); } else { // 如果
  • 中有 元素,则确保 有 tabindex="0" $li.find('a').attr('tabindex', '0'); // 确保
  • 不影响焦点管理,移除
  • 的 tabindex $li.removeAttr('tabindex'); // 如果
  • 被聚焦,自动跳转到 元素 $li.on('focus', function() { $(this).find('a').focus(); }); } }); $('label[for="open-orbit-nav"]').attr('tabindex', '0'); // 当屏幕宽度小于 768px 时,将 .orbit-bar-search-sign-language 移动到 替換成它裡面的內容 }); $('.member-data-value-3 a').each(function () { $(this).replaceWith($(this).contents()); // 把替換成它裡面的內容 }); $('.member-data-value-3 a').has('i').each(function() { $(this).replaceWith($(this).contents()); }); $('.member-data-value-2 a').has('i').each(function() { $(this).replaceWith($(this).contents()); }); }); //選單li加上fa-chevron-down $(document).ready(function () { function addDropdownIcons() { if ($(window).width() > 769) { $('#main-nav.modules-menu-level-0 > li').each(function () { if ($(this).children('ul').length > 0) { const $toggle = $(this).children('a.dropdown-toggle'); if ($toggle.find('i.fa-chevron-down').length === 0) { $toggle.append(' '); } } }); }else { // 螢幕寬度小於等於 768 時,移除所有 chevron-down icon $('#main-nav.modules-menu-level-0 .kenmenu-drop').remove(); } } addDropdownIcons(); $(window).resize(function () { addDropdownIcons(); }); }); //banner動畫淡出 $(document).ready(function(){ // 一開始先觸發動畫 $(".w-ad-banner__slide.cycle-slide-active [data-animation]").each(function(){ triggerAnimation($(this)); }); // 每次輪播換圖後觸發 $(".w-ad-banner__wrap").on("cycle-after", function(event, optionHash, outgoingSlideEl, incomingSlideEl, forwardFlag){ $(incomingSlideEl).find("[data-animation]").each(function(){ triggerAnimation($(this)); }); }); // 動畫觸發 function function triggerAnimation($el){ let animClass = $el.attr("data-animation"); $el.removeClass(animClass); // 先移除,避免殘留 void $el[0].offsetWidth; // reflow 強制重繪 $el.addClass(animClass); // 重新加上動畫 class } }); //如果 裡面有 且 display: none,就移除整個 $(document).ready(function() { // 核心清理函數 function removeHiddenLinks() { $('.s-annc__post-wrap a').each(function() { var $a = $(this); // 如果 裡面有 且 display: none,就移除整個 if ($a.find('span').filter(function() { return $(this).css('display') === 'none'; }).length > 0) { $a.remove(); } }); } // 初始清理 removeHiddenLinks(); // 監控 .s-annc__post-wrap 內新增的節點 const target = document.querySelector('.s-annc__post-wrap'); if (target) { const observer = new MutationObserver(function(mutationsList) { // 每次有新增節點就重新清理 removeHiddenLinks(); }); observer.observe(target, { childList: true, subtree: true }); } }); //移除font-size-adjust 屬性 $(document).ready(function() { $('[style]').each(function() { var $el = $(this); var style = $el.attr('style'); if (style && style.includes('font-size-adjust')) { // 用正則移除 font-size-adjust 屬性(包含結尾的分號) style = style.replace(/font-size-adjust\s*:\s*[^;]+;?/gi, ''); // 去除多餘空白 style = style.trim(); // 更新 style $el.attr('style', style); } }); }); // //選單樣式2 // $(document).ready(function() { // "use strict"; // $(".menu > ul > li").hover(function(e) { // if ($(window).width() > 943) { // $(this).children("ul").stop(true, false).fadeToggle(150); // e.preventDefault(); // } // }); // $('.modules-menu-level-1').css('left','-'+$('.outdropdowns .dropdowns').offset().left+'px'); // }); // $(document).resize(function() { // $('.modules-menu-level-1').css('left','-'+$('.outdropdowns .dropdowns').offset().left+'px'); // if ($(window).width() < 769){ // $('.modules-menu-level-1').css('left','') // } // }); //隱藏Hashtags $(document).ready(function () { $('.universal-table-show .table-title').each(function () { var $titleTd = $(this); var titleText = $titleTd.text().trim(); var $nextTd = $titleTd.next('td'); if (titleText === 'Hashtags' && $nextTd.length > 0 && $nextTd.text().trim() === '') { $titleTd.closest('tr').hide(); } }); $('.universal-table-index .theadsearch tr th').each(function (index) { const $th = $(this); const title = $th.find('.universal-th-text').text().trim(); // 找到 Hashtags 欄 if (title === 'Hashtags') { let allEmpty = true; // 走訪 tbody 的每一列檢查對應欄位是否都為空 $('.universal-table-index tbody tr').each(function () { const $td = $(this).find('td').eq(index); if ($td.text().trim() !== '') { allEmpty = false; return false; // 提前跳出 each } }); if (allEmpty) { // 隱藏 thead 裡對應的 th $th.hide(); // 隱藏 tbody 所有對應的 td 欄位 $('.universal-table-index tbody tr').each(function () { $(this).find('td').eq(index).hide(); }); } } }); }); $(window).load(function(){ $("iframe[src*='google']").attr('title','googleOauth'); }); //tabtitle位置 $(document).ready(function() { $('.w-annc .w-annc__widget-title').each(function() { var $title = $(this); var $tabs = $title.find('.nav-tabs, .tab_nav, .nav_tabs_filter'); if ($tabs.length) { $tabs.insertAfter($title); } }); }); //會員信箱a $(document).ready(function() { $('.member-data-value-6 a[href^="mailto:"]').each(function() { var $link = $(this); var html = $link.html(); // 檢查是否有信箱且有
    if (html.indexOf('@') !== -1 && html.indexOf('
    ') !== -1) { // 分割內容 var parts = html.split(//i); var email = parts[0].trim(); var rest = parts.slice(1).join('
    ').trim(); // 更新連結 $link.html(email) .attr('href', 'mailto:' + email) .attr('title', email + '(在本視窗開啟)') .attr('aria-label', email); // 插入其餘內容 if (rest) { $link.after('
    ' + rest); } } }); }); //網站導覽 $(document).ready(function() { // 1. 定位到網站導覽的連結 (使用 href 屬性定位最精確) var $sitemapLink = $('.header-nav a[href*="/sitemap"]'); // 2. 遍歷該連結之後的所有節點 $sitemapLink.each(function() { // 取得該
    標籤後方的下一個節點 (可以是文字或標籤) var nextNode = this.nextSibling; // 3. 檢查下一個節點是否為文字節點 (nodeType === 3) // 並且內容包含 "|" if (nextNode && nextNode.nodeType === 3) { // 使用正則表達式將 | 替換為空字串 nextNode.nodeValue = nextNode.nodeValue.replace('|', ''); } }); }); //影片模組縮圖 $(document).ready(function() { function fixVideoPosterAlt() { // 使用 setTimeout 確保動態產生的影片封面已出現在 DOM 中 setTimeout(function() { var $poster = $('#jp_poster_0'); // 1. 檢查圖片是否存在 if ($poster.length > 0) { var currentAlt = $poster.attr('alt'); // 2. 如果沒有 alt 屬性,或 alt 為空 if (!currentAlt || $.trim(currentAlt) === "") { // 3. 抓取 .video_detail 底下的 h3 文字內容 var $videoTitleElement = $('.video_detail h3').first(); if ($videoTitleElement.length > 0) { var videoTitle = $.trim($videoTitleElement.text()); // 4. 設定給圖片的 alt 屬性 if (videoTitle !== "") { $poster.attr('alt', videoTitle); } else { // 若標題也是空的,給予預設值 $poster.attr('alt', '影片封面圖片'); } } } } }, 500); // 延遲 500 毫秒執行 } // 執行修復功能 fixVideoPosterAlt(); }); //網站導覽換icon $(document).ready(function() { $('a[href="/zh_tw/sitemap"]').html(''); $('a[href="/en/sitemap"]').html('') // // 找到 Sitemap 連結 // var $sitemapLink = $('a[href="/zh_tw/sitemap"]'); // // 找到目標容器 // var $target = $('.searchclass'); // // 移動到容器內的最前面 // if ($sitemapLink.length && $target.length) { // $sitemapLink.prependTo($target); // } // var $sitemapLink = $('a[href="/en/sitemap"]'); // var $target = $('.searchclass'); // if ($sitemapLink.length && $target.length) { // $sitemapLink.prependTo($target); // } }); //cycle2無障礙 $(document).ready(function() { // 針對頁面上所有的 Cycle2 輪播 var $allSlideshows = $('.cycle-slideshow'); function refreshCycleA11y($el) { // 1. 取得該輪播內所有的投影片 (根據你的 HTML,類別為 .cycle-slide1) var $allSlides = $el.find('.cycle-slide1'); $allSlides.each(function() { var $slide = $(this); // 2. 判斷是否為「正在顯示」的活動投影片 // Cycle2 會自動給視覺上可見的投影片加上 .cycle-slide-active if ($slide.hasClass('cycle-slide-active')) { // 活動中的投影片:輔具可讀、鍵盤可聚焦 $slide.attr('aria-hidden', 'false') .find('a, button, input').attr('tabindex', '0'); } else { // 隱藏或複製的投影片:輔具忽略、鍵盤跳過 $slide.attr('aria-hidden', 'true') .find('a, button, input').attr('tabindex', '-1'); } }); // 3. 取得該 Widget 內的控制按鈕 var $widget = $el.closest('.widget-link'); var $nextBtn = $widget.find('.next-button'); var $prevBtn = $widget.find('.prev-button'); // --- 正向遊走邏輯 --- // 當在「下一張」按鈕按 Tab 時,強制跳到「當前活動第一則」連結 $nextBtn.off('keydown.a11y').on('keydown.a11y', function(e) { if (e.keyCode === 9 && !e.shiftKey) { var $activeLink = $el.find('.cycle-slide-active a').first(); if ($activeLink.length) { e.preventDefault(); $activeLink.focus(); } } }); // --- 反向遊走邏輯 (依照您的需求修改) --- // 當在「活動投影片」的第一個連結按 Shift + Tab 時,強制跳回「下一張」按鈕 $el.find('.cycle-slide-active a').first().off('keydown.a11y').on('keydown.a11y', function(e) { if (e.keyCode === 9 && e.shiftKey) { if ($nextBtn.length) { e.preventDefault(); $nextBtn.focus(); } } }); } // 4. 監聽 Cycle2 生命週期事件 // cycle-initialized: 初始化完成時執行 // cycle-after: 每次輪播切換動畫完成後重新計算 tabindex $allSlideshows.on('cycle-initialized cycle-after', function() { refreshCycleA11y($(this)); }); // 5. 安全機制:如果頁面載入過快導致錯過事件,手動觸發一次 $allSlideshows.each(function() { var $this = $(this); // 延遲一下確保 Cycle2 已完成 DOM 複製 setTimeout(function() { refreshCycleA11y($this); }, 300); }); }); // 執行 member等高計算,目前改用flexbox故mark掉 by ika 20160105 // $(window).load(function() { // if ($('.index-member-3').length && $(window).width() > 992) { // ORBITFRONT.member.equalHeight('.i-member-item-inner'); // } // }); }(jQuery, window));