This commit is contained in:
ken 2026-08-11 19:52:37 +08:00
parent b1221d694d
commit db1d6ddf3f
16 changed files with 241 additions and 37 deletions

View File

@ -2528,16 +2528,102 @@ $(document).ready(function() {
// 2. 語言按鈕與手機版選單補強 // 2. 語言按鈕與手機版選單補強
$(function() { $(function() {
function fixLanguageA11y() { function fixLanguageA11y() {
var isEn = document.documentElement.lang === 'en';
var correctTitle = isEn ? 'Open language menu' : '在本視窗開啟語言選單';
var $desktopBtn = $('#languagebutton'); var $desktopBtn = $('#languagebutton');
var $langLi = $('#language-li');
var $langUl = $('#language-li ul');
// =============================================
// ✅ 新增 GN1210101E繁體中文 li 補上可聚焦 <a>
// 桌面版 + 手機版都處理
// =============================================
var $activeLis = $langUl.find('li.active')
.add($('#language-li-ul').find('li.active'));
$activeLis.each(function() {
var $li = $(this);
if ($li.find('a, button').length === 0) {
var activeText = $li.text().trim();
$li.html(
'<a href="javascript:;" ' +
'aria-current="true" ' +
'title="' + (isEn ? 'Current language' : '目前語言') + '" ' +
'tabindex="0">' +
activeText +
'</a>'
);
}
});
// =============================================
// Desktop 語言按鈕
// =============================================
if ($desktopBtn.length > 0) { if ($desktopBtn.length > 0) {
$desktopBtn.attr({ 'aria-expanded': 'false', 'role': 'button', 'aria-haspopup': 'true' }); $desktopBtn.attr({
$desktopBtn.on('focus', function() { 'aria-expanded': 'false',
$(this).closest('#language-li').find('ul').addClass('show'); 'role': 'button',
$(this).attr('aria-expanded', 'true'); 'aria-haspopup': 'true',
'title': correctTitle
});
$desktopBtn.removeAttr('aria-label');
function openLangMenu() {
$langUl.addClass('show');
$desktopBtn.attr('aria-expanded', 'true');
$('.orbit-bar-search-sign-language').addClass('show'); $('.orbit-bar-search-sign-language').addClass('show');
}
function closeLangMenu() {
$langUl.removeClass('show');
$desktopBtn.attr('aria-expanded', 'false');
}
// 原有focus 展開
$desktopBtn.on('focus', function() {
openLangMenu();
});
// ✅ 新增 GN1210100EEnter / Space 切換、Escape 收合
$desktopBtn.on('keydown', function(e) {
if (e.which === 13 || e.which === 32) {
e.preventDefault();
$langUl.hasClass('show') ? closeLangMenu() : openLangMenu();
}
if (e.which === 27) {
closeLangMenu();
$desktopBtn.focus();
}
});
// 原有click 切換
$desktopBtn.on('click', function(e) {
e.preventDefault();
$langUl.hasClass('show') ? closeLangMenu() : openLangMenu();
});
// ✅ 新增:選單內 Escape 跳回按鈕
$langUl.find('a').on('keydown', function(e) {
if (e.which === 27) {
e.preventDefault();
closeLangMenu();
$desktopBtn.focus();
}
});
// 原有:焦點離開整個 language-li 時收合
$langLi.on('focusout', function() {
var $container = $(this);
setTimeout(function() {
if (!$container.is(':focus-within')) {
closeLangMenu();
}
}, 150);
}); });
} }
// =============================================
// 手機版選單補強(原有邏輯完整保留)
// =============================================
var $mobileBtn = $('.mobile-button'); var $mobileBtn = $('.mobile-button');
if ($mobileBtn.length > 0) { if ($mobileBtn.length > 0) {
$mobileBtn.attr({ 'role': 'button', 'tabindex': '0', 'aria-haspopup': 'true', 'aria-expanded': 'false' }); $mobileBtn.attr({ 'role': 'button', 'tabindex': '0', 'aria-haspopup': 'true', 'aria-expanded': 'false' });
@ -2564,17 +2650,20 @@ $(function() {
}); });
} }
// 強制鎖定 Title // =============================================
// 原有MutationObserver 強制鎖定 title
// =============================================
var target = document.getElementById('languagebutton'); var target = document.getElementById('languagebutton');
if (target) { if (target) {
var isEn = document.documentElement.lang === 'en';
var correctTitle = isEn ? 'Open language menu' : '在本視窗開啟語言選單';
var observer = new MutationObserver(function() { var observer = new MutationObserver(function() {
if (target.getAttribute('title') !== correctTitle) target.setAttribute('title', correctTitle); if (target.getAttribute('title') !== correctTitle) {
target.setAttribute('title', correctTitle);
}
}); });
observer.observe(target, { attributes: true }); observer.observe(target, { attributes: true, attributeFilter: ['title'] });
} }
} }
setTimeout(fixLanguageA11y, 600); setTimeout(fixLanguageA11y, 600);
}); });
// rwd左上選單無障礙 // rwd左上選單無障礙
@ -2904,6 +2993,128 @@ $(document).ready(function () {
}); });
//cycle2無障礙
$(document).ready(function() {
// 取得頁面上所有的 Cycle2 輪播圖
var $allSlideshows = $('.cycle-slideshow');
/**
* 核心無障礙狀態刷新函式
*/
function refreshCycleA11y($el) {
var $items = $el.find('.w-annc__item, .widget-link__item, [class*="cycle-slide"], .widget-pic');
$items.each(function() {
var $slide = $(this);
var isActive = $slide.hasClass('cycle-slide-active');
if (isActive) {
// ✅ li 只設 aria-hidden不加 tabindex
$slide.attr('aria-hidden', 'false');
$slide.removeAttr('tabindex'); // ← 確保 li 本身沒有 tabindex
$slide.find('a, button, input, [tabindex]').attr('tabindex', '0');
} else {
// 隱藏中的投影片:徹底隔離
$slide.attr('aria-hidden', 'true');
$slide.removeAttr('tabindex');
$slide.find('a, button, input, [tabindex]').attr('tabindex', '-1');
}
});
// --- 防鎖死邊界處理 (Shift + Tab) ---
var $container = $el.closest('.w-annc, .widget-link_wrapper, .widget-link');
var $prevBtn = $container.find('.btn-left, .prev-button');
$el.find('.cycle-slide-active a, .cycle-slide-active button').first()
.off('keydown.a11y').on('keydown.a11y', function(e) {
if (e.keyCode === 9 && e.shiftKey) {
if ($prevBtn.length) {
e.preventDefault();
$prevBtn.focus();
}
}
});
}
/**
* 針對 widget-link 非語意化標籤 ( i 標籤當按鈕) 的無障礙補強
*/
function refreshCycleA11y($el) {
var $items = $el.find('.w-annc__item, .widget-link__item, [class*="cycle-slide"]');
$items.each(function() {
var $slide = $(this);
var isActive = $slide.hasClass('cycle-slide-active');
if (isActive) {
// ✅ li 只設 aria-hidden不加 tabindex
$slide.attr('aria-hidden', 'false');
$slide.removeAttr('tabindex'); // ← 確保 li 本身沒有 tabindex
$slide.find('a, button, input, [tabindex]').attr('tabindex', '0');
} else {
// 隱藏中的投影片:徹底隔離
$slide.attr('aria-hidden', 'true');
$slide.removeAttr('tabindex');
$slide.find('a, button, input, [tabindex]').attr('tabindex', '-1');
}
});
// --- 防鎖死邊界處理 (Shift + Tab) ---
var $container = $el.closest('.w-annc, .widget-link_wrapper, .widget-link');
var $prevBtn = $container.find('.btn-left, .prev-button');
$el.find('.cycle-slide-active a, .cycle-slide-active button').first()
.off('keydown.a11y').on('keydown.a11y', function(e) {
if (e.keyCode === 9 && e.shiftKey) {
if ($prevBtn.length) {
e.preventDefault();
$prevBtn.focus();
}
}
});
}
// 輔助函式:切換後更新 A11y 狀態並鎖定焦點
function triggerPostUpdate($el, $activeBtn) {
$el.one('cycle-after', function() {
setTimeout(function() {
refreshCycleA11y($el);
$activeBtn.focus();
}, 300);
});
}
/**
* 舊有按鈕事件相容與整合
*/
$(document).on('keydown', '.btn-right, .btn-left', function(e) {
if (e.keyCode === 13) {
var $btn = $(this);
var $el = $btn.closest('.w-annc').find('.cycle-slideshow');
triggerPostUpdate($el, $btn);
}
});
/**
* 綁定 Cycle2 核心事件
*/
$allSlideshows.on('cycle-initialized cycle-after', function() {
var $this = $(this);
setTimeout(function() {
refreshCycleA11y($this);
}, 300);
});
// 初始化執行
patchWidgetLinkElements();
$allSlideshows.each(function() {
var $this = $(this);
setTimeout(function() {
refreshCycleA11y($this);
}, 500);
});
});
//post //post
$(document).ready(function () { $(document).ready(function () {
setTimeout(function () { setTimeout(function () {

View File

@ -25,11 +25,11 @@
} }
} }
} }
label[for="open-orbit-login"] { // label[for="open-orbit-login"] {
@media(max-width:768px){ // @media(max-width:768px){
display: none!important; // display: none!important;
} // }
} // }
[accesskey="U"],[accesskey="W"]{ [accesskey="U"],[accesskey="W"]{
@media(max-width:768px){ @media(max-width:768px){
color: #666!important; color: #666!important;

View File

@ -17,8 +17,7 @@
<dl class="i-archive__file-list" data-list="files" data-level="2"> <dl class="i-archive__file-list" data-list="files" data-level="2">
<dd class="i-archive__file-wrap"> <dd class="i-archive__file-wrap">
<i class="fa-solid fa-file"></i> <i class="fa-solid fa-file"></i>
<a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}</a> <a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}<span class="label label-primary">{{file-type}}</span></a>
<a href="{{file-url}}" class="i-archive-files-item" target="_blank" data-bs-toggle="tooltip" data-placement="bottom" title="{{file-name}}"><span class="label label-primary">{{file-type}}</span></a>
</dd> </dd>
</dl> </dl>
</div> </div>

View File

@ -26,8 +26,7 @@
</div> </div>
<div class="i-archive-files-list col-sm-12" data-list="files" data-level="2"> <div class="i-archive-files-list col-sm-12" data-list="files" data-level="2">
<dd> <dd>
<a href="{{file-url}}" class="i-archive-files-item" target="{{target}}" title="{{file-name}}">{{file-name}}</a> <a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}<span class="label label-primary">{{file-type}}</span></a>
<a href="{{file-url}}" class="i-archive-files-item" target="_blank" data-bs-toggle="tooltip" data-placement="bottom" title="{{file-name}}"><span class="label label-primary">{{file-type}}</span></a>
</dd> </dd>
</div> </div>
</div> </div>

View File

@ -17,8 +17,7 @@
<dl class="i-archive__file-list" data-list="files" data-level="2"> <dl class="i-archive__file-list" data-list="files" data-level="2">
<dd class="i-archive__file-wrap"> <dd class="i-archive__file-wrap">
<i class="fa-solid fa-file"></i> <i class="fa-solid fa-file"></i>
<a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}</a> <a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}<span class="label label-primary">{{file-type}}</span></a>
<a href="{{file-url}}" class="i-archive-files-item" target="_blank" data-bs-toggle="tooltip" data-placement="bottom" title="{{file-name}}"><span class="label label-primary">{{file-type}}</span></a>
</dd> </dd>
</dl> </dl>
</div> </div>

View File

@ -26,8 +26,7 @@
</div> </div>
<div class="i-archive-files-list col-sm-9" data-list="files" data-level="2"> <div class="i-archive-files-list col-sm-9" data-list="files" data-level="2">
<dd> <dd>
<a href="{{file-url}}" class="i-archive-files-item" target="{{target}}" title="{{file-name}}">{{file-name}}</a> <a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}<span class="label label-primary">{{file-type}}</span></a>
<a href="{{file-url}}" class="i-archive-files-item" target="_blank" data-bs-toggle="tooltip" data-placement="bottom" title="{{file-name}}"><span class="label label-primary">{{file-type}}</span></a>
</dd> </dd>
</div> </div>
</div> </div>

