将文本替换为带有 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 扩展的链接 的相关文章

  • 主干关系事件未触发?

    class TheModel extends Backbone RelationalModel relations type Backbone HasMany key subModels relatedModel SubModel coll
  • 是否可以禁用特定 jQuery Ajax 调用的 Turbolinks 以防止页面刷新和滚动?

    我有一个 Rails 5 应用程序 非常想使用 Turbolinks 在应用程序中 有几个 PATCH ajax 调用 它们只是用新数据更新服务器 但不需要担心更新页面的状态 每当这些 ajax 请求返回时 Turbolinks 就会刷新页
  • 使用selenium IDE提取部分文本并将其放入变量中

    有人可以告诉我应该使用哪个命令来使用 Selenium Ide 从文本中仅提取数字 694575 并将其放入变量中以供进一步使用 这是带有文本的 div div class loginBoxTitle Edit Exhibition Cen
  • 如何使用键盘和鼠标控制相机 - Three.js

    我在 WEB GL 中有一个带有 Three js 的 3D 环境 并且我曾经使用 Orbitcontrols js http codepen io nireno pen cAoGI http codepen io nireno pen c
  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 从 x,y 屏幕空间坐标查找 2D 等距网格上的列、行(将方程转换为函数)

    我试图在屏幕空间点 x y 的二维等距网格中找到行 列 现在我几乎知道我需要做什么 即找到上图中红色向量的长度 然后将其与表示网格边界的向量的长度 由黑色向量表示 进行比较 现在我在数学堆栈交换中寻求帮助 以获得用于计算点 x y 与黑色边
  • 如何通过 HTML 按钮播放声音

    我目前通过网站播放音乐的方法是通过 HTML 音频标签 不过我希望能够通过 HTML 按钮来播放它 该按钮应该能够在播放和停止之间切换音乐 我在 JSFiddle 创建了一个示例 但不知道如何实现它 有人可以告诉我如何使用我的 JSFidd
  • JavaScript 动画平滑滚动

    默认情况下 当您有这样的片段链接时 a href some url some fragment some text a 浏览器立即向下滚动到该片段 我该如何编程才能使用标准 JS 顺利地向下移动到该片段 这是一个例子 Example htt
  • 使react-leaflet能够离线使用

    我一直在使用反应传单 https github com PaulLeCam react leaflet图书馆 到目前为止运作良好 现在我希望网站预加载尽可能多的图块 以便网络应用程序 也是 PWA 可以在没有互联网的情况下使用 我找到了一些
  • HTML colorpicker 发生变化时如何获取新值?

    我正在开发一个需要更改 HTML 颜色的网络应用程序canvas基于的价值观colorpicker 我有一个colorpicker在我需要获取的 HTML 中value从每次更新开始
  • 用数组反向查找对象

    假设我有一个这样的对象 resourceMap a 0 1 2 3 4 5 6 7 8 9 10 b 11 12 c 21 23 d 54 55 56 57 510 确定是否的最佳方法是什么resourceId 21将会 c 我们不知道钥匙
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • Keycloak javascript 适配器 `keycloak.init` 加载 404 iframe

    我正在尝试使用 javascript 适配器将 Keycloak 集成到我的客户端应用程序keycloak js 但是 我似乎无法让它发挥作用 这是我的代码 const keycloak new Keycloak realm my real
  • window.showModalDialog 的等效跨浏览器解决方案是什么?

    window showModalDialog 的等效跨浏览器解决方案有哪些 showModalDialog 在 IE 和 FF 3 中引入 我个人认为没有 但是有很多 UI 工具包提供了这样的功能 例如jQuery UI http jque
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e
  • 当选择下拉列表中的某些值时,取消选中复选框

    当我从下拉列表中选择某个值或用户未从下拉列表中选择任何值时 我需要取消选中复选框 我现在正在使用 Jquery 这是我现在使用的代码 但它不起作用 Script
  • 如何在 SVG 元素上使用箭头标记?

    我需要在 d3 js 中创建一个箭头 但我找到的只是带有节点图的示例 我需要的是简单地制作一个从 A 点到 B 点的箭头 我尝试实现以下示例中的部分代码 http bl ocks org 1153292 http bl ocks org 1
  • Bootstrap 3 / 显示模式不适用于 javascript 方式

    我用Modal http getbootstrap com javascript modalsBootstrap 3 0 的功能 我有这个代码 a href myNestedContent Open the modal containing
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o

随机推荐

  • 在 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