Skip to content

prismjs代码高亮 演示 #21

@leno23

Description

@leno23
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Prism.js HTML 中 JavaScript 代码高亮演示</title>
    
    <!-- Prism.js CSS 主题 -->
    <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet" />
    
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            max-width: 1200px;
            margin: 0 auto;
            padding: 20px;
            background-color: #f5f5f5;
        }
        
        h1 {
            color: #333;
            border-bottom: 3px solid #5a67d8;
            padding-bottom: 10px;
        }
        
        .demo-section {
            background: white;
            padding: 20px;
            margin: 20px 0;
            border-radius: 8px;
            box-shadow: 0 2px 8px rgba(0,0,0,0.1);
        }
        
        .demo-section h2 {
            color: #5a67d8;
            margin-top: 0;
        }
        
        .description {
            color: #666;
            margin-bottom: 15px;
            line-height: 1.6;
        }
        
        pre[class*="language-"] {
            border-radius: 6px;
            margin: 10px 0;
        }
        
        .highlight-info {
            background: #e3f2fd;
            padding: 10px;
            border-left: 4px solid #2196f3;
            margin: 10px 0;
            border-radius: 4px;
        }
    </style>
</head>
<body>
    <h1>🎨 Prism.js - HTML 中 JavaScript 代码高亮演示</h1>
    
    <div class="highlight-info">
        <strong>✨ 功能说明:</strong> Prism.js 可以智能识别并高亮 HTML 中嵌入的 JavaScript 代码,包括 &lt;script&gt; 标签中的 JS、事件处理器中的 JS,以及 HTML 属性中的 JS 代码。
    </div>

    <!-- 演示 1:基本的 HTML 中包含 JavaScript -->
    <div class="demo-section">
        <h2>1️⃣ HTML 中的 &lt;script&gt; 标签</h2>
        <p class="description">这是最常见的场景:在 HTML 文档中包含 &lt;script&gt; 标签,Prism.js 会自动识别并高亮其中的 JavaScript 代码。</p>
        
        <pre><code class="language-markup">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;示例页面&lt;/title&gt;
    &lt;script&gt;
        // JavaScript 代码会被正确高亮
        function greet(name) {
            console.log(`Hello, ${name}!`);
            return `Welcome, ${name}`;
        }
        
        const users = ['Alice', 'Bob', 'Charlie'];
        users.forEach(user => greet(user));
        
        // ES6+ 特性
        const asyncFunction = async () => {
            const response = await fetch('/api/data');
            const data = await response.json();
            return data;
        };
    &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;Hello World&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
    </div>

    <!-- 演示 2:内联事件处理器 -->
    <div class="demo-section">
        <h2>2️⃣ HTML 事件处理器中的 JavaScript</h2>
        <p class="description">Prism.js 也能高亮 HTML 元素属性中的 JavaScript 代码,比如 onclick、onload 等事件处理器。</p>
        
        <pre><code class="language-markup">&lt;button onclick="alert('按钮被点击了!')"&gt;点击我&lt;/button&gt;

&lt;div onclick="
    const now = new Date();
    console.log('当前时间:', now.toLocaleString());
    this.style.backgroundColor = '#' + Math.floor(Math.random()*16777215).toString(16);
"&gt;
    点击改变背景色
&lt;/div&gt;

&lt;form onsubmit="
    event.preventDefault();
    const formData = new FormData(event.target);
    console.log('表单数据:', Object.fromEntries(formData));
    return false;
"&gt;
    &lt;input type="text" name="username" /&gt;
    &lt;button type="submit"&gt;提交&lt;/button&gt;
&lt;/form&gt;</code></pre>
    </div>

    <!-- 演示 3:复杂的混合代码 -->
    <div class="demo-section">
        <h2>3️⃣ 复杂的 HTML + JavaScript 混合</h2>
        <p class="description">在实际开发中,HTML 文档通常包含多个 &lt;script&gt; 标签、内联样式和事件处理器,Prism.js 都能正确处理。</p>
        
        <pre><code class="language-markup">&lt;!DOCTYPE html&gt;