View File

@ -15,8 +15,7 @@
</dt> </dt>
<dl class="i-archive__file-list" data-list="files" data-level="2"> <dl class="i-archive__file-list" data-list="files" data-level="2">
<dd class="i-archive__file-wrap"> <dd class="i-archive__file-wrap">
<a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}</a> <a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}<span class="label label-primary">{{file-type}}</span></a>
<a href="{{file-url}}" class="i-archive-files-item" target="_blank" data-bs-toggle="tooltip" data-placement="bottom" title="{{file-name}}"><span class="label label-primary">{{file-type}}</span></a>
</dd> </dd>
</dl> </dl>
</div> </div>

View File

@ -23,8 +23,7 @@
</span> </span>
<span class="description" style="clear: both;widivh: 100%;position: relative;display: block;">{{description}}</span> <span class="description" style="clear: both;widivh: 100%;position: relative;display: block;">{{description}}</span>
<dd> <dd>
<a href="{{file-url}}" class="i-archive-files-item" target="{{target}}" title="{{file-name}}">{{file-name}}</a> <a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}<span class="label label-primary">{{file-type}}</span></a>
<a href="{{file-url}}" class="i-archive-files-item" target="_blank" data-bs-toggle="tooltip" data-placement="bottom" title="{{file-name}}"><span class="label label-primary">{{file-type}}</span></a>
</dd> </dd>
</div> </div>
</div> </div>

