JavaScript设计模式(二十四)【解释器模式】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>解释器模式</title>
    <script>
        /*
        * 解释器模式:对于一种语言,给出其文法形式,并定义一种解释器来解析句子
        * 当有一个语言需要解释执行,并且可以将该语言中的句子表示为一个抽象语法树的时候,
        * 可以考虑使用解释器模式。
        * 解释器模式速度较慢,适用于比较简单的语法格式
        *
        * */

        // demo使用书本的demo,根据一个元素和他的一个父元素,解析成XX>XX>XX的格式

        // 这个getSiblingName 只返回后缀部分,不包括自己本来的节点名字,节点元素名在后面的函数里拼如
        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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值