将文本替换为带有 chrome 扩展的链接

2024-04-15

我正在尝试用链接替换网页上的文本。当我尝试这样做时,它只是用标签替换文本,而不是链接。例如,此代码将用以下内容替换“河流”:

<a href="http://www.cnn.com">asdf</a>

这是我到目前为止所拥有的:

function handleText(textNode)
{
    var v = textNode.nodeValue;
    v = v.replace(/\briver\b/g, '<a href="http://www.cnn.com">asdf</a>');
    textNode.nodeValue = v;
}

如果您只想将文本更改为其他纯文本,那么您可以直接更改文本节点的内容。但是,您想要添加一个<a>元素。对于每个<a>您想要添加的元素,实际上就是想添加一个子元素。文本节点不能有子节点。因此,要做到这一点,您实际上必须用更复杂的结构替换文本节点。这样做时,您将希望对 DOM 产生尽可能小的影响,以免干扰依赖于 DOM 当前结构的其他脚本。影响不大的最简单方法是将文本节点替换为<span>其中包含新的文本节点(文本将围绕新的文本节点分割)<a>)和任何新的<a>元素。

下面的代码应该可以满足您的要求。它取代了textNode with a <span>包含新的文本节点和创建的<a>元素。仅当一个或多个时才进行替换<a>需要插入元素。

function handleTextNode(textNode) {
    if(textNode.nodeName !== '#text'
        || textNode.parentNode.nodeName === 'SCRIPT' 
        || textNode.parentNode.nodeName === 'STYLE'
    ) {
        //Don't do anything except on text nodes, which are not children 
        //  of <script> or <style>.
        return;
    }
    let origText = textNode.textContent;
    let newHtml=origText.replace(/\briver\b/g,'<a href="http://www.cnn.com">asdf</a>');
    //Only change the DOM if we actually made a replacement in the text.
    //Compare the strings, as it should be faster than a second RegExp operation and
    //  lets us use the RegExp in only one place for maintainability.
    if( newHtml !== origText) {
        let newSpan = document.createElement('span');
        newSpan.innerHTML = newHtml;
        textNode.parentNode.replaceChild(newSpan,textNode);
    }
}

//Testing: Walk the DOM of the <body> handling all non-empty text nodes
function processDocument() {
    //Create the TreeWalker
    let treeWalker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT,{
        acceptNode: function(node) { 
            if(node.textContent.length === 0) {
                //Alternately, could filter out the <script> and <style> text nodes here.
                return NodeFilter.FILTER_SKIP; //Skip empty text nodes
            } //else
            return NodeFilter.FILTER_ACCEPT;
        }
    }, false );
    //Make a list of the text nodes prior to modifying the DOM. Once the DOM is 
    //  modified the TreeWalker will become invalid (i.e. the TreeWalker will stop
    //  traversing the DOM after the first modification).
    let nodeList=[];
    while(treeWalker.nextNode()){
        nodeList.push(treeWalker.currentNode);
    }
    //Iterate over all text nodes, calling handleTextNode on each node in the list.
    nodeList.forEach(function(el){
        handleTextNode(el);
    });
} 
document.getElementById('clickTo').addEventListener('click',processDocument,false);
<input type="button" id="clickTo" value="Click to process"/>
<div id="testDiv">This text should change to a link -->river<--.</div>

