me / src /runtime /menav /index.js
cheymin's picture
Upload 136 files
e1ae2c6 verified
const { menavDetectVersion } = require('../shared');
const createMenavEvents = require('./events');
const getConfig = require('./getConfig');
const updateElement = require('./updateElement');
const addElement = require('./addElement');
const removeElement = require('./removeElement');
const getAllElements = require('./getAllElements');
function getDefaultElementId(element) {
const type = element.getAttribute('data-type');
if (type === 'nav-item') {
return element.getAttribute('data-id');
} else if (type === 'social-link') {
return element.getAttribute('data-url');
} else {
// 优先使用 data-id(例如分类 slug),回退 data-name(兼容旧扩展/旧页面)
return element.getAttribute('data-id') || element.getAttribute('data-name');
}
}
function findDefaultElement(type, id) {
let selector;
if (type === 'nav-item') {
selector = `[data-type="${type}"][data-id="${id}"]`;
} else if (type === 'social-link') {
selector = `[data-type="${type}"][data-url="${id}"]`;
} else if (type === 'site') {
// 站点:优先用 data-url(更稳定),回退 data-id/data-name
return (
document.querySelector(`[data-type="${type}"][data-url="${id}"]`) ||
document.querySelector(`[data-type="${type}"][data-id="${id}"]`) ||
document.querySelector(`[data-type="${type}"][data-name="${id}"]`)
);
} else {
// 其他:优先 data-id(例如分类 slug),回退 data-name(兼容旧扩展/旧页面)
return (
document.querySelector(`[data-type="${type}"][data-id="${id}"]`) ||
document.querySelector(`[data-type="${type}"][data-name="${id}"]`)
);
}
return document.querySelector(selector);
}
// 全局 MeNav 对象 - 用于浏览器扩展
const existing = window.MeNav && typeof window.MeNav === 'object' ? window.MeNav : {};
const events =
existing.events && typeof existing.events === 'object' ? existing.events : createMenavEvents();
window.MeNav = Object.assign(existing, {
version: menavDetectVersion(),
getConfig: getConfig,
// 获取元素的唯一标识符
_getElementId: getDefaultElementId,
// 根据类型和ID查找元素
_findElement: findDefaultElement,
// 元素操作
updateElement: updateElement,
addElement: addElement,
removeElement: removeElement,
getAllElements: getAllElements,
// 事件系统
events: events,
});
module.exports = window.MeNav;