View File

@ -18,8 +18,7 @@
<dl class="i-archive__file-list" data-list="files" data-level="2"> <dl class="i-archive__file-list" data-list="files" data-level="2">
<dd class="i-archive__file-wrap"> <dd class="i-archive__file-wrap">
<i class="fa-solid fa-file"></i> <i class="fa-solid fa-file"></i>
<a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}</a> <a class="i-archive__file-name" href="{{file-url}}" target="{{target}}" title="{{file-name}}">{{file-name}}<span class="label label-primary">{{file-type}}</span></a>
<a href="{{file-url}}" class="i-archive-files-item" target="_blank" data-bs-toggle="tooltip" data-placement="bottom" title="{{file-name}}"><span class="label label-primary">{{file-type}}</span></a>
</dd> </dd>
</dl> </dl>
</div> </div>

View File

@ -9,7 +9,7 @@
<div class="view_info"> <div class="view_info">
<span>{{view_count}}</span> <span>{{view_count}}</span>
</div> </div>
<div class="Video__Player"><button class="Video__PlayerButton"></button></div> <div class="Video__Player"><div class="Video__PlayerButton"></div></div>
<div class="videoduration"></div> <div class="videoduration"></div>
</div> </div>
<a class="video_link" href="{{video_show_url}}" title="{{video_title_escape}}"> <a class="video_link" href="{{video_show_url}}" title="{{video_title_escape}}">

