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('>');
    };
}());
目录
相关文章
|
4月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 职责链模式
js设计模式【详解】—— 职责链模式
76 8
|
4月前
|
设计模式 JavaScript 前端开发
js设计模式【详解】—— 组合模式
js设计模式【详解】—— 组合模式
52 7
|
1月前
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
30 3
|
1月前
|
XML 监控 JavaScript
JavaScript 语言对企业上网监控的技术支持
在数字化企业环境中,上网监控对企业信息安全和提升员工效率至关重要。JavaScript 作为广泛应用的脚本语言,提供了强大的技术支持,包括数据获取与分析、与服务器端交互、监控页面加载时间和网络活动,助力企业有效管理上网行为,保障信息安全。
26 6
|
2月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
3月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
50 1
|
3月前
|
Web App开发 JavaScript 前端开发
Node.js与Go语言的对比?
【8月更文挑战第4天】Node.js与Go语言的对比?
348 3
|
3月前
|
设计模式 JavaScript 前端开发
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
|
3月前
|
自然语言处理 JavaScript 前端开发
【走向世界】Vue.js国际化:打造无国界应用,让爱与信息跨越语言的边界!
【8月更文挑战第30天】本文详细介绍了Vue.js中实现国际化的多种方法及最佳实践。通过使用`vue-i18n`等第三方库,开发者能够轻松地为应用添加多语言支持,优化用户体验并扩大市场覆盖范围。文章涵盖从基本配置、动态加载语言包到考虑文化差异等方面的内容,帮助读者构建真正全球化且无缝多语言体验的应用程序。
100 0
|
3月前
|
JavaScript 前端开发 UED
探索JavaScript的历史:网络需求初现、语言创立与标准化的旅程
探索JavaScript的历史:网络需求初现、语言创立与标准化的旅程

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75