orbit_demo_new_old_bo5/assets/javascripts/app.js

2119 lines
76 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;(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 = $('<span class="menu-drop"><i class="dropdown-toggle-icon level-1 fa fa-chevron-down"></i></span>');
var $caret2 = $('<span class="menu-drop"><i class="dropdown-toggle-icon level-2 fa fa-chevron-down"></i></span>');
// 如果有第二層選單新增對應的類別到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(`<span class="sr-only">${label}</span>`);
}
});
});
//播放驗證碼語音
$(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(`<legend>${headingText}</legend>`);
}
});
// 處理「上一頁」按鈕
$(".cmdBackward").each(function () {
$(this)
.attr("title", "上一頁")
.attr("aria-label", "上一頁");
if ($(this).find(".sr-only").length === 0) {
$(this).append('<span class="sr-only">上一頁</span>');
}
$(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('<span class="sr-only">下一頁</span>');
}
$(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('<span style="display: none;">下一張</span>');
$("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. 嘗試從父層 (如 <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);
// 確保 <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>');
}
});
$(".sitemenu-title").each(function () {
if ($(this).text().trim() === "") {
$(this).append('<span class="sr-only">次選單</span>');
}
});
$(".annc-title").each(function () {
if ($(this).text().trim() === "") {
$(this).append('<span class="sr-only">內頁公告標題</span>');
}
});
$(".event-annc-title").each(function () {
if ($(this).text().trim() === "") {
$(this).append('<span class="sr-only">內頁活動公告標題</span>');
}
});
$(".show-title").each(function () {
if ($(this).text().trim() === "") {
$(this).append('<span class="sr-only">內頁活動公告標題</span>');
}
});
$(".w-annc__widget-title").each(function () {
if ($(this).text().trim() === "") {
$(this).append('<span class="sr-only">公告標題</span>');
}
});
$(".widget-title").each(function () {
if ($(this).text().trim() === "") {
$(this).append('<span class="sr-only">網路資源標題</span>');
}
});
$(".widget-title").each(function () {
if ($(this).text().trim() === "") {
$(this).append('<span class="sr-only">網路資源標題</span>');
}
});
$('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 不可有 altalt 應在 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('<span class="sr-only">' + titleText + '</span>');
}
});
// 刪除空的檔案室
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: [
'<div class="scrtabs-tab-scroll-arrow custom-scroll-arrow"><i class="fa fa-caret-left" aria-hidden="true"></i>',
'</div>'
].join(''),
rightArrowContent: [
'<div class="scrtabs-tab-scroll-arrow custom-scroll-arrow"><i class="fa fa-caret-right" aria-hidden="true"></i>',
'</div>'
].join('')
});
}
$(document).ready(function () {
// 處理所有 .fnav-item 裡的 <a>
$(".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(`<span class="sr-only">${label}</span>`);
// 確保 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(); // 取得 <span> 裡的文字,去掉前後空格
var number = text.replace(/\D/g, ""); // 只保留數字部分
if (number) {
$(this).text(`・觀看次數:${number}`); // 更新內容格式
}
});
$(".movie_desc").before('<div class="movietitle"><h4>影片內容</h4></div>');
$(".movie_desc").each(function () {
var decodedHtml = $("<div/>").html($(this).text()).html(); // 轉換轉義的 HTML
$(this).html(decodedHtml); // 設置為真正的 HTML
});
$(".video_group_time").each(function () {
var $this = $(this);
// 找到對應的 <q>,並移動到 .video_group_time 內部
var $q = $this.closest(".imglst_desc").find(".movie_desc q");
if ($q.length) {
$this.append($q.clone()); // 將 <q> 複製並添加到 .video_group_time
$q.remove(); // 移除 .movie_desc 裡的 <q>
}
// 移動 .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) + "日";
});
// 找到對應的 <q>,並複製
var $q = $this.closest(".video_data").find(".video_desc q").clone();
// 更新內容並加上 <q>
$this.html(formattedText).append($q);
});
});
//rucaptcha-image
$(document).ready(function () {
$('.rucaptcha-image').removeAttr('onload');
// 檢查是否已插入過
if (!$('#captcha_audio').length) {
const audioButton = $(`
<button
title="播放驗證碼語音"
type="button"
onclick="document.getElementById('captcha_audio').play();"
class="fas fa-volume-up"
aria-label="播放驗證碼語音"
role="button"
style="font-size: 1.5em; color: #333; cursor: pointer; border: 2px solid #333; padding: 0.2em;">
<span class="sr-only">播放驗證碼語音</span>
</button>
`);
const audio = $('<audio id="captcha_audio" src="/rucaptcha/?format=wav&amp;locale=zh_tw"></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(); // 取得前一個元素
// 如果前一個元素是 <a> 且 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('<i class="fa-solid fa-circle-user"></i>');
//內頁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 $("<h1>", {
// 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);
// 如果 <li> 中没有 <a> 元素,则为 <li> 设置 tabindex="0"
if ($li.children('a').length === 0) {
$li.attr('tabindex', '0');
} else {
// 如果 <li> 中有 <a> 元素,则确保 <a> 有 tabindex="0"
$li.find('a').attr('tabindex', '0');
// 确保 <li> 不影响焦点管理,移除 <li> 的 tabindex
$li.removeAttr('tabindex');
// 如果 <li> 被聚焦,自动跳转到 <a> 元素
$li.on('focus', function() {
$(this).find('a').focus();
});
}
});
$('label[for="open-orbit-nav"]').attr('tabindex', '0');
// 当屏幕宽度小于 768px 时,将 .orbit-bar-search-sign-language 移动到 <label for="open-orbit-nav"> 后面
function moveSearchSignLanguage() {
if ($(window).width() < 767) {
$('.orbit-bar-search-sign-language').insertAfter('label[for="open-orbit-nav"]');
} else {
// 屏幕宽度大于等于 768px 时,恢复原位置
$('.orbit-bar-search-sign-language').appendTo('.orbit-bar-inner');
}
}
moveSearchSignLanguage();
$(window).resize(function() {
moveSearchSignLanguage();
});
// 当 <label for="open-orbit-nav"> 被选中时,显示 .orbit-bar-search-sign-language
$('label[for="open-orbit-nav"]').on('focus', function() {
$('.orbit-bar-search-sign-language').addClass('show');
})
$('#languagebutton').on('focus', function() {
$('#language-li ul').addClass('show');
});
// 监听 #language 元素被 Tab 键选中时
$('#language-li-ul li').on('focus', function() {
// 给 #language 内部的 ul 元素添加 show 类
$(this).find('ul').addClass('show');
});
$('#language-li-ul li ul > li:last-child>a').on('blur', function() {
$('#language-li-ul li ul').removeClass('show');
});
$('.orbit-bar-title a').on('focus', function() {
$('#language-li-ul li ul').removeClass('show');
});
$('#language-li').on('focus', function() {
// 给 #language 内部的 ul 元素添加 show 类
$(this).find('ul').addClass('show');
});
$('#language-li ul > li:last-child>a').on('blur', function() {
$('#language-li ul').removeClass('show');
$('.orbit-bar-search-sign-language').removeClass('show');
});
$('label[for="open-orbit-login"]').on('blur', function() {
$('.orbit-bar-search-sign-language').removeClass('show');
});
$('#gotocenter').on('focus', function() {
// 当 #gotocenter 被选中时,移除 .orbit-bar-search-sign-language 上的 show 类
$('.orbit-bar-search-sign-language').removeClass('show');
});
$('label[for="open-orbit-nav"]').on('click', function() {
// 切換 .orbit-bar-search-sign-language 的 .show 類別
$('.orbit-bar-search-sign-language').removeClass('show');
});
$('li[tabindex="0"]').each(function () {
const $li = $(this);
if ($li.find('input').length > 0) {
$li.removeAttr('tabindex');
}
});
});
//萬用表格查詢按鈕翻中英
$(document).ready(function () {
const lang = $('html').attr('lang');
if (lang === 'en') {
$('.searchbtn2').each(function () {
$(this).attr('title', 'Search'); // 修改 tooltip
$(this).html('<i class="fa-solid fa-magnifying-glass"></i> Search'); // 修改按鈕文字
});
} else if (lang === 'zh_tw') {
$('.searchbtn2').each(function () {
$(this).attr('title', '查詢');
$(this).html('<i class="fa-solid fa-magnifying-glass"></i>查詢');
});
}
});
//member轉換a
$(document).ready(function () {
$('.member-data-value-5 a').each(function () {
$(this).replaceWith($(this).contents()); // 把<a>替換成它裡面的內容
});
$('.member-data-value-3 a').each(function () {
$(this).replaceWith($(this).contents()); // 把<a>替換成它裡面的內容
});
$('.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(' <i class="kenmenu-drop fa-solid fa-chevron-down"></i>');
}
}
});
}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
}
});
//如果 <a> 裡面有 <span> 且 display: none就移除整個 <a>
$(document).ready(function() {
// 核心清理函數
function removeHiddenLinks() {
$('.s-annc__post-wrap a').each(function() {
var $a = $(this);
// 如果 <a> 裡面有 <span> 且 display: none就移除整個 <a>
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();
// 檢查是否有信箱且有 <br>
if (html.indexOf('@') !== -1 && html.indexOf('<br>') !== -1) {
// 分割內容
var parts = html.split(/<br\s*\/?>/i);
var email = parts[0].trim();
var rest = parts.slice(1).join('<br>').trim();
// 更新連結
$link.html(email)
.attr('href', 'mailto:' + email)
.attr('title', email + '(在本視窗開啟)')
.attr('aria-label', email);
// 插入其餘內容
if (rest) {
$link.after('<br>' + rest);
}
}
});
});
//網站導覽
$(document).ready(function() {
// 1. 定位到網站導覽的連結 (使用 href 屬性定位最精確)
var $sitemapLink = $('.header-nav a[href*="/sitemap"]');
// 2. 遍歷該連結之後的所有節點
$sitemapLink.each(function() {
// 取得該 <a> 標籤後方的下一個節點 (可以是文字或標籤)
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('<i class="fa-solid fa-sitemap"></i>');
$('a[href="/en/sitemap"]').html('<i class="fa-solid fa-sitemap"></i>')
// // 找到 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));