Select an item from the sidebar to view content.
提供專屬於您的網站設計,確保符合品牌形象及業務需求,提升使用者體驗與吸引力。
打造適應多種裝置的網站,無論是桌面、平板還是手機,都能提供最佳瀏覽效果。
支援完整的電子商務功能,包括商品展示、購物車系統、線上付款整合等,助您輕鬆進行線上銷售。
建立穩定且高效的後端系統,包括資料庫管理、API整合及伺服器配置,支持網站的順暢運行。
針對網站進行速度優化及SEO優化,提高網站效能及搜尋引擎排名,吸引更多流量。
提供定期網站維護及內容更新服務,確保網站安全性與最新資訊同步。
隨時提供技術支援,解決問題並提供專業諮詢,協助您提升網站的運營效率。
JavaScript 是一種高效、靈活且具備動態特性的腳本語言,廣泛應用於前端和後端開發。以下是 JavaScript 的主要特點:
JavaScript 是一種動態型別語言,變數在宣告時不需要指定資料型別。這意味著變數的型別可以在程式執行過程中動態改變。
let value = 10; // 初始化為數字型
value = "Hello"; // 可以改為字串型
JavaScript 支援物件導向,並使用 原型繼承 的方式來實現物件的繼承與重用。這讓 JavaScript 能夠更靈活地定義和操作物件。
let person = {
name: "Alice",
greet: function() {
return "Hello, " + this.name;
}
};
在 JavaScript 中,函式也是物件,可以作為參數傳遞、返回,或賦值給變數。這特性支援許多函式式程式設計的模式。
function greet(name) {
return "Hello, " + name;
}
let sayHello = greet;
console.log(sayHello("Alice")); // 可以將函式作為變數使用
JavaScript 原生支援非同步操作,特別是透過 Promise
和 async/await
讓處理非同步行為更加直觀。這對於處理網路請求和計時事件等異步操作非常有用。
async function fetchData() {
const response = await fetch("https://api.example.com/data");
const data = await response.json();
console.log(data);
}
fetchData();
JavaScript 最初是用於網頁瀏覽器中的前端開發,但現在已廣泛應用於後端開發(如 Node.js)、桌面應用程式、行動應用程式甚至物聯網設備。
JavaScript 的靈活性與多樣性使其成為現代網頁開發的核心技術之一,並在各種應用領域中提供強大的支援。
您可以使用 concat
方法將兩個陣列合併:
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let result = arr1.concat(arr2);
console.log(result); // [1, 2, 3, 4, 5, 6]
使用展開運算符(spread operator)也是一個常見的方式:
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let result = [...arr1, ...arr2];
console.log(result); // [1, 2, 3, 4, 5, 6]
如果您希望將第二個陣列的元素加入到第一個陣列中,可以結合 push
與展開運算符:
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
arr1.push(...arr2);
console.log(arr1); // [1, 2, 3, 4, 5, 6]
將 console.log('op_panel_htm()')
改為動態取得函式名稱的方式輸出,例如 console.log(get_curr_method_name())
。
function get_curr_method_name() {
const stack = new Error().stack;
const lines = stack.split("\n");
// 第0行是 Error,第1行是 get_curr_method_name,第2行是呼叫它的函式
const callerLine = lines[2] || '';
const match = callerLine.match(/at (.+?) \(/);
return match ? match[1] : 'anonymous';
}
TableOperator.prototype.op_panel_htm = function () {
console.log(get_curr_method_name());
};
如果你這樣執行:
const t = new TableOperator();
t.op_panel_htm();
可能會在控制台輸出:
TableOperator.op_panel_htm
實際輸出取決於瀏覽器堆疊格式,Chrome/Edge 一般會輸出函式完整路徑。
Error().stack
,不同瀏覽器格式略有差異。可將其封裝成自訂除錯函式:
function debug_log(msg = '') {
console.log(`[${get_curr_method_name()}] ${msg}`);
}
使用方式:
debug_log("初始化完成");
輸出結果如:
[TableOperator.op_panel_htm] 初始化完成
當 JavaScript 專案變大、函式眾多時,應透過模組化與分類來提升維護性與可讀性。以下說明如何有效管理多個函式,包括是否使用 class
。
將相關函式依功能分類儲存在不同的檔案中,例如:
/utils/mathUtils.js → 數學運算相關函式
/utils/domUtils.js → DOM 操作函式
/modules/tableOperator.js → 表格操作相關 class 或函式
每個檔案使用 export
/ import
語法:
// mathUtils.js
export function add(a, b) {
return a + b;
}
// main.js
import { add } from './utils/mathUtils.js';
console.log(add(2, 3));
將具相關邏輯的函式包裝在一個物件或 class 中更具結構性,例如:
// domUtils.js
export const DomUtils = {
createElement(tag) {
return document.createElement(tag);
},
removeElement(el) {
el.parentNode.removeChild(el);
}
};
或使用 class:
// tableOperator.js
export class TableOperator {
constructor(tableId) {
this.table = document.getElementById(tableId);
}
highlightRow(index) {
// ...
}
sortByColumn(colIndex) {
// ...
}
}
如果只是工具性函式(如字串處理、數學運算),建議使用 export function
或 export const obj = { ... }
管理即可。
/src
/utils
stringUtils.js
mathUtils.js
/components
tableOperator.js
chartViewer.js
main.js
JavaScript 中的 class
使用與其他 OOP 語言類似,包含建構子 constructor
、成員變數與方法(函式)定義。
class Person {
// 成員變數(public)
name;
age;
// 建構子
constructor(name, age) {
this.name = name;
this.age = age;
}
// 成員方法
greet() {
console.log(`你好,我是 ${this.name},今年 ${this.age} 歲`);
}
// 靜態方法(無需實例化)
static species() {
return '人類';
}
}
const p = new Person("小明", 25);
p.greet(); // 輸出:你好,我是 小明,今年 25 歲
console.log(p.name); // 小明
console.log(Person.species()); // 人類
this.name
,可由外部存取。
class Counter {
#count = 0; // 私有變數
increment() {
this.#count++;
console.log(this.#count);
}
#secret() {
console.log("這是私有方法");
}
revealSecret() {
this.#secret(); // 可以內部呼叫
}
}
class Animal {
speak() {
console.log("發出聲音");
}
}
class Dog extends Animal {
speak() {
console.log("汪汪!");
}
}
class 方法中的 this
指向該實例。但若在事件或 callback 中使用,請用 bind()
或箭頭函式確保指向。
class Button {
constructor() {
this.label = "Click";
document.addEventListener("click", this.handleClick.bind(this));
}
handleClick() {
console.log(`你按了 ${this.label}`);
}
}
JavaScript 的 class 提供類似其他語言的封裝、繼承、方法與屬性支援,適合中大型專案使用,也方便與模組結合。若需更嚴謹型別與控制,可考慮搭配 TypeScript。
JavaScript 模組(module)提供一種將變數與函式封裝在檔案中的方式,可透過 import
/export
機制實現類似 class
的分工與結構化功能,適合用於工具函式或單一功能邏輯單元。
功能 | class | module |
---|---|---|
封裝資料與行為 | ✅ | ✅(透過 export 封裝) |
可實例化 | ✅ | ❌(以單例方式存在) |
繼承與多型 | ✅ | ❌(需手動管理) |
單一功能組件 | 可 | 更適合 |
// file: mathUtils.js
export const MathUtils = {
add(a, b) {
return a + b;
},
multiply(a, b) {
return a * b;
}
};
// file: main.js
import { MathUtils } from './mathUtils.js';
console.log(MathUtils.add(3, 4)); // 7
console.log(MathUtils.multiply(2, 5)); // 10
// file: stringHelper.js
export function toUpper(str) {
return str.toUpperCase();
}
export function truncate(str, len) {
return str.length > len ? str.slice(0, len) + '…' : str;
}
// file: main.js
import { toUpper, truncate } from './stringHelper.js';
console.log(toUpper("hello")); // HELLO
console.log(truncate("JavaScript", 5)); // JavaS…
// file: config.js
let config = {
env: "dev",
version: "1.0"
};
export function getConfig() {
return config;
}
export function setEnv(env) {
config.env = env;
}
// file: app.js
import { getConfig, setEnv } from './config.js';
console.log(getConfig()); // { env: "dev", version: "1.0" }
setEnv("prod");
console.log(getConfig()); // { env: "prod", version: "1.0" }
模組適合封裝工具函式、常數與設定,與 class
不同,模組在 載入時就自動執行且全域唯一,非常適合邏輯分類與程式架構整齊化。當需要可多次建立的物件實例或物件導向繼承時,則使用 class
較為適合。
模擬 C/C++ 的 #ifdef DEBUG
條件編譯機制,在 JavaScript 中實現可控制的 debug_log()
,依據開發階段(開發中、測試中、正式版)控制日誌的輸出層級與開關。
// 0 = 無輸出, 1 = 錯誤, 2 = 警告, 3 = 訊息, 4 = 除錯
const LOG_LEVEL = 3;
function debug_log(msg, level = 3) {
if (level <= LOG_LEVEL) {
const name = get_curr_method_name();
console.log(`[${name}] ${msg}`);
}
}
function get_curr_method_name() {
const stack = new Error().stack;
const lines = stack.split("\n");
const callerLine = lines[2] || '';
const match = callerLine.match(/at (.+?) \(/);
return match ? match[1] : 'anonymous';
}
function initApp() {
debug_log("初始化中", 4); // 除錯級別
debug_log("載入設定成功", 3); // 訊息
debug_log("設定值可能過舊", 2); // 警告
debug_log("載入失敗", 1); // 錯誤
}
LOG_LEVEL = 4
(全開)LOG_LEVEL = 2
(只顯示錯誤與警告)LOG_LEVEL = 0
(完全靜默)搭配工具如 Webpack/Vite/ESBuild,可透過條件常數 process.env.NODE_ENV
移除日誌:
if (process.env.NODE_ENV === 'development') {
debug_log("開發環境中的訊息");
}
也可以搭配 Babel 外掛(如 babel-plugin-transform-remove-console)在打包時移除所有 console.*
。
雖然 JavaScript 沒有條件編譯,但可以透過變數控制與打包優化策略,實現類似 C++ 的除錯等級與發佈控制機制,確保開發階段資訊完整,正式版本乾淨無雜訊。
響應式網頁設計是一種網站設計方法,使網站可以適應不同裝置的螢幕尺寸和解析度。這意味著無論是手機、平板電腦,還是桌面電腦,網站的內容都會自動調整,以提供最佳的使用體驗。
響應式設計的關鍵在於靈活的佈局、可調整的圖片以及CSS媒體查詢。這些技術可以讓網站依據裝置的寬度自動調整元素的大小和排列。
在CSS中使用媒體查詢來調整版面,例如:
@media (max-width: 600px) { body { font-size: 14px; } }
響應式設計可以改善用戶體驗,減少開發成本,並增加SEO效果。由於無需為每種裝置設計不同的版本,響應式網頁更加容易維護。
JavaScript 是前端程式語言,其程式碼會被下載到用戶的瀏覽器中執行,因此很容易被查看或複製。 雖然無法完全防止程式碼被逆向工程,但可以採取多種措施增加保護強度,並實現試用與正式版的授權機制。
使用工具將原始程式碼轉換為難以閱讀的格式。
npm install -g javascript-obfuscator
javascript-obfuscator input.js --output output.js
混淆後的程式碼範例:
var _0x1a2b=["\x68\x65\x6C\x6C\x6F"];console[_0x1a2b[0]]("Hello World!");
利用壓縮工具移除空白與註解,減少程式碼可讀性,例如使用 UglifyJS
。
將重要邏輯存於伺服器,通過 API 提供服務,而非直接執行於前端。
fetch('https://example.com/api').then(response => response.json()).then(data => console.log(data));
在頁面中加入偵測機制,阻止開發者工具的使用。
document.addEventListener('keydown', (event) => {
if (event.key === 'F12' || (event.ctrlKey && event.shiftKey && event.key === 'I')) {
event.preventDefault();
}
});
將試用與正式版邏輯與 API 結合,例如根據授權碼檢查用戶身份。
fetch('https://example.com/verify_license', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ licenseKey: userLicenseKey })
}).then(response => response.json()).then(data => {
if (data.valid) {
console.log('正式版啟用');
} else {
console.log('試用版限制功能');
}
});
在試用版中禁用部分功能,例如 UI 元件的可用性或數據存取權限。
基於用戶的首次使用日期,設置試用期檢查邏輯。
const startDate = localStorage.getItem('startDate') || new Date();
localStorage.setItem('startDate', startDate);
if (new Date() - new Date(startDate) > 14 * 24 * 60 * 60 * 1000) {
console.log('試用期已結束');
} else {
console.log('試用期內');
}
在網頁中,監聽滾動位置的變更可以實現許多動態效果,例如顯示返回頂部按鈕、懸浮導航欄等。使用 JavaScript 可以輕鬆實現這類事件的監聽。
在 JavaScript 中,可以透過 window.addEventListener('scroll', handler)
方法來監聽滾動事件。在滾動時觸發 handler
函式,進行相應的處理。
以下範例顯示當前頁面滾動的垂直位置,並在頁面下方顯示。
<script>
// 定義滾動事件處理函式
function handleScroll() {
const scrollPosition = window.scrollY; // 獲取垂直滾動位置
document.getElementById("scrollPositionDisplay").textContent = "目前滾動位置:" + scrollPosition + " px";
}
// 添加滾動事件監聽器
window.addEventListener('scroll', handleScroll);
</script>
<div id="scrollPositionDisplay" style="position: fixed; bottom: 20px; left: 20px; background-color: #eee; padding: 10px;">
目前滾動位置:0 px
</div>
在滾動事件中添加太多運算可能會影響性能,建議使用 requestAnimationFrame
或 setTimeout
進行節流(throttling),減少事件觸發的頻率。
監聽滾動位置變更的事件可用於多種動態效果,從而增強網頁的交互性。透過簡單的 JavaScript 即可實現滾動事件的監聽,提升用戶體驗。
width: max-content
這種方法讓元素的寬度根據內容自動調整,同時保持在新行。
pre { display: inline-block; width: max-content; }
效果:
這是一段文字。
這是一個代碼區塊。
float: left
此方法使用 float
讓元素浮動至左邊,並讓其新行開始。
pre { display: inline-block; float: left; }
效果:
這是一段文字。
這是一個代碼區塊。
::before
虛擬元素透過虛擬元素強制元素換行,同時保持寬度自適應。
pre { display: inline-block; } pre::before { content: ''; display: block; clear: both; }
效果:
這是一段文字。
這是一個代碼區塊。
white-space: pre
使用 white-space
控制換行行為,讓區塊寬度自然適應內容。
pre { display: inline-block; white-space: pre; }
效果:
這是一段文字。
這是一個代碼區塊。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Windows App UI 模擬</title>
<style>
body {
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
margin: 0;
padding: 0;
background-color: #f0f0f0;
}
.app-window {
width: 800px;
height: 500px;
margin: 50px auto;
background: #ffffff;
border: 1px solid #ccc;
border-radius: 8px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
overflow: hidden;
display: flex;
flex-direction: column;
}
.title-bar {
background: #0078d7;
color: #ffffff;
padding: 10px 15px;
display: flex;
justify-content: space-between;
align-items: center;
}
.title-bar h1 {
font-size: 16px;
margin: 0;
}
.title-bar .buttons {
display: flex;
gap: 5px;
}
.title-bar .buttons button {
width: 20px;
height: 20px;
background: #ffffff;
border: none;
border-radius: 50%;
cursor: pointer;
}
.title-bar .buttons button:hover {
background: #e0e0e0;
}
.content {
flex: 1;
padding: 15px;
overflow: auto;
}
.sidebar {
width: 200px;
background: #f3f3f3;
border-right: 1px solid #ddd;
display: inline-block;
vertical-align: top;
}
.main-content {
display: inline-block;
width: calc(100% - 200px);
vertical-align: top;
}
.sidebar ul {
list-style: none;
margin: 0;
padding: 0;
}
.sidebar ul li {
padding: 10px 15px;
cursor: pointer;
border-bottom: 1px solid #ddd;
}
.sidebar ul li:hover {
background: #e9e9e9;
}
.main-content p {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div class="app-window">
<div class="title-bar">
<h1>My Windows App</h1>
<div class="buttons">
<button title="Minimize"></button>
<button title="Maximize"></button>
<button title="Close" style="background: #e81123;"></button>
</div>
</div>
<div class="content">
<div class="sidebar">
<ul>
<li onclick="showContent('Home')">Home</li>
<li onclick="showContent('Settings')">Settings</li>
<li onclick="showContent('About')">About</li>
</ul>
</div>
<div class="main-content" id="mainContent">
<p>Select an item from the sidebar to view content.</p>
</div>
</div>
</div>
<script>
function showContent(section) {
const content = {
Home: '<h2>Home</h2><p>Welcome to the home page.</p>',
Settings: '<h2>Settings</h2><p>Adjust your application preferences here.</p>',
About: '<h2>About</h2><p>This is a mock Windows App created using HTML and JavaScript.</p>',
};
document.getElementById('mainContent').innerHTML = content[section] || '<p>Content not found.</p>';
}
</script>
</body>
</html>
index.html
。Select an item from the sidebar to view content.
React 是由 Facebook 開發的熱門 JavaScript 庫,適合構建動態且高效的使用者介面。其元件化設計使開發者能快速建立和重複使用 UI 元件。
Vue.js 是一個輕量且易於上手的框架,適合開發中小型應用程式。其簡單的 API 和直觀的設計讓快速設計 UI 成為可能。
Bootstrap 是一個前端框架,提供多種現成的 UI 元件和排版工具,能快速建構響應式網站。
Material-UI 是基於 Google Material Design 的 React UI 框架,包含許多精美的元件,適合快速設計高品質的介面。
Tailwind 是一個實用的 CSS 框架,結合 JavaScript 使用時能快速構建客製化的 UI。它的原子化設計讓開發者能靈活控制樣式。
Foundation 是一個響應式前端框架,提供多種 UI 元件與網格系統,適合快速建立現代化的網頁設計。
Chakra UI 是一個簡單且可客製化的 React UI 框架,提供直觀的 API 和多樣的元件。
Quasar 是基於 Vue.js 的 UI 框架,能快速構建響應式和跨平台的應用程式。
import React, { useState, useEffect } from 'react';
function DatabaseView() {
// 模擬的資料庫資料
const [data, setData] = useState([]);
const [searchTerm, setSearchTerm] = useState('');
// 模擬從資料庫獲取資料
useEffect(() => {
const fetchData = async () => {
const mockData = [
{ id: 1, name: 'John Doe', email: '[email protected]', age: 28 },
{ id: 2, name: 'Jane Smith', email: '[email protected]', age: 34 },
{ id: 3, name: 'Alice Brown', email: '[email protected]', age: 25 },
{ id: 4, name: 'Bob White', email: '[email protected]', age: 40 },
];
setData(mockData);
};
fetchData();
}, []);
// 過濾資料
const filteredData = data.filter(
(item) =>
item.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
item.email.toLowerCase().includes(searchTerm.toLowerCase())
);
return (
<div style={{ padding: '20px', fontFamily: 'Arial, sans-serif' }}>
<h1>Database View</h1>
<input
type="text"
placeholder="Search by name or email"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
style={{
marginBottom: '20px',
padding: '10px',
width: '300px',
fontSize: '16px',
}}
/>
<table
style={{
width: '100%',
borderCollapse: 'collapse',
marginTop: '10px',
}}
>
<thead>
<tr>
<th style={{ border: '1px solid #ddd', padding: '10px' }}>ID</th>
<th style={{ border: '1px solid #ddd', padding: '10px' }}>Name</th>
<th style={{ border: '1px solid #ddd', padding: '10px' }}>Email</th>
<th style={{ border: '1px solid #ddd', padding: '10px' }}>Age</th>
</tr>
</thead>
<tbody>
{filteredData.map((item) => (
<tr key={item.id}>
<td style={{ border: '1px solid #ddd', padding: '10px' }}>
{item.id}
</td>
<td style={{ border: '1px solid #ddd', padding: '10px' }}>
{item.name}
</td>
<td style={{ border: '1px solid #ddd', padding: '10px' }}>
{item.email}
</td>
<td style={{ border: '1px solid #ddd', padding: '10px' }}>
{item.age}
</td>
</tr>
))}
</tbody>
</table>
</div>
);
}
export default DatabaseView;
create-react-app
。DatabaseView.js
。App.js
中匯入並使用 <DatabaseView />
。HTML5 的 <canvas>
元素是一個可供使用 JavaScript 繪圖的區域,允許在網頁上呈現 2D 和 3D
圖像。它是一個容器,可以透過程式碼進行繪製操作,如畫線、圖形和圖片,適合遊戲、圖形編輯等需要即時生成的應用。
以下是 canvas
元素的基本語法:
<canvas id="myCanvas" width="500" height="500"></canvas>
要在 canvas
元素上繪製內容,必須使用 getContext
方法。這個方法允許取得繪圖的上下文,目前最常用的選項是 "2d"。它會返回一個
CanvasRenderingContext2D
物件,提供許多繪圖方法。
例如,以下 JavaScript 程式碼可以取得 canvas
的 2D 繪圖上下文:
var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");
使用 getContext("2d")
獲得的繪圖上下文,能夠進行如畫線、畫矩形、填充顏色等基本繪圖操作。例如:
moveTo(x, y)
和 lineTo(x, y)
方法來定義線段,並使用 stroke()
畫出線條。fillRect(x, y, width, height)
繪製填滿的矩形,或
strokeRect(x, y, width, height)
繪製空心矩形。fillStyle
設定填充顏色,例如 ctx.fillStyle = "blue";
範例程式碼:
ctx.fillStyle = "blue";
ctx.fillRect(50, 50, 100, 100); // 畫一個藍色矩形
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(200, 200);
ctx.stroke(); // 畫一條紅色線條
若要清除 canvas
中的圖像,可以使用 clearRect(x, y, width, height)
方法。例如,清除整個畫布的程式碼為:
ctx.clearRect(0, 0, canvas.width, canvas.height);
利用 requestAnimationFrame()
可以實現平滑的動畫效果。透過每次更新畫面前先清除上一幀的內容,可以繪製出動態效果。以下是簡單的動畫範例:
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillRect(x, y, 50, 50); // 繪製方塊
x += 1; // 更新位置
requestAnimationFrame(draw);
}
draw();
Canvas 的尺寸應設定在 HTML 中,若使用 CSS 改變大小可能導致畫面失真。此外,canvas
並非為了代替高解析度的影像,而是用來即時生成和動態繪圖。
SVG(Scalable Vector Graphics)是一種基於 XML 的向量圖形格式,可在網頁中繪製線條、圖形、文字,並支援縮放與動畫。與點陣圖不同,SVG 在放大縮小時不會失真,適合圖表、ICON、地圖與流程圖等應用。
<svg width="200" height="100">
<rect x="10" y="10" width="50" height="50" fill="blue" />
<circle cx="100" cy="35" r="25" fill="green" />
<line x1="150" y1="10" x2="190" y2="60" stroke="red" stroke-width="2" />
<text x="10" y="90" font-size="14" fill="black">這是SVG</text>
</svg>
<rect>
:矩形<circle>
:圓形<ellipse>
:橢圓<line>
:線段<polyline>
、<polygon>
:折線與多邊形<path>
:自由繪圖路徑(可畫曲線、複雜形狀)<text>
:文字
<svg width="100" height="100">
<circle cx="50" cy="50" r="40" fill="orange" onclick="alert('你點到了圓形')" />
</svg>
可透過 CSS
或 <animate>
標籤製作動畫:
<circle cx="30" cy="50" r="20" fill="blue">
<animate attributeName="cx" from="30" to="170" dur="2s" repeatCount="indefinite" />
</circle>
<svg id="mysvg" width="200" height="100">
<circle id="c1" cx="50" cy="50" r="30" fill="gray" />
</svg>
<script>
document.getElementById("c1").setAttribute("fill", "red");
</script>
SVG 是網頁前端中非常重要的圖形標準之一,具有高解析度、互動性與動畫性,並可與 HTML/CSS/JavaScript 無縫整合。適合需要精確、縮放性強的圖形表現場景。
WebGL(Web Graphics Library)是一套基於 OpenGL ES 的 JavaScript API,可在瀏覽器中使用 HTML5 的 <canvas>
元素進行 2D 和 3D 圖形的硬體加速繪製,不需要任何外掛。
繪製一個有顏色的三角形:
<canvas id="glCanvas" width="300" height="300"></canvas>
<script>
const canvas = document.getElementById('glCanvas');
const gl = canvas.getContext('webgl');
if (!gl) {
alert("你的瀏覽器不支援 WebGL");
}
const vertexShaderSource = `
attribute vec2 a_position;
void main() {
gl_Position = vec4(a_position, 0, 1);
}
`;
const fragmentShaderSource = `
void main() {
gl_FragColor = vec4(1, 0, 0, 1); // 紅色
}
`;
function createShader(gl, type, source) {
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
return shader;
}
const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
0, 1,
-1, -1,
1, -1
]), gl.STATIC_DRAW);
const posAttribLoc = gl.getAttribLocation(program, "a_position");
gl.enableVertexAttribArray(posAttribLoc);
gl.vertexAttribPointer(posAttribLoc, 2, gl.FLOAT, false, 0, 0);
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, 3);
</script>
WebGL 為網頁開發者提供 GPU 加速的 3D 圖形繪製能力,是現代 Web 遊戲、數位藝術、模擬與視覺化的核心技術之一。雖然原生 WebGL 較為底層,但可搭配高階函式庫簡化開發流程。
Spirograph 是一種用於創建複雜圖形的幾何圖案,其原理是利用兩個圓形的轉動來描繪出多重圓形和波浪形的曲線。這種圖形通常用於藝術創作和教育,能夠展現數學中的幾何美感。
以下是使用 HTML5 的 <canvas> 元素和 JavaScript 實現 Spirograph 的範例:
程式庫名稱 | 語法表達性 | 圖形類型 | 適合對象 | 是否支援互動 | 是否支援動畫 |
---|---|---|---|---|---|
Mermaid.js | 極高(使用類 Markdown 語法) | 流程圖、序列圖、甘特圖、ER圖、Class圖 | 文件視覺化、快速原型 | 有限支援 | 部分支援 |
D3.js | 中等(需要理解資料綁定與 DOM 操作) | 幾乎所有圖形(自訂性極高) | 進階資料視覺化開發者 | 完整支援 | 完整支援 |
Cytoscape.js | 高(以 JSON 定義節點與邊) | 網路圖、流程圖 | 生物資訊、社交網絡分析 | 完整支援 | 部分支援 |
Vega / Vega-Lite | 高(使用 JSON 宣告式描述圖表) | 統計圖表(條狀圖、散佈圖等) | 資料科學、儀表板設計 | 支援 | 部分支援 |
Graphviz via Viz.js | 高(DOT 語法類似文字編程) | 流程圖、圖論結構 | 學術用途、快速架構圖 | 不支援 | 不支援 |
JSXGraph | 高(幾何語意清晰) | 幾何圖形、座標圖 | 數學教育 | 支援 | 支援 |
在 HTML 中,您可以使用 <svg>
標籤來繪製基本的 UML 類別圖。以下是一個範例,展示如何使用矩形和文字來代表一個簡單的類別。
<svg width="300" height="200">
<rect x="50" y="20" width="200" height="30" fill="lightblue" stroke="black"/>
<text x="60" y="40" font-family="Arial" font-size="16">Class Name</text>
<rect x="50" y="50" width="200" height="50" fill="white" stroke="black"/>
<text x="60" y="70" font-family="Arial" font-size="14">+ attribute1 : Type</text>
<text x="60" y="90" font-family="Arial" font-size="14">+ attribute2 : Type</text>
<rect x="50" y="100" width="200" height="50" fill="white" stroke="black"/>
<text x="60" y="120" font-family="Arial" font-size="14">+ method1() : ReturnType</text>
<text x="60" y="140" font-family="Arial" font-size="14">+ method2() : ReturnType</text>
</svg>
可以利用 HTML 和 CSS 的樣式來定義不同的 UML 元件。下面的範例展示如何使用 <div>
和 CSS
來繪製一個類別框,並調整其樣式來模仿 UML
類別圖的結構。
<style>
.class-box {
width: 200px;
border: 1px solid black;
margin: 10px;
}
.header {
background-color: lightblue;
text-align: center;
font-weight: bold;
}
.attributes, .methods {
padding: 10px;
border-top: 1px solid black;
}
</style>
<div class="class-box">
<div class="header">ClassName</div>
<div class="attributes">
+ attribute1 : Type <br>
+ attribute2 : Type
</div>
<div class="methods">
+ method1() : ReturnType <br>
+ method2() : ReturnType
</div>
</div>
為了在 HTML 中繪製更複雜的 UML 圖,可以使用 mermaid.js 這樣的外部 JavaScript 庫。它支援多種 UML 圖表,並且可以直接嵌入 HTML。首先需要引用 mermaid.js,然後使用
<pre>
標籤撰寫 UML 圖表定義。
<script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
mermaid.initialize({ startOnLoad: true });
</script>
<pre class="mermaid">
classDiagram
Class01 <|-- Class02 : Inheritance
Class01 : +method1() void
Class02 : +method2() void
Class03 : +attribute int
Class04 : +method() void
</pre>
classDiagram Class01 <|-- Class02 : Inheritance Class01 : +method1() void Class02 : +method2() void Class03 : +attribute int Class04 : +method() void
這樣的範例可以輕鬆地使用 mermaid.js 繪製出更複雜且清晰的 UML 圖,並且支援不同的圖表類型。
此範例展示類別之間的繼承、組合、聚合和關聯。
<pre class="mermaid">
classDiagram
Animal <|-- Mammal
Animal <|-- Bird
Mammal o-- Dog : has-a
Bird --> Wing : has-a
class Animal {
+String name
+int age
+eat() void
}
class Mammal {
+hasFur() bool
}
class Dog {
+bark() void
}
class Bird {
+fly() void
}
class Wing {
+wingSpan int
}
</pre>
classDiagram Animal <|-- Mammal Animal <|-- Bird Mammal o-- Dog : has-a Bird --> Wing : has-a class Animal { +String name +int age +eat() void } class Mammal { +hasFur() bool } class Dog { +bark() void } class Bird { +fly() void } class Wing { +wingSpan int }
說明:此範例展示了多種關係:
Animal
是 Mammal
和 Bird
的超類別。Mammal
與 Dog
的組合關係由 o--
表示。Bird
與 Wing
的聚合關係由 -->
表示。此範例展示如何在類別之間表示多重性(1..*、0..1 等)和角色。
<pre class="mermaid">
classDiagram
Customer "1" --> "0..*" Order : places
Order "1" --> "1" Payment : includes
class Customer {
+String name
+String email
+placeOrder() void
}
class Order {
+int orderId
+String date
+calculateTotal() float
}
class Payment {
+float amount
+String method
+processPayment() void
}
</pre>
classDiagram Customer "1" --> "0..*" Order : places Order "1" --> "1" Payment : includes class Customer { +String name +String email +placeOrder() void } class Order { +int orderId +String date +calculateTotal() float } class Payment { +float amount +String method +processPayment() void }
說明:
Customer
可以擁有多個 Order
,每個 Order
都對應一個
Payment
。places
和 includes
)。此範例展示如何在 Mermaid.js 中定義介面和抽象類別。
<pre class="mermaid">
classDiagram
class Shape {
<<_abstract_>>
+area() float
+perimeter() float
}
Shape <|-- Rectangle
Shape <|-- Circle
class Rectangle {
+width float
+height float
+area() float
+perimeter() float
}
class Circle {
+radius float
+area() float
+perimeter() float
}
</pre>
classDiagram class Shape { <<_abstract_>> +area() float +perimeter() float } Shape <|-- Rectangle Shape <|-- Circle class Rectangle { +width : float +height : float +area() float +perimeter() float } class Circle { +radius : float +area() float +perimeter() float }
說明:
Shape
是抽象類別,以 <<abstract>>
標記。Rectangle
和 Circle
繼承了 Shape
並實現其方法。此範例展示類別繼承和介面實作的混合用法。
<pre class="mermaid">
classDiagram
class Flyable {
<<_interface_>>
+fly() void
}
class Bird {
+String species
+String color
+sing() void
}
class Airplane {
+String model
+int capacity
+takeOff() void
}
Bird ..|> Flyable : implements
Airplane ..|> Flyable : implements
</pre>
classDiagram class Flyable { <<_interface_>> +fly() void } class Bird { +String species +String color +sing() void } class Airplane { +String model +int capacity +takeOff() void } Bird ..|> Flyable : implements Airplane ..|> Flyable : implements
說明:
Flyable
為介面,並定義 fly()
方法。Bird
和 Airplane
都實作了 Flyable
介面,使用
..|>
符號表示。flowchart TD A[開始] --> B{是否需要繼續?} B -- 是 --> C[執行操作] B -- 否 --> D[結束] C --> D
Mermaid 提供官方的 Mermaid Live Editor,可以即時測試並檢查語法錯誤。將 Mermaid 語法貼上後,如果有錯誤,編輯器會顯示具體錯誤訊息,讓你更快地排除問題。
如果你的 Mermaid 圖表過於複雜,建議分段測試。例如,先移除一些類別或關係,只留下最基本的結構,逐步增加元素,這樣可以更快找出可能的語法錯誤來源。
Mermaid.js 的不同版本可能對語法有不同的支持。確保你使用的是最新版,或者在測試環境中確認你的 Mermaid.js 版本是否支持使用的語法功能。
+attribute : type
來標示屬性。<|--
或 -->
)是否正確,這些符號用於表示類別關係。<<abstract>>
或其它特殊標記,建議逐一移除或修改來確認是否造成錯誤。在瀏覽器的開發者工具中查看 JavaScript console,如果 Mermaid 圖表未正確生成,console 中可能會顯示具體錯誤訊息或提示,幫助你找出語法錯誤。
Mermaid 官方文件提供詳細的語法指南,可以幫助你確認語法使用是否正確。官方文件位於 Mermaid.js 官方網站。
以下是一個簡單的流程圖範例,說明決策與行動之間的邏輯關係。
flowchart TD A[開始] --> B{是否需要繼續?} B -- 是 --> C[執行操作] B -- 否 --> D[結束] C --> D
將上述流程圖語法粘貼到支持 Mermaid 的工具(如 Markdown 編輯器或 Mermaid 在線工具)中,即可生成出圖形。
此 JavaScript 函式庫可為 Mermaid.js 圖表加入可縮放的滑桿功能,使用者可透過 <input type="range">
控制圖表的縮放比例。函式庫使用 transform: scale()
實現視覺縮放,無需重新渲染 Mermaid。
// mermaidZoomSlider.js
export function setupMermaidZoomSlider({
sliderId = "zoomSlider",
diagramContainerId = "mermaidContainer",
min = 0.1,
max = 3,
step = 0.1,
initial = 1
} = {}) {
window.addEventListener("load", () => {
const slider = document.getElementById(sliderId);
const container = document.getElementById(diagramContainerId);
if (!slider || !container) {
console.warn("Mermaid zoom slider: Missing slider or container element");
return;
}
// 初始化 slider 屬性
slider.min = min;
slider.max = max;
slider.step = step;
slider.value = initial;
// 設定初始縮放
container.style.transformOrigin = "top left";
container.style.transform = `scale(${initial})`;
// 事件監聽:縮放
slider.addEventListener("input", () => {
const scale = parseFloat(slider.value);
container.style.transform = `scale(${scale})`;
});
});
}
<!-- HTML -->
<div>
<input type="range" id="zoomSlider">
</div>
<div id="mermaidContainer">
<pre class="mermaid">
graph TD;
A-->B;
B-->C;
</pre>
</div>
<!-- JavaScript 模組引入 -->
<script type="module">
import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs";
import { setupMermaidZoomSlider } from "./mermaidZoomSlider.js";
mermaid.initialize({ startOnLoad: true });
setupMermaidZoomSlider({
sliderId: "zoomSlider",
diagramContainerId: "mermaidContainer",
min: 0.2,
max: 3,
step: 0.1,
initial: 1
});
</script>
若需要拖曳移動、縮放重設等進階功能,可進一步擴充此函式庫,例如整合滑鼠拖拉與縮放重設按鈕。
D3.js (Data-Driven Documents) 是一個基於 JavaScript 的開源程式庫,用於將數據轉換為動態且互動的可視化效果。它使用網頁標準技術如 SVG、HTML 和 CSS,提供強大的工具來處理數據和繪製圖形。
d3.select()
和 d3.selectAll()
。
D3.js 被廣泛應用於各種數據可視化場景,例如:
要學習 D3.js,可以參考以下資源:
D3.js 是一個功能強大且靈活的數據可視化工具,適合需要高度自訂化圖表和互動效果的開發者。雖然學習曲線稍高,但一旦掌握,其應用潛力無窮。
本範例使用 D3.js 繪製一個簡單的樹狀圖,展示如何將階層結構資料視覺化。以下是主要步驟:
tree()
函數生成樹狀佈局。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>D3.js Tree Diagram Example</title>
<script src="https://d3js.org/d3.v7.min.js"></script>
<style>
.node circle {
fill: steelblue;
}
.node text {
font: 12px sans-serif;
}
.link {
fill: none;
stroke: #ccc;
stroke-width: 1.5px;
}
</style>
</head>
<body>
<script>
const width = 800;
const height = 600;
const treeData = {
name: "CEO",
children: [
{
name: "CTO",
children: [
{ name: "Engineering Manager" },
{ name: "Product Manager" }
]
},
{
name: "CFO",
children: [
{ name: "Accountant" },
{ name: "Finance Analyst" }
]
}
]
};
const svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(40,40)");
const treeLayout = d3.tree().size([height - 100, width - 160]);
const root = d3.hierarchy(treeData);
treeLayout(root);
svg.selectAll(".link")
.data(root.links())
.enter()
.append("path")
.attr("class", "link")
.attr("d", d3.linkHorizontal()
.x(d => d.y)
.y(d => d.x)
);
const nodes = svg.selectAll(".node")
.data(root.descendants())
.enter()
.append("g")
.attr("class", "node")
.attr("transform", d => `translate(${d.y},${d.x})`);
nodes.append("circle").attr("r", 5);
nodes.append("text")
.attr("dy", 3)
.attr("x", d => d.children ? -10 : 10)
.style("text-anchor", d => d.children ? "end" : "start")
.text(d => d.data.name);
</script>
</body>
</html>
運行此程式碼後,您將看到一個樹狀圖:
CEO
)。CTO
和 CFO
)向右展開。此範例可以擴展至更複雜的階層結構,或調整樣式以適應不同需求。例如:
矩形樹狀圖是一種用巢狀矩形方式來顯示階層資料的視覺化技術。每個矩形的面積代表一個數值大小,例如銷售額或檔案容量,而每個矩形也可以進一步巢狀,用來表示子分類。
Cytoscape.js 是用來繪製網路圖(Graph)的 JavaScript 函式庫,使用 JSON 定義節點與邊,語法簡潔,支援互動與樣式客製化。
elements
:定義節點(node)與邊(edge)資料style
:控制樣式,如顏色、箭頭、標籤layout
:圖形排列方式(可選 grid、circle、cose 等)classes
定義節點群組並指定不同樣式程式庫名稱 | 適用性 | 特點 | 是否支援互動 | 說明 |
---|---|---|---|---|
JointJS | ★★★★★ | 繪圖自由度高、可擴充電路元件符號 | ✔️ | 可繪製邏輯電路、流程圖,免費版功能已足夠 |
GoJS | ★★★★☆ | 強大的圖形與資料模型支援 | ✔️ | 非自由軟體,但有免費試用;常用於產線圖與電路圖 |
SVG.js | ★★★☆☆ | 輕量、支援精準繪圖 | ✔️ | 需自行設計元件(電阻、電容等),適合細部控制 |
Konva.js | ★★★☆☆ | Canvas 與 SVG 都支援 | ✔️ | 適合需要拖曳、點擊等互動行為的設計工具 |
ELK.js | ★★☆☆☆ | 自動佈局優秀 | ✖️ | 只負責佈局演算法(可與 JointJS 搭配) |
本工具可將以 x
和 y
為自變數的 z = f(x, y)
方程式繪製成 3D 曲面圖,並提供滑鼠操作旋轉、縮放、平移的互動功能。
<div id="plot3d" style="width:100%; height:600px;"></div>
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<script type="module">
// 定義 z = f(x, y) 的函數(可更換為任意方程式)
function computeZ(x, y) {
return Math.sin(x) * Math.cos(y); // z = sin(x) * cos(y)
}
const xRange = numeric.linspace(-5, 5, 50);
const yRange = numeric.linspace(-5, 5, 50);
// 建立 z 資料
const zValues = xRange.map(x =>
yRange.map(y => computeZ(x, y))
);
const data = [{
type: 'surface',
x: xRange,
y: yRange,
z: zValues,
colorscale: 'Viridis'
}];
const layout = {
title: 'z = sin(x) * cos(y)',
autosize: true,
scene: {
xaxis: { title: 'X 軸' },
yaxis: { title: 'Y 軸' },
zaxis: { title: 'Z 軸' }
}
};
Plotly.newPlot('plot3d', data, layout);
</script>
<!-- numeric.js 用來產生 linspace 數列 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/numeric/1.2.6/numeric.min.js"></script>
z = Math.sin(x * y)
→ 波紋狀z = x * x - y * y
→ 鞍形曲面z = Math.exp(-(x * x + y * y))
→ 高斯峰此範例使用 Plotly.js 提供互動式 3D 視覺化,並搭配 numeric.js 輔助產生數值網格。你可以自由變更 computeZ
函數中的內容來畫出任意的三維曲面。
3Dmol.js 是一個開源且專為瀏覽器設計的 WebGL 化學分子可視化函式庫,可直接在網頁中繪製分子結構。
<div id="viewer" style="width:400px;height:400px;"></div>
<script src="https://3dmol.org/build/3Dmol-min.js"></script>
<script>
const viewer = $3Dmol.createViewer("viewer", { backgroundColor: "white" });
viewer.addModel("C1=CC=CC=C1", "smi"); // 苯的 SMILES 結構
viewer.setStyle({}, {stick: {}, sphere: {scale: 0.3}});
viewer.zoomTo();
viewer.render();
</script>
ChemDoodle 提供 2D 與 3D 結構繪圖,支援多種化學格式,適用於教學與網頁應用。
JSmol 是 Jmol 的 JavaScript 版本,適合顯示大分子如蛋白質或晶體結構。
Mol*(MolStar)是由 RCSB PDB 開發的高階結構視覺化工具,專為生物大分子設計。
函式庫 | 主要用途 | 是否開源 | 是否需授權 |
---|---|---|---|
3Dmol.js | 通用3D分子視覺化 | ✅ | ❌ |
ChemDoodle | 2D與3D教學、展示 | 部分 | ✅ |
JSmol | 學術研究與教學 | ✅ | ❌ |
Mol* | 蛋白質與生物分子視覺化 | ✅ | ❌ |
此範例使用 3Dmol.js 並採用 XYZ 格式 定義苯分子的原子座標,以正確顯示 3D 分子結構。
如果使用 SMILES 格式("smi")會出現錯誤 Unknown format: smi
,因為該格式在部分 3Dmol.js 版本中未被支援。
benzene.html
。python -m http.server
)開啟。http://localhost:8000
檢視結果。<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>3Dmol.js 渲染苯分子</title>
<script src="https://3dmol.org/build/3Dmol-min.js"></script>
<style>
#viewer {
width: 600px;
height: 600px;
position: relative;
border: 1px solid #aaa;
}
</style>
</head>
<body>
<h2>3Dmol.js 苯分子展示 (XYZ 格式)</h2>
<div id="viewer"></div>
<script>
document.addEventListener("DOMContentLoaded", function () {
const viewer = $3Dmol.createViewer("viewer", { backgroundColor: "white" });
const xyzData = `
12
benzene
C 0.0000 1.3968 0.0000
H 0.0000 2.4903 0.0000
C -1.2096 0.6984 0.0000
H -2.1471 1.2451 0.0000
C -1.2096 -0.6984 0.0000
H -2.1471 -1.2451 0.0000
C 0.0000 -1.3968 0.0000
H 0.0000 -2.4903 0.0000
C 1.2096 -0.6984 0.0000
H 2.1471 -1.2451 0.0000
C 1.2096 0.6984 0.0000
H 2.1471 1.2451 0.0000
`;
viewer.addModel(xyzData, "xyz");
viewer.setStyle({}, {stick: {}, sphere: {scale: 0.3}});
viewer.zoomTo();
viewer.render();
});
</script>
</body>
</html>
file://
開啟 HTML,建議使用本地 HTTP 伺服器。Web API(Web 應用程式介面)是一種基於 HTTP 協定的介面,允許不同系統之間交換資料,常用於前端與後端之間的溝通。
方法 | 用途 |
---|---|
GET | 取得資料 |
POST | 新增資料 |
PUT | 更新資料 |
DELETE | 刪除資料 |
以下是一個使用 JavaScript 發送 GET 請求的範例:
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('錯誤:', error));
請輸入一個中文字,系統將會顯示出該字的注音:
尚未查詢
Google ID登入是一種基於OAuth 2.0協議的認證方式,允許用戶使用其Google帳戶登入第三方網站或應用程式。這樣的方式不僅提高了用戶的便利性,還能增強安全性,因為用戶不需要記住額外的密碼。
<script src="https://apis.google.com/js/platform.js" async defer></script>
<div class="g_id_signin" data-type="standard" data-shape="rectangular" data-theme="outline" data-text="signin_with" data-size="large" data-logo_alignment="left"></div>
當用戶點擊登入按鈕後,Google會進行身份驗證。成功登入後,使用者的資訊(如電子郵件、名字等)會回傳給你的應用程式,你可以根據這些資訊進行後續的處理。
使用Google ID登入為用戶提供了一種簡單、安全的登入方式,並且減少了管理多個帳號的麻煩。透過整合Google的登入系統,開發者可以提高用戶體驗,並吸引更多的使用者使用其網站或應用程式。
若想嵌入 YouTube 影片,請將原本的連結修改為嵌入格式:
<iframe width="560" height="315" src="https://www.youtube.com/embed/{vid}" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
其中 {vid}
為 YouTube 影片的 ID。
例如,影片連結為 https://www.youtube.com/watch?v=dQw4w9WgXcQ
,則嵌入代碼如下:
<iframe width="560" height="315" src="https://www.youtube.com/embed/dQw4w9WgXcQ" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
這樣的嵌入格式可以避免 X-Frame-Options
限制,讓影片可以正常顯示在頁面中。
Node.js 是一個基於 Chrome V8 JavaScript 引擎的伺服器端執行環境,讓開發者可以使用 JavaScript 撰寫後端應用程式。
express
:輕量級 Web 應用框架fs
:檔案系統操作http
:建立 HTTP 伺服器path
:處理檔案路徑const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello, Node.js!');
});
server.listen(3000, () => {
console.log('伺服器已啟動,監聽埠口 3000');
});
Node.js 為前端開發者帶來統一語言的後端開發環境,提升開發效率並適合建構現代網路應用。
NPM(Node Package Manager)是 Node.js 的套件管理工具,用來管理 JavaScript 程式碼的函式庫與模組。它讓開發者能夠安裝、分享與版本控制專案所需的各種套件。
npm init
:初始化一個新的專案並建立 package.json
檔案。npm install
:安裝 package.json
中列出的所有相依套件。npm install [套件名稱]
:安裝指定套件。npm uninstall [套件名稱]
:移除指定套件。npm update
:更新已安裝的套件。package.json
是專案的核心檔案,記錄了專案的名稱、版本、描述、依賴套件等資訊,是 NPM 管理套件的基礎。
NPM 是最早也是最廣泛使用的 JavaScript 套件管理工具,但後來也出現了如 Yarn 等替代方案,提供更快的安裝速度與平行處理等功能。兩者皆可使用於大部分的 Node.js 專案。
Electron 是一個開源框架,讓開發者可以使用 HTML、CSS 和 JavaScript 建立跨平台的桌面應用程式。它結合了 Chromium 和 Node.js,讓網頁技術可以存取本機系統資源。
npm install --save-dev electron
// main.js
const { app, BrowserWindow } = require('electron');
function createWindow () {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true
}
});
win.loadFile('index.html');
}
app.whenReady().then(createWindow);
<!DOCTYPE html>
<html>
<body>
<h1>你好,Electron!</h1>
</body>
</html>
npx electron .
electron-builder
可用來產生安裝檔優先順序 | 說明 |
---|---|
1. | 指定的絕對路徑或相對路徑:直接指定檔案的路徑,PHP 會首先尋找此路徑下的檔案。 |
2 | 執行檔案的當前目錄:如果沒有指定完整路徑,PHP 會先在執行檔案所在的目錄尋找檔案。 |
3 | include_path 設定:若在執行目錄下找不到檔案,PHP 將檢查 php.ini 中設定的 include_path 路徑。 |
4 | 檔案不存在:若以上所有路徑均無法找到檔案,則會產生一個警告(Warning ),並返回 false 。 |
可以透過 $_SERVER['PHP_SELF']
獲取當前執行的檔案路徑,然後使用 basename
取得檔案名稱:
<?php
$current_page = basename($_SERVER['PHP_SELF']);
echo "當前頁面名稱:" . $current_page;
?>
透過 $_SERVER['REQUEST_URI']
獲取完整的URL路徑,然後使用 parse_url
和 basename
解析檔案名稱:
<?php
$url_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$current_page = basename($url_path);
echo "當前頁面名稱:" . $current_page;
?>
如果URL包含查詢參數,可以分開處理:
<?php
$url_path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$query_string = parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY);
$current_page = basename($url_path);
echo "檔案名稱:" . $current_page . "<br>";
echo "查詢參數:" . $query_string;
?>
假設當前URL是 https://example.com/page.php?id=123
:
當前頁面名稱:page.php
檔案名稱:page.php
查詢參數:id=123
parse_url()
函式搭配 PHP_URL_QUERY
常數,從完整的網址中擷取查詢字串部分。例如:
$url = "https://example.com/page.php?name=John&age=30&lang=php";
$query = parse_url($url, PHP_URL_QUERY); // 結果為 "name=John&age=30&lang=php"
parse_str()
函式可以將查詢字串解析為關聯式陣列,其中每一組名稱與數值都會自動解碼並轉換為陣列元素:
parse_str($query, $params);
此時 $params
的內容為:
[
"name" => "John",
"age" => "30",
"lang" => "php"
]
<?php
$url = "https://example.com/page.php?name=John&age=30&lang=php";
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $params);
foreach ($params as $key => $value) {
echo "$key = $value\n";
}
?>
name = John
age = 30
lang = php
parse_url()
只會擷取查詢部分,不會解析內容。parse_str()
可處理 URL 編碼,例如 %20
會轉為空格。tags[]=php&tags[]=html
將轉為陣列。使用 JavaScript 獲取 <h1>
的內容,然後將其發送到 PHP:
<!DOCTYPE html> <html lang="zh-Hant"> <head> <meta charset="UTF-8"> <title>獲取 H1 內容</title> <script> function sendH1Content() { var h1Content = document.querySelector('h1').innerText; var xhr = new XMLHttpRequest(); xhr.open('POST', 'process.php', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('h1Content=' + encodeURIComponent(h1Content)); } window.onload = sendH1Content; </script> </head> <body> <h1>這是頁面的標題</h1> </body> </html>
在 process.php
中接收並處理 H1 內容:
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $h1Content = $_POST['h1Content'] ?? ''; // 處理 $h1Content,例如儲存到資料庫或進行其他操作 echo "收到的 H1 內容: " . htmlspecialchars($h1Content); } ?>
如果 HTML 文件是靜態的,可以使用 PHP 來讀取該文件並解析它:
<?php $htmlContent = file_get_contents('path/to/your/file.html'); preg_match('/<h1>(.*?)<\/h1>/', $htmlContent, $matches); $h1Content = $matches[1] ?? ''; // 處理 $h1Content echo "H1 內容: " . htmlspecialchars($h1Content); ?>
最常見的方式是使用 JavaScript 在客戶端獲取內容,然後透過 AJAX 將其發送給 PHP 進行處理。伺服器端解析通常用於靜態內容,不建議用於動態生成的頁面。
檢查伺服器日誌是辨識搜尋引擎機器人的一個重要方法。以下是一些搜尋引擎機器人的User-Agent範例:
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
檢查網站的 robots.txt
文件,可以了解哪些搜尋引擎機器人被允許或禁止訪問網站的某些部分。例如:
User-agent: *
Disallow: /private/
搜尋引擎機器人的IP地址通常來自特定範圍。你可以比對訪問者的IP地址是否屬於這些範圍。例如:
可使用工具來驗證訪問者的IP是否真的來自搜尋引擎。
以下是如何在伺服器端使用PHP進行User-Agent檢查的範例:
<?php
$userAgent = $_SERVER['HTTP_USER_AGENT'];
if (strpos($userAgent, 'Googlebot') !== false) {
echo "這是Googlebot的流量";
} else {
echo "這不是搜尋引擎機器人的流量";
}
?>
使用Google Analytics或其他網站分析工具,可以幫助追蹤流量來源。這些工具通常會自動過濾大部分的機器人流量。
URL 的 Hash 值是指位於 URL 中「#」符號後面的部分,又稱為片段識別符(Fragment Identifier)。它通常用於標識頁面內的某個位置或狀態。
以下是一些常見的 URL Hash 範例:
https://example.com/page#section1
https://example.com/app#/dashboard
https://example.com/search#filter=active
id
。<script> // 獲取 URL 的 Hash 值 const hashValue = window.location.hash.substring(1); // 顯示 Hash 值 console.log("Hash 值是:", hashValue); </script>
<?php // 模擬 URL $url = "http://example.com/page#section2"; // 使用 parse_url 解析 Hash 值 $parsedUrl = parse_url($url); $hash = isset($parsedUrl['fragment']) ? $parsedUrl['fragment'] : null; // 輸出 Hash 值 if ($hash) { echo "Hash 值是: " . htmlspecialchars($hash, ENT_QUOTES, 'UTF-8'); } else { echo "URL 中沒有 Hash 部分。"; } ?>
window.location.hash
。name
屬性雖然較少使用,但可以將 name
屬性加入一個 <a>
標籤,並將其放在目標標籤前。
<a name="specific-heading1"></a> <h3>目標標題1</h3> <a href="#specific-heading1">連結到特定標題</a>
效果:
data-attribute
配合 JavaScript透過設定自訂屬性,例如 data-anchor
,並使用 JavaScript 處理跳轉行為。
<h3 data-anchor="heading-1">目標標題3</h3> <a href="#" onclick="jumpToHeading('heading-1')">連結到特定標題</a> <script> function jumpToHeading(anchor) { const target = document.querySelector(`[data-anchor="${anchor}"]`); if (target) { target.scrollIntoView({ behavior: 'smooth' }); } } </script>
效果:
h2
的文字內容配合 JavaScript透過查找 h2
的文字內容來定位,使用 JavaScript 動態定位到目標。
<h3>目標標題5</h3> <a href="#" onclick="jumpToText('目標標題')">連結到特定標題</a> <script> function jumpToText(text) { const target = Array.from(document.querySelectorAll('h2')).find(el => el.textContent === text); if (target) { target.scrollIntoView({ behavior: 'smooth' }); } } </script>
效果:
cURL 是 PHP 中用來發送 HTTP 請求的函式庫,支援 GET、POST、PUT、DELETE 等方法,常用於 API 資料存取。
curl_init()
curl_setopt()
curl_exec()
curl_close()
<?php
$url = "https://api.example.com/data";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
<?php
$url = "https://api.example.com/post";
$data = ['name' => '測試', 'email' => '[email protected]'];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
<?php
$url = "https://api.example.com/json";
$data = json_encode(['id' => 123]);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen($data)
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
CURLOPT_URL
:設定目標網址CURLOPT_RETURNTRANSFER
:是否回傳結果(不直接輸出)CURLOPT_POSTFIELDS
:送出的資料CURLOPT_HTTPHEADER
:自訂 HTTP 標頭<?php
if(curl_errno($ch)) {
echo '錯誤:' . curl_error($ch);
}
?>
Java Applet 是一種以 Java 語言編寫的小型應用程式,可透過網頁瀏覽器執行,並嵌入至 HTML 頁面中。它最早於 1990 年代被廣泛應用於製作互動式網頁,例如動畫、遊戲及圖表視覺化。
Applet 必須在支援 Java Plugin 的瀏覽器上執行,透過 <applet>
或 <object>
標籤嵌入於 HTML 中,由使用者端 JVM(Java Virtual Machine)負責載入與執行。
由於 Applet 可在用戶端執行,因此為了防止惡意行為,執行環境採取了「沙盒機制」進行安全隔離,例如禁止存取本機檔案系統或執行外部程式。
Oracle 自 Java 9 起即宣佈移除 Applet API,並在 Java 11 完全廢止 Applet。Java Web Start(另一種桌面執行技術)也一併終止維護。
Java Applet 已進入淘汰階段,現代網頁開發趨勢傾向使用 HTML5、JavaScript 與 WebAssembly 等開放標準技術。開發者應避免再使用 Applet,並將現有應用程式轉移至現代技術平台。
以下是顯示一個簡單訊息的 Java Applet 範例:
<!DOCTYPE html> <html lang="zh-Hant"> <head> <meta charset="UTF-8"> <title>Java Applet 範例</title> </head> <body> <h1>Java Applet 示例</h1> <applet code="HelloWorldApplet.class" width="300" height="300> <param name="message" value="你好,世界!"> 您的瀏覽器不支持 Java Applet。 </applet> </body> </html>
import java.applet.Applet; import java.awt.Graphics; public class HelloWorldApplet extends Applet { String message; public void init() { message = getParameter("message"); } public void paint(Graphics g) { g.drawString(message, 20, 20); } }
1. 將 Java 代碼保存為 HelloWorldApplet.java
,並在命令行中執行 javac HelloWorldApplet.java
來編譯。
2. 確保生成的 .class
文件與 HTML 文件在同一個目錄下。
3. 使用支持 Java Applet 的環境來執行 HTML 文件。
由於大多數現代瀏覽器不再支持 Java Applet,建議考慮使用其他技術(如 JavaFX 或網頁應用程式)來實現類似的功能。
email: [email protected]