扩展插件添加html标签,Chrome扩展程序:插入javascript标记并调用函数

我有一个chrome扩展,它使用内容脚本来动态插入引用an external javascript file的脚本标记.我使用的代码是:

var html_doc = document.getElementsByTagName('head')[0];

var _js = document.createElement('script');

_js.setAttribute('type', 'text/javascript');

_js.setAttribute('id', 'chr_js');

_js.setAttribute('src', 'http://unixpapa.com/js/dyna1.js');

if(!document.getElementById('chr_js'))

html_doc.appendChild(_js);

外部Javascript包含以下代码:

function lfunc(){

alert('RUNNING loaded function');

}

alert('LAST LINE of script');

当我在选项卡中加载页面时,会出现“最后一行脚本”消息,显示脚本标记已正确插入DOM中.

我的扩展程序还有一个按钮(即browser_action).现在,我希望这个按钮在单击时调用上面定义的lfunc().不幸的是,我的代码根本不起作用.

我在background.html页面中使用以下代码来处理我的按钮的onClick事件:

chrome.browserAction.onClicked.addListener(function(tab) {

chrome.tabs.executeScript(null,

{code: "try {lfunc()} catch (e) {alert(e);}"});

}); // it should call lfunc()

manifest.json文件中的权限是:

"permissions": [

"tabs", "http://*/*", "https://*/*" ]

我没有收到“RUNNING loaded function”消息,而是收到错误消息“ReferenceError:lfunc not defined”.

我究竟做错了什么?

解决方法:

您可以执行外部JS文件(通过将其注入DOM(扩展中的文档)).外部JS文件也可以访问本地DOM.

这两者之间的沟通是不可能的:

>扩展程序无法访问用户添加的Javascript(非原生):

扩展的JS无法访问页面的jQuery对象,但它可以访问其document.body.

>用户添加的Javascript(页面的JS或您添加的外部JS)无权访问扩展:

在该页面中,您无法访问chrome API,例如书签,标签,浏览器操作等.

出于安全原因,这是非常有意义的.

我所说的(sendRequest和onRequest)是“内容脚本”和扩展脚本/背景页面之间的通信.在你的情况下无关紧要=)抱歉.

答案

> I cannot call specific functions within the external JS file from the extension because of the lack of communication capabilities between the two

那就对了.

> All I can do is make my extension inject the external JS file into the DOM. This will execute whatever is there to be executed in the external JS file

那就对了. ext JS可以包含立即动作和定时器等,就像正常加载的JS(在网页本身中)一样.

> The code launching granularity from the extension is at external JS level, not at JS function level

JS功能级别是什么意思?扩展JS?

PS

chrome.tabs.executeScript并不像你想象的那么酷.基本上它的作用是在页面的上下文中执行脚本(如content_scripts).但是,它与content_scripts具有相同的限制:它可以访问DOM和本机JS功能,而不是用户添加JS.一个例子:

// Inside a `background_page`:

chrome.tabs.executeScript(null, {

"code": "document.body.removeChild(document.body.firstChild);"

});

这是有效的,因为只需要访问页面(总是存在的)DOM.以下将不起作用(假设jQuery包含在网页本身):

// Still inside a `background_page`:

chrome.tabs.executeScript(null, {

"code": "jQuery('input').remove();"

});

这是行不通的,因为jQuery是一个外部的,非本地的,用户添加的JS对象,扩展名无法访问(background_page和content_scripts).

我真的不明白这个最后限制的原因,但它完全是关于Chrome中的沙盒和安全性=)我认为这是一件好事……

BTW

我认为你的问题的解决方案非常简单……你可以让browser_action将外部JS注入到页面的DOM中.那就够了吧?外部JS包含逻辑AND实际函数调用.更好的解决方案,因为外部JS仅在按下/触发browser_action(按钮)时加载.一个非常小的缺点:非常短的延迟(=在推动browser_action后下载外部JS).

