{"id":204,"date":"2023-06-21T08:23:29","date_gmt":"2023-06-21T00:23:29","guid":{"rendered":"https:\/\/mrc.som.nycu.edu.tw\/?page_id=204"},"modified":"2026-03-07T00:17:37","modified_gmt":"2026-03-06T16:17:37","slug":"%e6%a0%b8%e5%bf%83%e8%a8%ad%e6%96%bd","status":"publish","type":"page","link":"https:\/\/mrc.som.nycu.edu.tw\/eng\/%e6%a0%b8%e5%bf%83%e8%a8%ad%e6%96%bd\/","title":{"rendered":"CORE FACILITIES"},"content":{"rendered":"\n<p class=\"has-medium-font-size\">\u672c\u6838\u5fc3\u6574\u5408\u591a\u4f4d\u6559\u5e2b\u7684\u5c08\u9577\uff0c\u900f\u904e\u4ee5\u5ba2\u6236\u70ba\u4e2d\u5fc3(client-centric)\u7684\u65b9\u5f0f\uff0c\u4e32\u806f\u5b78\u7814\u3001\u91ab\u9662\u3001\u5ee0\u5546\uff0c\u4e26\u5efa\u7acb\u5925\u4f34\u95dc\u4fc2\u4e92\u76f8\u8f49\u4ecb\u670d\u52d9\uff0c\u63d0\u4f9b\u81e8\u5e8a\u7814\u7a76\u9818\u57df\u5230\u52d5\u7269\u7d30\u80de\u6a21\u5f0f\u5b8c\u6574\u83cc\u76f8\u5206\u6790\u670d\u52d9\u3002<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>\u670d\u52d9\u5167\u5bb9\uff1a<\/strong><\/p>\n\n\n\n<ul id=\"menu-main-menu\" class=\"wp-block-list\">\n<li class=\"has-medium-font-size\"><a href=\"https:\/\/mcfc.som.nycu.edu.tw\/?p=101\" target=\"_blank\" rel=\"noreferrer noopener\">\u5fae\u83cc\u57f9\u990a\u9ad4\u5b78\u4e2d\u5fc3<\/a><\/li>\n\n\n\n<li class=\"has-medium-font-size\"><a href=\"https:\/\/mcfc.som.nycu.edu.tw\/?p=109\" target=\"_blank\" rel=\"noreferrer noopener\">\u4ee3\u8b1d\u9ad4\u4e2d\u5fc3<\/a><\/li>\n\n\n\n<li class=\"has-medium-font-size\"><a href=\"https:\/\/mcfc.som.nycu.edu.tw\/?p=114\" target=\"_blank\" rel=\"noreferrer noopener\">\u52d5\u7269\u6a21\u5f0f\u4e2d\u5fc3<\/a><\/li>\n\n\n\n<li class=\"has-medium-font-size\"><a href=\"https:\/\/mcfc.som.nycu.edu.tw\/?p=118\" target=\"_blank\" rel=\"noreferrer noopener\">\u5fae\u83cc\u53e2\u690d\u5165\u88fd\u5099\u4e2d\u5fc3<\/a><\/li>\n<\/ul>\n\n\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function () {\n  \/* =========================\n     1. \u53d6\u5f97\u4e3b\u8981\u5340\u584a\n  ========================= *\/\n  const header = document.querySelector('#header, header.ct-header, header');\n  const logoLink = document.querySelector(\n    '.site-logo-container, .custom-logo-link, .site-branding a[rel=\"home\"]'\n  );\n  const main = document.querySelector('#main, main.site-main, main');\n  const footer = document.querySelector('#footer, footer.ct-footer, footer');\n\n  const searchTrigger = document.querySelector(\n    '.ct-header-search[data-toggle-panel=\"#search-modal\"], button[aria-controls=\"search-modal\"]'\n  );\n  const searchModal = document.querySelector('#search-modal');\n  const searchInput = document.querySelector(\n    '#search-modal input[type=\"search\"], #search-modal .modal-field, form[role=\"search\"] input[type=\"search\"]'\n  );\n\n  const mainNav = document.querySelector('#header-menu-1, nav[aria-label=\"main menu\"]');\n\n  \/* =========================\n     2. \u8f14\u52a9\u51fd\u5f0f\n  ========================= *\/\n  function focusElement(el) {\n    if (!el) return;\n\n    try {\n      el.focus({ preventScroll: false });\n    } catch (e) {\n      el.focus();\n    }\n\n    if (typeof el.scrollIntoView === 'function') {\n      el.scrollIntoView({\n        block: 'start',\n        behavior: 'smooth'\n      });\n    }\n  }\n\n  function makeSectionFocusable(el, key, label) {\n    if (!el) return;\n\n    el.setAttribute('accesskey', key);\n\n    \/\/ \u975e\u539f\u751f\u53ef\u805a\u7126\u5143\u7d20\u624d\u88dc tabindex\n    if (!\/^(A|BUTTON|INPUT|SELECT|TEXTAREA)$\/.test(el.tagName)) {\n      if (!el.hasAttribute('tabindex')) {\n        el.setAttribute('tabindex', '-1');\n      }\n    }\n\n    if (label && !el.getAttribute('aria-label')) {\n      el.setAttribute('aria-label', label);\n    }\n  }\n\n  \/* =========================\n     3. \u8a2d\u5b9a\u4e3b\u5340\u584a Accesskey\n  ========================= *\/\n  \/\/ Alt+U\uff1a\u4e0a\u65b9\u529f\u80fd\u5340\u584a\uff0c\u512a\u5148\u653e\u5728 Logo\n  if (logoLink) {\n    makeSectionFocusable(logoLink, 'U', '\u56de\u9996\u9801\u8207\u4e0a\u65b9\u529f\u80fd\u5340\u584a');\n  } else {\n    makeSectionFocusable(header, 'U', '\u4e0a\u65b9\u529f\u80fd\u5340\u584a');\n  }\n\n  \/\/ Alt+S\uff1a\u641c\u5c0b\u5340\u584a\uff0c\u653e\u5728\u641c\u5c0b\u6309\u9215\n  if (searchTrigger) {\n    makeSectionFocusable(searchTrigger, 'S', '\u7db2\u7ad9\u641c\u5c0b\u5340\u584a');\n  }\n\n  \/\/ Alt+C\uff1a\u4e2d\u592e\u5167\u5bb9\n  if (main) {\n    makeSectionFocusable(main, 'C', '\u4e2d\u592e\u5167\u5bb9\u5340\u584a');\n  }\n\n  \/\/ Alt+H\uff1a\u9801\u5c3e\n  if (footer) {\n    makeSectionFocusable(footer, 'H', '\u4e0b\u65b9\u529f\u80fd\u5340\u584a');\n  }\n\n  \/\/ \u4e3b\u9078\u55ae aria-label \u6539\u4e2d\u6587\n  if (mainNav) {\n    mainNav.setAttribute('aria-label', '\u4e3b\u9078\u55ae');\n  }\n\n  \/* =========================\n     4. Alt+S \u4e0d\u8df3\u6389\n     - \u4e0d\u81ea\u52d5 click \u641c\u5c0b\u6309\u9215\n     - \u53ea\u805a\u7126\u641c\u5c0b\u6309\u9215\u6216\u5df2\u958b\u555f\u641c\u5c0b\u6b04\n  ========================= *\/\n  function openSearchAndFocus() {\n    \/\/ \u5982\u679c\u641c\u5c0b\u8996\u7a97\u5df2\u7d93\u958b\u555f\uff0c\u5c31\u76f4\u63a5\u805a\u7126\u641c\u5c0b\u6b04\n    if (searchInput && searchModal && !searchModal.hasAttribute('inert')) {\n      focusElement(searchInput);\n      return;\n    }\n\n    \/\/ \u4e0d\u4e3b\u52d5 click\uff0c\u53ea\u805a\u7126\u641c\u5c0b\u6309\u9215\n    if (searchTrigger) {\n      focusElement(searchTrigger);\n      return;\n    }\n\n    \/\/ \u82e5\u9801\u9762\u672c\u4f86\u5c31\u6709\u641c\u5c0b\u6b04\n    if (searchInput) {\n      focusElement(searchInput);\n      return;\n    }\n\n    \/\/ \u6700\u5f8c\u624d\u805a\u7126\u641c\u5c0b\u5c0d\u8a71\u6846\u5bb9\u5668\n    if (searchModal) {\n      focusElement(searchModal);\n    }\n  }\n\n  \/* =========================\n     5. \u5feb\u901f\u9375\u5099\u63f4\u8655\u7406\n     Chrome \/ Edge\uff1aAlt + U\/S\/C\/H\n     Firefox\uff1aShift + Alt + U\/S\/C\/H\n  ========================= *\/\n  document.addEventListener('keydown', function (e) {\n    const key = (e.key || '').toLowerCase();\n    const isFirefox = \/firefox\/i.test(navigator.userAgent);\n\n    const matched = isFirefox\n      ? (e.altKey && e.shiftKey && !e.ctrlKey && !e.metaKey)\n      : (e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey);\n\n    if (!matched) return;\n    if (!['u', 's', 'c', 'h'].includes(key)) return;\n\n    e.preventDefault();\n\n    switch (key) {\n      case 'u':\n        focusElement(logoLink || header);\n        break;\n\n      case 's':\n        openSearchAndFocus();\n        break;\n\n      case 'c':\n        focusElement(main);\n        break;\n\n      case 'h':\n        focusElement(footer);\n        break;\n    }\n  });\n\n  \/* =========================\n     6. \u4fee\u6b63\u684c\u6a5f\u4e3b\u9078\u55ae v \u6309\u9215 aria-label\n  ========================= *\/\n  function getDirectMenuText(menuItem) {\n    const link = menuItem.querySelector(':scope > a.ct-menu-link, :scope > a');\n    if (!link) return '\u5b50\u9078\u55ae';\n\n    let text = '';\n\n    \/\/ \u53ea\u6293\u6587\u5b57\u7bc0\u9ede\uff0c\u907f\u514d\u628a\u7bad\u982d icon \u4e00\u8d77\u7b97\u9032\u53bb\n    link.childNodes.forEach(function (node) {\n      if (node.nodeType === Node.TEXT_NODE) {\n        text += node.textContent;\n      }\n    });\n\n    text = text.replace(\/\\s+\/g, ' ').trim();\n\n    if (!text) {\n      text = link.textContent.replace(\/\\s+\/g, ' ').trim();\n    }\n\n    return text || '\u5b50\u9078\u55ae';\n  }\n\n  function updateDesktopMenuToggleLabel(menuItem) {\n    const button = menuItem.querySelector(':scope > button.ct-toggle-dropdown-desktop-ghost');\n    if (!button) return;\n\n    const menuText = getDirectMenuText(menuItem);\n    const expanded = button.getAttribute('aria-expanded') === 'true';\n\n    button.setAttribute('type', 'button');\n    button.setAttribute('aria-haspopup', 'true');\n    button.setAttribute(\n      'aria-label',\n      expanded\n        ? menuText + '\u5b50\u9078\u55ae\uff0c\u5df2\u5c55\u958b'\n        : menuText + '\u5b50\u9078\u55ae\uff0c\u5df2\u6536\u5408'\n    );\n  }\n\n  const desktopMenuItems = document.querySelectorAll(\n    '#menu-main-menu > li.menu-item-has-children'\n  );\n\n  desktopMenuItems.forEach(function (menuItem) {\n    const button = menuItem.querySelector(':scope > button.ct-toggle-dropdown-desktop-ghost');\n    if (!button) return;\n\n    updateDesktopMenuToggleLabel(menuItem);\n\n    button.addEventListener('click', function () {\n      setTimeout(function () {\n        updateDesktopMenuToggleLabel(menuItem);\n      }, 80);\n    });\n\n    button.addEventListener('keydown', function () {\n      setTimeout(function () {\n        updateDesktopMenuToggleLabel(menuItem);\n      }, 80);\n    });\n  });\n\n  const desktopMenuRoot = document.querySelector('#menu-main-menu');\n  if (desktopMenuRoot) {\n    const observer = new MutationObserver(function () {\n      desktopMenuItems.forEach(updateDesktopMenuToggleLabel);\n    });\n\n    observer.observe(desktopMenuRoot, {\n      subtree: true,\n      attributes: true,\n      attributeFilter: ['aria-expanded', 'class']\n    });\n  }\n\n  \/* =========================\n     7. \u53ef\u9078\uff1a\u624b\u6a5f\u9078\u55ae\u6309\u9215\u6587\u5b57\u66f4\u6e05\u695a\n  ========================= *\/\n  const mobileMenuTrigger = document.querySelector(\n    '.ct-header-trigger[aria-controls=\"offcanvas\"]'\n  );\n  if (mobileMenuTrigger) {\n    mobileMenuTrigger.setAttribute('aria-label', '\u958b\u555f\u4e3b\u9078\u55ae');\n  }\n\n  const mobileCloseBtn = document.querySelector('#offcanvas .ct-toggle-close');\n  if (mobileCloseBtn) {\n    mobileCloseBtn.setAttribute('aria-label', '\u95dc\u9589\u5074\u9078\u55ae');\n  }\n\n  const searchCloseBtn = document.querySelector('#search-modal .ct-toggle-close');\n  if (searchCloseBtn) {\n    searchCloseBtn.setAttribute('aria-label', '\u95dc\u9589\u641c\u5c0b\u4e92\u52d5\u8996\u7a97');\n  }\n});\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6838\u5fc3\u6574\u5408\u591a\u4f4d\u6559\u5e2b\u7684\u5c08\u9577\uff0c\u900f\u904e\u4ee5\u5ba2\u6236\u70ba\u4e2d\u5fc3(client-centric)\u7684\u65b9\u5f0f\uff0c\u4e32\u806f\u5b78\u7814\u3001\u91ab\u9662\u3001\u5ee0\u5546\uff0c\u4e26\u5efa\u7acb [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-204","page","type-page","status-publish","hentry"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/mrc.som.nycu.edu.tw\/eng\/wp-json\/wp\/v2\/pages\/204","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mrc.som.nycu.edu.tw\/eng\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mrc.som.nycu.edu.tw\/eng\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mrc.som.nycu.edu.tw\/eng\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mrc.som.nycu.edu.tw\/eng\/wp-json\/wp\/v2\/comments?post=204"}],"version-history":[{"count":4,"href":"https:\/\/mrc.som.nycu.edu.tw\/eng\/wp-json\/wp\/v2\/pages\/204\/revisions"}],"predecessor-version":[{"id":1025,"href":"https:\/\/mrc.som.nycu.edu.tw\/eng\/wp-json\/wp\/v2\/pages\/204\/revisions\/1025"}],"wp:attachment":[{"href":"https:\/\/mrc.som.nycu.edu.tw\/eng\/wp-json\/wp\/v2\/media?parent=204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}