mirror of https://github.com/veypi/OneAuth.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
184 lines
4.5 KiB
JavaScript
184 lines
4.5 KiB
JavaScript
(function () {
|
|
const style = document.createElement('style');
|
|
|
|
// 定义 CSS 文本
|
|
const cssText = `
|
|
.selected {
|
|
outline: 2px solid #44f;
|
|
opacity: 1;
|
|
pointer-events: auto;
|
|
}
|
|
.panel {
|
|
position: fixed;
|
|
left: 0;
|
|
top: 0;
|
|
z-index: 9999;
|
|
width: 300px;
|
|
height: 100%;
|
|
background-color: #f4f4f4;
|
|
border-left: 1px solid #ccc;
|
|
padding: 10px;
|
|
box-shadow: -2px 0 5px rgba(0,0,0,0.1);
|
|
display: none;
|
|
resize: both;
|
|
overflow: auto;
|
|
}
|
|
.resizer {
|
|
position: absolute;
|
|
right: 0;
|
|
bottom: 0;
|
|
width: 10px;
|
|
height: 10px;
|
|
cursor: se-resize;
|
|
background-color: #aaa;
|
|
}
|
|
.domline {
|
|
width: 100%;
|
|
}
|
|
.domline:hover {
|
|
opacity: 0.7;
|
|
}
|
|
`;
|
|
|
|
style.innerHTML = cssText;
|
|
let selectedElement = null;
|
|
const panel = document.createElement('div');
|
|
panel.classList.add('panel');
|
|
|
|
|
|
const treeContainer = document.createElement('div');
|
|
treeContainer.style.marginBottom = '10px';
|
|
|
|
const htmlEditor = document.createElement('textarea');
|
|
htmlEditor.style.width = '100%';
|
|
htmlEditor.rows = '10';
|
|
htmlEditor.cols = '30';
|
|
htmlEditor.placeholder = 'Edit element innerHTML here...';
|
|
|
|
const header = document.createElement('div');
|
|
header.style.cursor = 'move';
|
|
header.style.backgroundColor = '#ddd';
|
|
header.style.padding = '5px';
|
|
header.textContent = 'DOM Inspector';
|
|
|
|
panel.appendChild(style);
|
|
panel.appendChild(header);
|
|
panel.appendChild(treeContainer);
|
|
panel.appendChild(htmlEditor);
|
|
|
|
document.body.appendChild(panel);
|
|
|
|
function createTree(node, parent, iter = 0) {
|
|
if (!node || node.nodeType !== Node.ELEMENT_NODE) return;
|
|
|
|
if (iter > 3) {
|
|
return;
|
|
}
|
|
const item = document.createElement('div');
|
|
item.style.cursor = 'pointer';
|
|
item.style.marginLeft = '10px';
|
|
|
|
const line = document.createElement('div');
|
|
line.textContent = node.tagName.toLowerCase();
|
|
line.classList.add('domline');
|
|
line.addEventListener('click', (e) => {
|
|
console.log(node)
|
|
e.preventDefault();
|
|
selectElement(node);
|
|
});
|
|
|
|
item.appendChild(line);
|
|
parent.appendChild(item);
|
|
|
|
Array.from(node.children).forEach(child => {
|
|
createTree(child, item, iter + 1);
|
|
});
|
|
}
|
|
|
|
function selectElement(element) {
|
|
if (selectedElement) {
|
|
selectedElement.classList.remove('selected')
|
|
// document.querySelectorAll('.blurred').forEach(el => el.classList.remove('blurred'));
|
|
}
|
|
selectedElement = element;
|
|
selectedElement.classList.add('selected')
|
|
|
|
updatePanel(selectedElement);
|
|
|
|
// let pele = element.parentElement
|
|
// while (pele && pele !== document.documentElement) {
|
|
// pele.classList.add('blurred');
|
|
// pele = pele.parentElement;
|
|
// }
|
|
}
|
|
|
|
function updatePanel(element) {
|
|
|
|
treeContainer.innerHTML = '';
|
|
if (element.parentElement) {
|
|
const parentItem = document.createElement('div');
|
|
parentItem.textContent = `parent (${element.parentElement.tagName.toLowerCase()})`;
|
|
parentItem.style.cursor = 'pointer';
|
|
parentItem.style.color = 'blue';
|
|
parentItem.style.fontWeight = 'bold';
|
|
|
|
parentItem.addEventListener('click', () => {
|
|
selectElement(element.parentElement);
|
|
});
|
|
|
|
treeContainer.appendChild(parentItem);
|
|
}
|
|
|
|
createTree(element, treeContainer);
|
|
|
|
htmlEditor.value = element.outerHTML || '';
|
|
|
|
htmlEditor.oninput = () => {
|
|
element.outerHTML = htmlEditor.value;
|
|
};
|
|
}
|
|
|
|
document.addEventListener('keydown', event => {
|
|
if (event.key === 'Control') {
|
|
document.addEventListener('mousedown', mouseDownHandler);
|
|
}
|
|
});
|
|
|
|
document.addEventListener('keyup', event => {
|
|
if (event.key === 'Control') {
|
|
document.removeEventListener('mousedown', mouseDownHandler);
|
|
}
|
|
});
|
|
|
|
function mouseDownHandler(event) {
|
|
if (event.button === 0 && event.ctrlKey) {
|
|
event.preventDefault();
|
|
selectElement(event.target);
|
|
panel.style.display = 'block';
|
|
}
|
|
}
|
|
|
|
// Add draggable functionality to the sidebar
|
|
let isDragging = false;
|
|
let dragOffsetX, dragOffsetY;
|
|
|
|
header.addEventListener('mousedown', (e) => {
|
|
isDragging = true;
|
|
dragOffsetX = e.clientX - panel.offsetLeft;
|
|
dragOffsetY = e.clientY - panel.offsetTop;
|
|
});
|
|
document.addEventListener('mousemove', (e) => {
|
|
if (isDragging) {
|
|
let top = e.clientY - dragOffsetY;
|
|
if (top < 0) top = 0;
|
|
let left = e.clientX - dragOffsetX;
|
|
if (left < 0) left = 0;
|
|
panel.style.left = `${left}px`;
|
|
panel.style.top = `${top}px`;
|
|
}
|
|
});
|
|
document.addEventListener('mouseup', () => {
|
|
isDragging = false;
|
|
});
|
|
})();
|