如何在实时网页中用mailto链接替换电子邮件地址
How to replace email addresses with mailto links in a live web page?
想象一下:你看到一个网页上写着"只需向user@example.com"但要真正发送电子邮件,你需要突出显示地址,然后将其剪切并粘贴到你选择的电子邮件客户端的新撰写窗口的收件人字段中
显然,如果它只是一个mailto:链接,生活会更轻松,这样你就可以点击它并自动创建一条新消息。如何构建一个扩展,将电子邮件地址转换为可点击的mailto:链接?
我本来想问是否有一个扩展可以为未链接的推特@用户名提及启用类似的功能,但我认为这个电子邮件地址问题会更简单。
使用-否,这会打断页面,尤其是因为事件侦听器已删除,属性也已替换。innerHTML
替换电子邮件
递归循环通过所有节点:
- 按相反的顺序循环,以防止在修改DOM时发生冲突
- 对于每个项目,检查其
nodeType
值。- 如果是
.nodeType === 1
(元素),则再次调用该函数(递归) - 如果
.nodeType === 3
(文本节点):- 使用正则表达式和
exec
方法查找一个电子邮件地址。使用结果的.index
属性可以知道电子邮件地址的起始位置,使用result[0].length
属性可以知道地址的长度 - 使用节点的
splitText
方法将文本节点剪切为三部分 - 创建一个
<a>
元素 - 将电子邮件的文本节点(上一个文本节点的第二个文本节点)附加到此锚点。它会自动从文档中删除
- 在第三个节点之前插入此链接
- 使用正则表达式和
- 如果是
Demo
不是chrome扩展,但它显示了chrome扩展的行为:http://jsfiddle.net/ckw89/
Chrome扩展
(regexp基于MongoEngine的EmailField
模式):
script.js
// Initiate recursion
wrapLink(document.body);
function wrapLink(elem) { // elem must be an element node
var nodes = elem.childNodes
, i = nodes.length
, regexp = /([-!'x23$%&'*+'/=?^_`{}|~0-9A-Z]+('.[-!'x23$%&'*+'/=?^_`{}|~0-9A-Z]+)*|^"(['x01-'x08'x0b'x0c'x0e-'x1f!'x23-''['']-'x7f]|''['x01-011'x0b'x0c'x0e-'x7f])*")@(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?'.)+[A-Z]{2,6}/i
, node, emailNode, a, result;
while (node = nodes[--i]) {
if (node.nodeType === 1) {
// Skip anchor tags, nested anchors make no sense
if (node.nodeName.toUpperCase() !== 'A')
wrapLink(node);
} else if (node.nodeType === 3) {
// 1: Please note that the regexp has NO global flag,
// and that `node.textContent` shrinks when an address is found
while (result = regexp.exec(node.textContent)) {
// 2: Contact <SPLIT> me@example.com for details
node = node.splitText(result.index);
// 2: Contact <SPLIT>me@example.com<SPLIT> for details
node = node.splitText(result[0].length);
// me@example.com
emailNode = node.previousSibling
// 3. Create link
a = document.createElement('a');
a.href = 'mailto:' + result[0];
// 4: Append emailNode
a.appendChild(emailNode);
// 5: Insert before
elem.insertBefore(a, node);
}
}
}
}
此脚本在用作Content脚本时将立即工作,因为它与页面的唯一交互是DOM。为了完整起见,以下是manifest.json
文件的内容:
{
"name": "Turns email addresses in `mailto:`s",
"version": "1",
"version_version": 2,
"content_scripts": [{
"matches": ["*://*/*"],
"js": ["script.js"]
}]
}
履约通知
当前脚本将替换活动文档中的所有节点。在操作之前,请考虑将根节点(例如<body>
)移动到文档片段。
相关文章:
- 正在尝试将标题标记添加到mailto链接,正文中包含URL
- 如何在实时网页中用mailto链接替换电子邮件地址
- facebook墙上的MailTo链接(phonegap)
- 使用Mailto链接,如果可能的话,我可以在Outlook邮件正文中添加当前页面吗?在 asp.net
- CF-Hash属性和脚本神秘地添加到mailto链接中
- 我的 mailto 链接中的换行符在 Android 手机上已损坏
- "+"登录JS mailto链接(Android和Chrome)
- 可以't在mailto链接后关闭引导模式
- Gmail签名不适用于mailto链接
- jQuery数组填充mailto链接添加逗号
- 基于多个复选框选择,“mailto:”链接使用javascript更改为“mailto: Multiple variab
- 在Javascript中使用href=mailto链接图像
- 如何在Joomla的WYSIWYG编辑器中的mailto链接中包含&号?
- encodeuriccomponent,同时构造mailto链接
- 检测基于web的邮件客户端与本地邮件客户端的mailto链接
- 为什么用转义字符的mailto链接不被雅虎邮箱识别?
- iOS设备上的mailto链接保持URL编码
- 如何在firefox的新选项卡中打开mailto链接
- 逃跑&用于在邮件客户端中显示(mailto链接)
- lotusnotes-mailto链接问题