JavaScript设计模式(二十五):语言翻译-解释器模式

简介: 语言翻译-解释器模式

解释器模式(Interpreter)

对于一种语言,给出其文法表示形式,并定义一种解释器,通过使用这种解释器来解释语言中定义的句子。

需求:描述带有点击事件的DOM元素在页面中的位置

image.png

<!doctype html>
<html lang="zh-cn">

<head>
    <meta charset="UTF-8">
    <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>语言翻译-解释器模式</title>
</head>
<style>
    * {
    
    
        margin: 15px;
        border: 3px solid #333;
    }

    *:nth-child(2n) {
    
    
        border-color: red;
    }

    *:nth-child(2n + 1) {
    
    
        border-color: orange;
    }
</style>

<body>
    <div>
        <div>
            <div>
                <button onclick="Interpreter(this)">【HTML &gt; HEAD|BODY &gt; DIV &gt; DIV &gt; DIV &gt; BUTTON】</button>
            </div>
            <div>
                <button onclick="Interpreter(this)">【HTML &gt; HEAD|BODY &gt; DIV &gt; DIV &gt; DIV|DIV &gt; BUTTON】</button>
            </div>
        </div>
    </div>
    <ul>
        <li>
            <button onclick="Interpreter(this)">【HTML &gt; HEAD|BODY &gt; DIV|UL &gt; LI &gt; BUTTON】</button>
        </li>
        <li>
            <button onclick="Interpreter(this)">【HTML &gt; HEAD|BODY &gt; DIV|UL &gt; LI|LI &gt; BUTTON】</button>
        </li>
        <li>
            <button onclick="Interpreter(this)">【HTML &gt; HEAD|BODY &gt; DIV|UL &gt; LI|LI|LI &gt; BUTTON】</button>
        </li>
    </ul>
    <div>
        <button onclick="Interpreter(this)">【HTML &gt; HEAD|BODY &gt; DIV|UL|DIV &gt; BUTTON】</button>
        <button onclick="Interpreter(this)">【HTML &gt; HEAD|BODY &gt; DIV|UL|DIV &gt; BUTTON|BUTTON】</button>
        <p onclick="Interpreter(this)" style="text-align: center;">【HTML &gt; HEAD|BODY &gt; DIV|UL|DIV &gt; BUTTON|BUTTON|P】</p>
    </div>
    <script src="./index.js"></script>
</body>

</html>
// XPath 解释器
const Interpreter = (function () {
   
   

    /**
     * 获取兄弟元素的nodeName
     * @param {HTMLElement} node DOM元素
     */
    function getSublingName(node) {
   
   
        let names = [];
        while (node) {
   
   
            if (node.nodeType === 1)
                names = [node.nodeName, ...names];
            node = node.previousSibling;
        }
        console.log(names.join('|'));
        return names.join('|');
    }

    /**
     * 解释器方法
     */
    return function (node) {
   
   
        let path = [];
        while (node) {
   
   
            if (node.nodeType === 1) {
   
   
                path = [getSublingName(node), ...path]
            }
            node = node.parentNode;
        }
        console.log(path.join('>'));
        return path.join('>');
    };
}());
目录
相关文章
|
1月前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
2天前
|
设计模式 JavaScript 前端开发
[JavaScript设计模式]惰性单例模式
[JavaScript设计模式]惰性单例模式
|
1天前
|
设计模式 JavaScript 前端开发
JavaScript设计模式——代理模式
JavaScript设计模式——代理模式
|
1天前
|
设计模式 Java 关系型数据库
面向对象设计原则、设计模式与动态类型语言
面向对象设计原则、设计模式与动态类型语言
|
1月前
|
设计模式 JavaScript 前端开发
js设计模式-观察者模式与发布/订阅模式
观察者模式和发布/订阅模式是JavaScript中的两种设计模式,用于处理对象间的通信和事件处理。观察者模式中,一个主题对象状态改变会通知所有观察者。实现包括定义主题和观察者对象,以及在主题中添加、删除和通知观察者的功能。发布/订阅模式则引入事件管理器,允许发布者发布事件,订阅者通过订阅接收通知。
|
1月前
|
设计模式 SQL Java
【设计模式】抖音一面:你不知道解释器模式?
【设计模式】抖音一面:你不知道解释器模式?
24 1
|
24天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的java语言的考试信息报名系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的java语言的考试信息报名系统附带文章源码部署视频讲解等
23 0
|
1月前
|
JavaScript 前端开发 Java
javascript是弱类型语言,一个函数参数可以接收不同类型的变量作为它的该参数
javascript是弱类型语言,一个函数参数可以接收不同类型的变量作为它的该参数
31 0
|
1月前
|
设计模式 Go
[设计模式 Go实现] 行为型~解释器模式
[设计模式 Go实现] 行为型~解释器模式
|
1月前
|
设计模式 存储 前端开发
JS的几种设计模式,Web前端基础三剑客学习知识分享,前端零基础开发
JS的几种设计模式,Web前端基础三剑客学习知识分享,前端零基础开发

热门文章

最新文章