我可能会再次建议:将所有扩展JS放入扩展中.这将允许脱机功能,并且永远不需要(另一方)连接到第三方服务器.

标签:javascript,function,google-chrome,background

来源: https://codeday.me/bug/20190716/1482934.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个使用 JavaScriptChrome 扩展插件中复制文本到剪切板的示例代码: ```javascript document.addEventListener('copy', function(e) { e.clipboardData.setData('text/plain', '复制的文本'); e.preventDefault(); }); document.execCommand('copy'); alert('已复制到剪切板'); ``` 注意,这个代码必须在 content_script 中才能运行。 这是一个基本的示例,实际开发中可能需要根据需求进行修改。 ### 回答2: 在使用Chrome浏览器进行扩展插件开发时,复制内容到剪切板是一项常见需求,并且可以通过简单的代码来实现。 首先,我们需要在扩展插件的清单文件(manifest.json)中添加"clipboardWrite"权限,以获取对剪切板的写入权限。 接下来,在插件JavaScript文件中,可以使用"document.execCommand('copy')"方法来将指定的内容复制到剪切板。以下是一个示例代码: ```javascript // 获取要复制的内容 var content = "要复制的内容"; // 创建含有要复制内容的临时textarea元素 var tempInput = document.createElement("textarea"); tempInput.style = "position: absolute; left: -9999px; top: -9999px"; tempInput.value = content; document.body.appendChild(tempInput); // 选中临时textarea中的内容 tempInput.select(); tempInput.setSelectionRange(0, tempInput.value.length); // 将内容复制到剪切板 document.execCommand('copy'); // 移除临时textarea元素 document.body.removeChild(tempInput); ``` 以上代码首先创建了一个临时的textarea元素,并将要复制的内容赋值给它。然后,通过select()和setSelectionRange()方法选中了文本内容,最后调用document.execCommand('copy')方法将文本内容复制到剪切板中。最后,再从DOM中移除临时的textarea元素。 值得注意的是,Chrome浏览器要求上述代码必须在事件回调函数中执行,否则将被浏览器禁止。因此,在实际的插件开发中,可以将以上代码封装成一个函数,通过事件触发调用,以实现复制内容到剪切板的功能。 ### 回答3: Chrome扩展插件开发提供了很多强大的功能,其中之一就是复制内容到剪切板。下面是一个示例,使用300字进行详细说明: 要开发一个Chrome扩展插件,实现复制内容到剪切板的功能,首先需要在插件的manifest文件中声明相应的权限,具体来说就是添加"clipboardWrite"权限。接着,在扩展插件的主文件中,可以使用chrome.alarms.onAlarm.addListener方法创建一个定时器,当触发定时器时,执行相应的操作。 在示例中,我将使用一个简单的按钮来触发复制操作。首先,在插件的popup.html文件中添加一个按钮元素,设置其id为"copyBtn",并给其添加一个点击事件的监听器。在插件的popup.js文件中,通过getElementById方法获取到该按钮元素,并给其添加点击事件的监听器。在点击事件的处理函数中,使用chrome.tabs.executeScript方法注入一个自定义的JS脚本,这个脚本将复制指定内容到剪切板。具体来说,可以使用document.execCommand方法执行"copy"命令,将指定文本复制到剪切板中。 在自定义的JS脚本中,首先创建一个textarea元素,并设置其value属性为要复制的内容。接着,将该textarea元素添加到当前页面的body中,使用select方法选中textarea中的文本,并执行document.execCommand("copy")命令,完成复制操作。最后,将添加的textarea元素从页面中移除。 通过以上的步骤,在点击按钮时,就可以将指定内容复制到剪切板中了。当然,为了保证正常使用,还需要在manifest文件中声明相应的permissions,包括"clipboardWrite"权限和"activeTab"权限。 这就是一个简单的示例,用于说明如何开发一个Chrome扩展插件来实现复制内容到剪切板的功能。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值