The TreeWalker code was taken from my answer here https://stackoverflow.com/a/37566073/3773011.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将文本替换为带有 chrome 扩展的链接 的相关文章

  • 需要帮助从数组中为国家/地区着色,保留其余默认颜色

    我需要一些帮助从我创建的数组中获取数据 然后仅对数组中存在的国家 地区进行着色 而不在数组中的其余国家 地区我希望保留为默认颜色 我正在使用 D3 来完成所有这些工作 并且我非常确定我可以通过 D3 实现我需要的目标 但不确定如何实现 我想
  • 单击上一页的按钮路由到该页面后如何刷新页面

    我有 2 个页面 一个主页和一个页面 2 当我单击主页上的按钮时 它会路由到 page2 现在 单击主页上的按钮后 当我到达第 2 页时 它应该刷新 因为我的项目中存在一些缓存问题 我在ngoninit上添加了window location
  • 如果替换路径中的最后一个元素,React Router v6 useNavigate() 不会导航

    我有一个具有以下功能的反应组件 const handleNavigate clientId gt console log clientId navigate dashboard clients clientId console log 显示
  • 如何使用 JavaScript 将当前页面设置为 about:blank?

    我遇到的情况是服务器可能在当前地址上不可用 因此我想检测到这一点并将页面重定向到 about blank 页面 我该如何使用 JavaScript 来做到这一点 window location href about blank
  • 如何修复网站 iframe 错误?

    当我访问此网址时 警告 推荐使用一些广告拦截器 网页链接加载良好 没有错误 但是 当我尝试通过加载同一页面时iframe在我的html代码中 出现错误 我的html代码
  • 如何在 JS Rails 响应中包含 HTML?

    我有一个响应 HTML 和 JS AJAX 查询的 FooController app controllers foo controller rb class FooController lt ApplicationController l
  • 在每页上插入折叠标记 (wkhtmltopdf)

    我正在使用 wkhtmltopdf 0 12 2 1 创建发票等 我需要在 pdf 的每一页上显示折叠标记 如果内容大于一页 如何在每个页面上使用 javascript 重复它们 这是我的基本标记 div class marks div c
  • 通过 Javascript 将图像切割成碎片

    我正在创建一个简单的拼图游戏 为了做到这一点 我需要将我正在使用的图片切成 20 块 Javascript 有没有办法将一张图片切成 20 个相等的部分 并将它们保存为网页中的 20 个不同的对象 或者我只需要进入 Photoshop 自己
  • 默认情况下嵌入带字幕的 Youtube 不起作用

    我正在尝试嵌入 Youtube 电影 并希望默认情况下打开字幕 From https developers google com youtube player parameters cc load policy https develope
  • 使用 jquery 通配符检查 cookie 名称

    我有一个生成动态 cookie 的表单 例如 webform 62 1234356 62 1234356 可以是任意数字 我需要使用一些通配符检查来检查名称以 webform 开头的 cookie 是否存在 下面不起作用 if cookie
  • mouseover 和 mouseout 事件在子进程上触发

    代码 div div div div 如果我将鼠标悬停在Navigation the Drop Downdiv 向下滑动 如果我将鼠标移开 它会向上滑动 问题是如果我将鼠标悬停在孩子上Drop Downdiv它也向上滑 动 有谁知道我该如何
  • Angular 2 runOutsideAngular 仍然改变 UI

    从我的理解来看runOutsideAngular https angular io docs ts latest api core index NgZone class html runOutsideAngular anchor 如果我需要
  • 为什么 chrome.devtools.network “未定义”?

    我正在尝试创建一个记录所有网络事件的扩展 这是代码 清单 json name My extension version 1 0 background scripts background js persistent true devtool
  • 为什么 document.getelementbyId 在 Firefox 中不起作用?

    我不明白为什么 document getElementById 在 Firefox 中不起作用 document getElementById main style width 100 当我检查 Firebug 时 它说 类型错误 docu
  • 禁用 Chrome 扩展中的“检查弹出”菜单项

    我想禁用我正在开发的扩展中的 检查弹出窗口 菜单选项 我怎样才能做到这一点 我现在可以这样做 因为我安装了一些禁用此选项的扩展 例如 klip me 的 发送到 Kindle The 检查弹出窗口 http developer chrome
  • 为什么 JSON 结果可以是布尔值而不是对象或数组?

    From JSON 网站 http json org JSON 建立在两种结构之上 名称 值对的集合 在各种语言中 这被实现为对象 记录 结构 字典 哈希表 键控列表或关联数组 值的有序列表 在大多数语言中 这被实现为数组 向量 列表或序列
  • 如何按字母顺序排序并先小写排序

    如何获得以下排序的结果Food to Eat然后是 食物123 显然 第二个较低的 o 应该将 要吃的食物 带到排序后的第一个项目中 我很惊讶这个问题不容易通过谷歌找到答案 这个壮举没有包含在 javascript 标准中也让我感到惊讶 F
  • 更改javascript nodejs中所有页面的href url

    我已经实现了具有多种语言下拉菜单的引导导航栏 当我选择语言时 它将翻译页面 如何更改其他页面的 url 和按钮文本 当我选择french 将所有网址更改为 fr about and fr contact 如何使用 JavaScript 进行
  • 使用 javascript Array reduce() 方法有什么真正的好处吗?

    reduce 方法的大多数用例都可以使用 for 循环轻松重写 对 JSPerf 的测试表明 reduce 通常会慢 60 75 具体取决于每次迭代内执行的操作 除了能够以 函数式风格 编写代码之外 还有什么真正的理由使用reduce 吗
  • Nodejs 一个接一个地运行异步函数

    我是 JS nodejs 的新手 所以如果我不能提出切中要害的问题 请原谅我 所以基本上 如果我有两个异步函数 async function init async function main 如何确保在 init 完成其异步请求后调用 ma

