<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>解释器模式</title>
<script>
function getSiblingName(node) {
if (node.previousSibling) {
var name = '';
var count = 1;
var nodeName = node.nodeName;
var sibling = node.previousSibling;
while (sibling) {
if (sibling.nodeType === 1 && sibling.nodeType === node.nodeType && sibling.nodeName) {
if (nodeName === sibling.nodeName) {
count++;
name += count;
} else {
count = 1;
name += '|' + sibling.nodeName.toUpperCase();
}
}
sibling = sibling.previousSibling;
}
return name;
} else {
return '';
}
}
var Interpreter = (function() {
return function(node, wrap) {
var path = [];
wrap = wrap || document;
if (node === wrap) {
if (wrap.nodeType === 1) {
path.push(wrap.nodeName.toUpperCase());
}
return path;
} else if (node.parentNode !== wrap) {
path = arguments.callee(node.parentNode, wrap);
} else {
if (wrap.nodeType === 1) {
path.push(wrap.nodeName.toUpperCase());
}
}
var sublingsNames = getSiblingName(node);
if (node.nodeType === 1) {
path.push(node.nodeName.toUpperCase() + sublingsNames);
}
return path;
}
})();
window.onload = function() {
var path = Interpreter(document.getElementById('button'));
alert(path);
}
</script>
</head>
<body>
<div class="wrap">
<div class="link-inner">
<a href="#">link</a>
</div>
<div class="button-inner">
<button id="button">text</button>
</div>
</div>
</body>
</html>