Chrome扩展程序,通过正文中的关键字进行链接

时间:2012-07-27 22:54:45

标签: javascript google-chrome-extension

为了让您了解我的知识基础,我是一名计算机工程专业的学生,​​我现在正在一家医疗公司工作。我几乎没有(几乎没有网络代码经验),但这主要是我的工作要求我这样做,所以我一直试图尽可能快地解决这个问题。 我在学校使用了很多C,Verilog和C ++,所以计算机“语言”并不新鲜,但我很难搞清楚这些东西。

无论如何,我的第一个任务是为Chrome建立一个链接到我们的Asterix手机服务器的扩展程序。所有要做的就是在网页上找到电话号码并将其转换为超链接,超链接将基于点击的电话号码,该部分是微不足道的。

所以,我在HTML,JS,Ajax,Jquery,DOM等上阅读了W3 Schools的内容。所以在过去的3天里我学到了很多东西=)

这就是我制作的:

在我的情况下,似乎我不需要“backround.html”,因为我需要做的就是在页面加载后运行一个JS文件来查找phonenumbers并将它们转换为链接。

所以我编写了一个清单文件和一个JS文件来搜索正文中的数字并在其周围添加标记(目前转到www.google.com)

好消息是它似乎有效。

坏消息是,Gmail会在加载时冻结,并使Hotmail无法连接,无法更新和查看新消息。

在进行扩展时,我认为你甚至无法以这种方式“破坏”网站。

我的所有代码都很小,所以我只想在这里发布。

的manifest.json

   {
  "name": "Typenex Hyperlink-Dialer",

  "version": "1.0",
  "description": "This is a custom built extension for Typenex. This extension identifies phone numbers and allows the user to click the number to initiate a phonecall.",
  "permissions": [
    "tabs", "http://*/*", "https://*/*"
  ],

  "browser_action": {
      "default_title": "Typenex Hyperlink-Dialer",

      "default_icon": "typenex_logo.png"
  },

  "content_scripts" : [
    {
      "matches" : ["http://*/*", "https://*/*"],
      "js" : ["typenex_contentscript.js"],
      "run_at" : "document_idle",
      "all_frames" : false
    }
  ],

  "manifest_version": 2
}

typenex_contentscript.js

var arrayOfNumbers = [];
alert("hi");
var regex =  /\d*[/-]*[0-9][0-9][0-9][/ -]*[0-9][0-9][0-9][/ -]*[0-9][0-9][0-9][0-9][ ]*/g;
newBody = document.body.innerHTML;
var i = 0;
do
{
    temp = regex.exec(newBody);
    if (temp != null)
        arrayOfNumbers[i] = temp;
    i++
}
while (temp)
for (var i = 0; i < arrayOfNumbers.length; i++)
{
    newBody = newBody.replace(arrayOfNumbers[i], "<a href='http://www.google.com'>" + arrayOfNumbers[i] + "</a>");
}
document.body.innerHTML = newBody;

我很感激能得到的任何帮助,如果我觉得我误解了什么,你知道我能读到的东西可以帮助那会很棒,我已经谷歌了很多但我可能不太了解甚至要问正确的问题。

如果你们中有人有更好的方法来处理这个简单的扩展,我是非常开放的态度=)

1 个答案:

答案 0 :(得分:2)

我想知道几次获取文本节点的最佳方法,并且想看看TreeWalking,所以我这次做了。以下是我制作的测试页面,我不能说这是否是最佳方式,但可以满足您的需求。

treewalker.html

<html>
  <head>
    <style>
    </style>
    <script src="treewalker.js"></script>
  </head>
  <body>
    <div>This is a div</div>
    <div><div id='testevent'>Test event</div>This is a div 000-000-0000</div>
    <div>This is a div 000-000-0000</div>
     <div>This is<a href='sf'>bleh 000-000-0000 a div</a></div>
  </body>
</html>

treewalker.js

function onLoad() {

  document.querySelector('#testevent').onclick = function() {
    alert('clicked')
  };

  // Here starts the bit for your content script
  var re = /(\d*[/-]*[0-9][0-9][0-9][/ -]*[0-9][0-9][0-9][/ -]*[0-9][0-9][0-9][0-9][ ]*)/g;
  var regs;

  var walker = document.createTreeWalker(
  document.body, NodeFilter.SHOW_TEXT, function(node) {
    if((regs = re.exec(node.textContent))) {
      // make sure the text nodes parent doesnt have an attribute we add to know its allready been highlighted
      if(!node.parentNode.classList.contains('highlighted_text')) {
        var match = document.createElement('A');
        match.appendChild(document.createTextNode(regs[0]));
        match.href = 'http://www.google.com';

        // add an attribute so we know this element is one we added
        // Im using a class so you can target it with css easily
        match.classList.add('highlighted_text');

        var after = node.splitText(regs.index);
        after.nodeValue = after.nodeValue.substring(regs[0].length);
        node.parentNode.insertBefore(match, after);
      }
    }
    return NodeFilter.FILTER_SKIP;
  }, false);

  // Make the walker step through the nodes
  walker.nextNode();

  // and it ends here
}

(function() {
  document.addEventListener("DOMContentLoaded", onLoad);
})();

代码被盗

http://paul.kinlan.me/dom-treewalker/
多数民众赞成在那里我得到了树木行者代码。他的示例问题是它使用innerHTML在父级上包装匹配(许多示例都这样做),这会在测试页面中杀死事件。

http://www.the-art-of-web.com/javascript/search-highlight/
显示了如何正确拆分文本节点。而且据我所知,这是一种更好的方法,但我对TreeWalker方式很感兴趣。

修改
我刚刚更新了它,因为如果你在这个新版本的html上运行旧版本(点击下面的编辑链接看到它)失败了。由于某种原因,我真的不明白它不会包装第二个数字。这个新版本不像我看到的所有示例那样工作,并且似乎是使用TreeWalker的滥用方式......但它有效!