随机推荐

  • 在 lucene 中搜索 UUID 不起作用

    我有一个 UUID 字段 以以下格式添加到我的文档中 372d325c e01b 432f 98bd bc4c949f15b8 但是 当我尝试通过 UUID 查询文档时 无论我如何尝试转义表达式 它都不会返回它们 例如 uuid 372d3
  • 何时使用 Soapobject 和 SoapPrimitive

    我一直在与ksoap2 lately 我仍然很困惑两者之间的确切区别是什么SoapObject and SoapPrimitive 以及何时使用它们 我猜它与字符串和数组有关 这是真的吗 我找到了一些链接 但感到困惑 谁能用最简单的英语形式
  • 在代理后面工作的 Azure 服务总线

    我通过 SDK 使用 Azure 服务总线 一切正常 但我遇到了我认为与代理相关的问题 当 IE 运行时 一切正常 但如果不运行 消息将无法发送 我正在代码中设置代理 但想知道我是否为服务总线 SDK 正确执行了此操作 WebProxy p
  • cpython 和 python 有什么区别[重复]

    这个问题在这里已经有答案了 我想知道 CPython 和 Python 之间的区别 因为我听说 Python 是用 C 开发的 那么 CPython 有什么用 Python 是一种语言 CPython http en wikipedia o
  • 为什么双向绑定有时在 Angular 中不使用点也能工作?

    考虑这个小提琴 Fiddle 1 http jsfiddle net martijngr Qvu5u 1 当您选择日期时 您会注意到上面的文本没有更新 这是因为我必须使用列表中的一个对象 如下所示 Fiddle 2 http jsfiddl
  • Anaconda 4.3,64 位(python 3.6),在 Windows“开始”菜单中留下不正确的截断路径

    在 Windows 上安装 anaconda 4 3 64 位 python 3 6 并选择 仅为当前用户安装 和 添加到路径 后 我注意到 anaconda 程序快捷方式在我的开始菜单上不起作用 它们在最后被切断 有谁知道正确的条目应该如
  • 多维 PyMC3 观察

    我的模型有一个 LogNormal RV C 形状为 W D W 中的每一行和 D 中的每一列都有一个正在拟合的参数 我试图将我的观察结果指定为 W D 矩阵 但是 这会导致 theano 编译错误 raise Exception Comp
  • CONNECT 请求未调用 Servlet service() 方法

    我正在尝试使用 Servlet 3 0 在 Jetty 中编写转发代理 我有一个简单的代码 public class testServlet extends HttpServlet Override protected void servi
  • 在表单提交之前发送 Ajax 请求

    是否可以在表单的 onsubmit 中发送 ajax 请求 我一直在尝试 结果不稳定 主要是因为如果浏览器发送我的请求的时间恰好比发送原始表单的时间长 那么一旦加载页面的位置发生变化 我的请求就会被丢弃 所以有时它甚至从未访问过服务器 基本
  • Python 中的反向 DNS 查找

    如果我有一个类似 2001 4860 4860 8888 的 IP 地址 如何获得 foo ip6 arpa 格式的完全限定域名 编辑 到目前为止 两个解决方案都给了我 google public dns a google com 也许反向
  • 使用 ASP.NET MVC ViewBag 和 DropDownList 时遇到困难

    我的难点是如何使用ViewBag with DropdownListFor 在我的控制器中我有 TestModel model new TestModel ViewBag Clients model Clients ViewBag Stat
  • 使用 gem 安装 Rails,加载命令时出错:安装未定义的方法 'invoke_with_build_args`

    我正在尝试在 Debian 上安装 Rails 当运行这个命令时 gem install rails 我给出了这个错误 ERROR Loading command install LoadError cannot load such fil
  • 如何使用 Retrofit 传递数组参数?

    我想要post数据如下 user id 14545646 list 4545645 4545645 4545645 4545645 我用了以下Retrofit method interface DeleteOrder FormUrlEnco
  • 多重继承:从 void * 转换为第二个基类后出现意外结果

    我的程序需要使用 void 来在动态调用情况下传输数据或对象 以便它可以引用任意类型的数据 甚至原始类型 然而 我最近发现 在具有多个基类的类的情况下 向下转换这些 void 的过程会失败 甚至在调用这些向下转换的指针上的方法后使我的程序崩
  • 如果 SELECT 语句没有结果,则使用 CASE 返回字符串

    如果我的 SELECT 语句没有结果 是否可以使用 CASE 返回某个字符串 例子 DECLARE accountnumber AS VARCHAR 10 SET accountnumber account number to search
  • 在 Watson Assistant 中保存用户输入(字符串)

    我正在构建一个基于 IBM Watson 的聊天机器人应用程序 我需要将用户输入保存到变量中 我在网上搜索 只找到输入必须是实体系统 数字 日期 时间 位置 人员 的教程 在我的对话框中 我询问用户他的标识符 该标识符应该是字母数字字符串
  • 在 OR 上下文中使用多个 Laravel 作用域

    我有一个订阅模型 其中包含start date and end date我的 Laravel 应用程序中的属性 我创建了两个查询范围 scopeActive 和scopeFuture 分别 来查找活动订阅和未来订阅 我想知道如何在 OR 上
  • 在Win7 64位上安装Qwt

    我在网上搜索但没有找到适合我的问题的解决方案 Problem Qwt 安装失败nmake step 我做了什么 安装了Qt 5 1 适用于 Windows 64 位的 Qt 5 1 1 VS 2012 525 MB 信息 来自qt 网站 h
  • 保存后从 Django 表单获取模型 ID

    view py someForm SomeForm request POST someForm customSave request user forms py class SomeForm ModelForm class Meta mod
  • 将文本替换为带有 chrome 扩展的链接

    我正在尝试用链接替换网页上的文本 当我尝试这样做时 它只是用标签替换文本 而不是链接 例如 此代码将用以下内容替换 河流 a href http www cnn com asdf a 这是我到目前为止所拥有的 function handle