在網頁直接顯示 user@example.com 會被垃圾郵件機器人爬取。常見防禦手段包括:
將每個字元轉換為 &#ASCII碼; 格式。瀏覽器渲染時會自動解析為可讀文字,但原始碼中無明文 Email。
function encodeEmailToEntities(email) {
let encoded = '';
for (let i = 0; i < email.length; i++) {
encoded += '' + email.charCodeAt(i) + ';';
}
return encoded;
}
// 範例
const raw = 'davidz94@yahoo.com';
const encoded = encodeEmailToEntities(raw);
// 輸出: davidz94@yahoo.com
// 瀏覽器顯示: davidz94@yahoo.com
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Email 加密工具</title>
</head>
<body>
<h2>Email 地址實體編碼加密</h2>
<label>原始 Email: <input type="email" id="rawEmail" value="test@example.com" /></label>
<button id="btnEncode">加密為實體編碼</button>
<button id="btnCopy">複製加密結果</button>
<button id="btnPreview">預覽渲染效果</button>
<h3>加密結果 (可直接貼入 HTML):</h3>
<textarea id="encodedResult" rows="3" cols="60" readonly></textarea>
<h3>瀏覽器渲染預覽:</h3>
<div id="previewArea" style="border:1px solid #ccc; padding:10px; min-height:2em;"></div>
<script>
const $ = id => document.getElementById(id);
// 核心加密函式
function encodeEmail(str) {
return [...str].map(ch => '' + ch.charCodeAt(0) + ';').join('');
}
$('btnEncode').onclick = () => {
$('encodedResult').value = encodeEmail($('rawEmail').value);
};
$('btnPreview').onclick = () => {
$('previewArea').innerHTML = encodeEmail($('rawEmail').value);
};
// 跨瀏覽器複製到剪貼板
$('btnCopy').onclick = async () => {
const text = $('encodedResult').value;
if (!text) return alert('請先加密');
try {
await navigator.clipboard.writeText(text);
alert('已複製到剪貼板!');
} catch (err) {
// 降級方案:舊瀏覽器
const ta = document.createElement('textarea');
ta.value = text; document.body.appendChild(ta);
ta.select(); document.execCommand('copy');
document.body.removeChild(ta);
alert('已複製 (降級模式)');
}
};
</script>
</body>
</html>
原文包含一段極其複雜的 setClipboardNetscape 函式,利用 Base64 編碼內容嵌入 data URI 的 <iframe>,再透過 Flash (application/x-shockwave-flash) 呼叫 System.setClipboard 實現複製。
navigator.clipboard API (HTTPS 環境下),IE 可用 document.execCommand('copy') 降級。| 指標 | 實體編碼方案 |
|---|---|
| 爬蟲防禦 | 中等 (進階爬蟲可解碼) |
| 瀏覽器渲染 | 原生支援,零延遲 |
| 螢幕閱讀器 | 友善,可正常朗讀 |
| SEO 影響 | 無負面影響 |
| 維護成本 | 極低,純前端函式 |
<span style="display:none">.</span> 干擾字元,再用 CSS 隱藏。document.write('user' + '@' + 'domain.com') 或 DOM 操作插入。