View File

@ -8,7 +8,7 @@
<div class="view_info"> <div class="view_info">
<span>{{view_count}}</span> <span>{{view_count}}</span>
</div> </div>
<div class="Video__Player"><button class="Video__PlayerButton"></button></div> <div class="Video__Player"><div class="Video__PlayerButton"></div></div>
<div class="videoduration"></div> <div class="videoduration"></div>
</div> </div>
<img class="video_snapshot" src="{{snapshot_url}}"/> <img class="video_snapshot" src="{{snapshot_url}}"/>

View File

@ -27,7 +27,7 @@
<div class="view_info"> <div class="view_info">
<span>{{view_count}}</span> <span>{{view_count}}</span>
</div> </div>
<div class="Video__Player"><button class="Video__PlayerButton"></button></div> <div class="Video__Player"><div class="Video__PlayerButton"></div></div>
<div class="videoduration"></div> <div class="videoduration"></div>
</div> </div>
<img class="video_snapshot" src="{{snapshot_url}}"/> <img class="video_snapshot" src="{{snapshot_url}}"/>

View File

@ -8,7 +8,7 @@
<div class="view_info"> <div class="view_info">
<span>{{view_count}}</span> <span>{{view_count}}</span>
</div> </div>
<div class="Video__Player"><button class="Video__PlayerButton"></button></div> <div class="Video__Player"><div class="Video__PlayerButton"></div></div>
<div class="videoduration"></div> <div class="videoduration"></div>
</div> </div>
<img class="video_snapshot" src="{{snapshot_url}}"/> <img class="video_snapshot" src="{{snapshot_url}}"/>

View File

@ -17,7 +17,7 @@
<div class="view_info"> <div class="view_info">
<span>{{view_count}}</span> <span>{{view_count}}</span>
</div> </div>
<div class="Video__Player"><button class="Video__PlayerButton"></button></div> <div class="Video__Player"><div class="Video__PlayerButton"></div></div>
<div class="videoduration"></div> <div class="videoduration"></div>
</div> </div>
<img class="video_snapshot" src="{{snapshot_url}}"/> <img class="video_snapshot" src="{{snapshot_url}}"/>

View File

@ -8,7 +8,7 @@
<div class="view_info"> <div class="view_info">
<span>{{view_count}}</span> <span>{{view_count}}</span>
</div> </div>
<div class="Video__Player"><button class="Video__PlayerButton"></button></div> <div class="Video__Player"><div class="Video__PlayerButton"></div></div>
<div class="videoduration"></div> <div class="videoduration"></div>
</div> </div>
<img class="video_snapshot" src="{{snapshot_url}}"/> <img class="video_snapshot" src="{{snapshot_url}}"/>

View File

@ -9,7 +9,7 @@
<div class="link-img-wrap{{display_image}}"> <div class="link-img-wrap{{display_image}}">
<img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}"> <img src="{{img_src}}" alt="{{img_description}}" title="{{img_description}}">
</div> </div>
<a class="widget-content-title" href="{{link_to_show}}" target="{{target}}" title="{{title_text}}">{{title}}</a> <a class="widget-content-title" href="{{link_to_show}}" target="{{target}}" title="{{title_text}}" onclick="{{onclick}}">{{title}}</a>
<span data-list="statuses" data-level="1"> <span data-list="statuses" data-level="1">
<span class="label status {{status-class}}">{{status}}</span> <span class="label status {{status-class}}">{{status}}</span>
</span> </span>