&lt;html lang="zh-CN"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;style&gt;
        .card {
            padding: 20px;
            border-radius: 8px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
    &lt;/style&gt;
    &lt;script&gt;
        class TodoApp {
            constructor() {
                this.todos = [];
                this.init();
            }
            
            init() {
                document.addEventListener('DOMContentLoaded', () => {
                    this.loadTodos();
                    this.bindEvents();
                });
            }
            
            async loadTodos() {
                try {
                    const response = await fetch('/api/todos');
                    this.todos = await response.json();
                    this.render();
                } catch (error) {
                    console.error('加载失败:', error);
                }
            }
            
            addTodo(text) {
                const todo = {
                    id: Date.now(),
                    text: text,
                    completed: false,
                    createdAt: new Date().toISOString()
                };
                this.todos.push(todo);
                this.render();
            }
            
            render() {
                const list = document.getElementById('todo-list');
                list.innerHTML = this.todos
                    .map(todo => `
                        &lt;li class="${todo.completed ? 'completed' : ''}"&gt;
                            ${todo.text}
                        &lt;/li&gt;
                    `)
                    .join('');
            }
        }
        
        const app = new TodoApp();
    &lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div class="card"&gt;
        &lt;h1&gt;待办事项&lt;/h1&gt;
        &lt;input 
            type="text" 
            id="todo-input" 
            onkeypress="if(event.key === 'Enter') app.addTodo(this.value)"
        /&gt;
        &lt;ul id="todo-list"&gt;&lt;/ul&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
    </div>

    <!-- 演示 4:仅显示 JavaScript 代码 -->
    <div class="demo-section">
        <h2>4️⃣ 纯 JavaScript 代码高亮对比</h2>
        <p class="description">作为对比,这里是纯 JavaScript 代码的高亮效果(不包含 HTML)。</p>
        
        <pre><code class="language-javascript">// React 组件示例
import React, { useState, useEffect } from 'react';

const Counter = () => {
    const [count, setCount] = useState(0);
    const [history, setHistory] = useState([]);
    
    useEffect(() => {
        console.log('Count changed:', count);
        setHistory(prev => [...prev, count]);
    }, [count]);
    
    const increment = () => setCount(prev => prev + 1);
    const decrement = () => setCount(prev => prev - 1);
    const reset = () => {
        setCount(0);
        setHistory([]);
    };
    
    return (
        <div className="counter">
            <h2>当前计数: {count}</h2>
            <button onClick={increment}>+1</button>
            <button onClick={decrement}>-1</button>
            <button onClick={reset}>重置</button>
            <div>
                <h3>历史记录:</h3>
                <ul>
                    {history.map((value, index) => (
                        <li key={index}>{value}</li>
                    ))}
                </ul>
            </div>
        </div>
    );
};

export default Counter;</code></pre>
    </div>

    <!-- 演示 5:CSS 中的代码 -->
    <div class="demo-section">
        <h2>5️⃣ HTML 中的 CSS 代码</h2>
        <p class="description">Prism.js 同样支持高亮 &lt;style&gt; 标签中的 CSS 代码。</p>
        
        <pre><code class="language-markup">&lt;style&gt;
    /* CSS 代码也会被正确高亮 */
    .container {
        display: grid;
        grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
        gap: 20px;
        padding: 20px;
    }
    
    .card {
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        border-radius: 12px;
        padding: 24px;
        box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
        transition: transform 0.3s ease, box-shadow 0.3s ease;
    }
    
    .card:hover {
        transform: translateY(-5px);
        box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3);
    }
    
    @media (max-width: 768px) {
        .container {
            grid-template-columns: 1fr;
        }
    }
&lt;/style&gt;</code></pre>
    </div>

    <!-- 技术说明 -->
    <div class="demo-section">
        <h2>📚 技术说明</h2>
        <div class="description">
            <h3>如何实现 HTML 中 JavaScript 的高亮:</h3>
            <ul>
                <li><strong>使用 <code>language-markup</code><code>language-html</code></strong>:这会自动启用嵌入式语言支持</li>
                <li><strong>引入必要的插件</strong>:Prism.js 会自动检测 HTML 中的 &lt;script&gt; 和 &lt;style&gt; 标签</li>
                <li><strong>支持的嵌入场景</strong><ul>
                        <li>&lt;script&gt; 标签中的 JavaScript</li>
                        <li>&lt;style&gt; 标签中的 CSS</li>
                        <li>HTML 属性中的内联 JavaScript(如 onclick)</li>
                        <li>style 属性中的内联 CSS</li>
                    </ul>
                </li>
            </ul>
            
            <h3>需要的 CDN 资源:</h3>
            <pre><code class="language-markup">&lt;!-- CSS 主题 --&gt;
&lt;link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet" /&gt;

&lt;!-- 核心 JS --&gt;
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"&gt;&lt;/script&gt;

&lt;!-- 标记语言支持(HTML) --&gt;
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-markup.min.js"&gt;&lt;/script&gt;

&lt;!-- JavaScript 支持 --&gt;
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-javascript.min.js"&gt;&lt;/script&gt;

&lt;!-- CSS 支持 --&gt;
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-css.min.js"&gt;&lt;/script&gt;</code></pre>
        </div>
    </div>

    <!-- Prism.js 核心库和组件 -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
    <!-- 标记语言(HTML)支持 - 这是关键! -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-markup.min.js"></script>
    <!-- JavaScript 语言支持 -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-javascript.min.js"></script>
    <!-- CSS 语言支持 -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-css.min.js"></script>
    
    <script>
        // 页面加载完成后重新高亮所有代码块
        document.addEventListener('DOMContentLoaded', () => {
            Prism.highlightAll();
            console.log('✅ Prism.js 已加载并完成代码高亮!');
        });
    </script>
</body>
</html>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions