相关疑难解决方法(0)

“未捕获的引用错误:未定义 getEventListeners”

我正在尝试删除监听器。在控制台中,下面的代码正在运行。当我在 Chrome 扩展中使用代码时,我得到:“Uncaught ReferenceError:getEventListeners 未定义”。为什么会出现这种情况?是否有与“getEventListeners”功能等效的函数?

document.addEventListener('click', fireContentLoadedEvent, false);

function fireContentLoadedEvent () {
    console.log ("DOMContentLoaded");
    for (let i = 0; i < document.getElementsByClassName("someClass").length; i++) {
        plusButton = document.getElementsByClassName("someClass")[i]

        if ( getEventListeners(plusButton)["click"].length > 1) {

            plusButton.removeEventListener("click", getEventListeners(plusButton).click[1].listener);

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

javascript google-chrome google-chrome-extension referenceerror google-chrome-devtools

13
推荐指数
1
解决办法
1万
查看次数

拒绝执行内联脚本,因为它违反了以下内容安全策略指令(Chrome 扩展清单 3)

我正在尝试将 Chrome 扩展程序从 Manifest 2 迁移到 Manifest 3,但出现以下错误

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self' 'wasm-unsafe-eval'”。启用内联执行需要“unsafe-inline”关键字、哈希值(“sha256-ClANdr6bWuUdXWELI09IBiITbU5zbvg6V1dZp9mr55Q=”)或随机数(“nonce-...”)。

对于代码

在此输入图像描述

我尝试添加

"content_security_policy": {
    "extension_page": "script-src 'self' 'sha256-ClANdr6bWuUdXWELI09IBiITbU5zbvg6V1dZp9mr55Q='"
},
Run Code Online (Sandbox Code Playgroud)

清单,但没有帮助

我该如何解决?

google-chrome-extension chrome-extension-manifest-v3

13
推荐指数
1
解决办法
1万
查看次数

从chrome扩展程序访问iframe

我正在开发一个镀铬扩展,并遇到了一个大问题.

我正在使用内容脚本在网站上注入我的javascript代码.该网站有一个iframe.我可以更改iframe的源代码,但似乎无法访问iframe的contentWindow属性.我需要它在当前的carret位置插入文本.

所以基本上这个代码在页面的上下文中完美地工作:

$("#iframe1").contentWindow.document.execCommand("InsertHTML", false, 'test text');
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在我的chrome扩展程序的上下文中运行时,我收到此错误:

TypeError: Cannot read property 'document' of undefined
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我可以访问iframe的html.所以这段代码完全可以从chrome扩展程序中运行:

$("#iframe1").contents().find('div').html('test')
Run Code Online (Sandbox Code Playgroud)

我尝试在清单文件中放入"all_frames":true但没有运气:(

javascript iframe google-chrome-extension

11
推荐指数
1
解决办法
1万
查看次数

在修改Array.prototype时创建javascript数组原型的重置?

一般问题:当像Array这样的默认Javascript原型被修改,黑客攻击,更改并扭曲到无法使用时,有没有办法创建(或重新实现)原始的,未修改的原型的实例?


我的情况:我有一些代码在(可怕的,专有的,封闭源代码......)内容管理系统的"编辑"模式下失败,因为内容的"编辑"模式界面的javascript管理系统破坏了Array原型的绝对生活地狱.

我的代码将在CMS的非编辑模式下工作,但是,为了实现这一目标,它已经在"编辑"模式下进行了测试.可以测试原型是否已被修改.是否有可能重新实现默认的Array原型,所以我可以这样做:

var hasArrayBeenTrashed = // boolean based on https://stackoverflow.com/questions/574584/
var normalArray.prototype = // based on answer to this question 
var myArray = !hasArrayBeenTrashed ? [] : new normalArray;
Run Code Online (Sandbox Code Playgroud)

javascript arrays prototype object

11
推荐指数
2
解决办法
2227
查看次数

如何在Chrome中下载、显示blob图像?

我正在尝试打开/下载网站的 PNG blob 图像。我使用网络来查找图像,但它仅将其显示为纯文本。

网络控制台预览

我很困惑为什么列表中的小预览图像会显示该图像。如何下载图像或获得任何类型的工作预览?

browser google-chrome blob image google-chrome-extension

11
推荐指数
1
解决办法
2万
查看次数

如何使用Chrome扩展程序中的给定char/keycode初始化键盘事件?

我正在开发一个Google Chrome扩展程序,用于模拟网页上的键盘事件.

我发现event.initKeyboardEvent()因为这个webkit bug 而无法正常工作,我也找到了一些解决方法,例如SO Question

但是,在事件对象上定义属性不起作用,因为扩展的内容脚本具有自己的"并行世界",因此内容脚本中定义的属性对于Web页脚本不可见.

我唯一也是最后希望DOM 4 Event Constructors在Google Chrome中运行,并且可以通过构造函数正确初始化键盘事件

var event = new KeyboardEvent("keypress", {key: 'U+0041', char: 'a', ... })
Run Code Online (Sandbox Code Playgroud)

不幸的是,它失败了:

TypeError: illegal constructor  
Run Code Online (Sandbox Code Playgroud)

我无法在Chrome中找到有关受支持的事件构造函数的任何文档.有人能指点我一些文档/源代码吗?

是否有其他方法可以在Google Chrome扩展程序中模拟键盘事件?

(注意,TextEvent,并将不会帮助,因为许多现实世界的控制听keydown/ keyup专)

javascript google-chrome google-chrome-extension dom-events content-script

10
推荐指数
3
解决办法
9340
查看次数

JavaScript注入和书签有什么区别吗?

根据维基百科关于Bookmarklets的文章(http://en.wikipedia.org/wiki/Bookmarklet),Bookmarklets的概念是:

Web浏览器将URI用于标记的href属性和书签.URI方案(例如http:,file:或ftp:)指定协议和字符串其余部分的格式.浏览器还实现了一个前缀javascript:对解析器来说就像任何其他URI一样.在内部,浏览器看到指定的协议是javascript,将字符串的其余部分视为JavaScript应用程序然后执行,并将结果字符串用作新页面.

它表示结果字符串用作新页面.那么这是否意味着浏览器的原始DOM不受该字符串的影响?但是,如果将结果字符串用作新页面,我如何在现有DOM中更改或注入新的DOM元素?因为脚本提醒Hello或注入一些新的DOM元素并没有真正返回任何内容.他们有点在现有的DOM上工作.

现在,在Internet Explorer中,除了使用Bookmarklets在页面上执行一些JavaScript之外,我还可以编写一个BHO插件并按以下方式注入:

        document = (HTMLDocument)webBrowser.Document; 
        var injectedJS = System.IO.File.ReadAllText("InjectedJS.js");
        var window = document.parentWindow;
        window.execScript("(function(){ " + injectedJS + " })()");
Run Code Online (Sandbox Code Playgroud)

同样在chrome中,我可以编写一个扩展来实现同样的目的:

var s = document.createElement('script');
s.src = chrome.extension.getURL("script.js");
s.onload = function() {
    this.parentNode.removeChild(this);
};
(document.head||document.documentElement).appendChild(s);
Run Code Online (Sandbox Code Playgroud)

这些有何不同?我所拥有的高级问题是:

  1. 这三种方法是否在不同的环境中执行JavaScript代码?
  2. 对于其中一个没有另外一个没有的限制吗?
  3. 执行结果呈现给用户或反映在浏览器中的方式有​​什么不同吗?
  4. "JavaScript注入"和"Bookmarklets"这两个术语之间是否有任何区别?虽然我认为JavaScript注入是一种效果而Bookmarklets是实现这一目标的一种方式,但BHO和Chrome扩展是另一种方式.
  5. 如果4中的假设是正确的,那么使用BHO的execScript方法或在浏览器中使用javascript:protocol 执行JavaScript的方式有什么不同吗?

javascript bho bookmarklet javascript-injection google-chrome-extension

10
推荐指数
1
解决办法
1979
查看次数

使用Chrome的用户脚本劫持变量

我正在尝试使用用户脚本更改页面中的变量.我知道在源代码中有一个变量

var smilies = false;
Run Code Online (Sandbox Code Playgroud)

从理论上讲,我应该能够改变它:

unsafeWindow.smilies = true;
Run Code Online (Sandbox Code Playgroud)

但它不起作用.当我试图警告或将变量记录到控制台而没有劫持时,我得到它是未定义的.

alert(unsafeWindow.smilies); // undefined !!!
Run Code Online (Sandbox Code Playgroud)

编辑:如果它改变了什么,我正在使用Chrome ...

http://code.google.com/chrome/extensions/content_scripts.html说:

内容脚本在称为孤立世界的特殊环境中执行.他们可以访问注入页面的DOM,但不能访问页面创建的任何JavaScript变量或函数.它将每个内容脚本视为在其运行的页面上没有执行其他JavaScript.

这是关于Chrome扩展,但我猜这与用户脚本也是一样的?

谢谢你,Rob W.所以需要它的人的工作代码:

var scriptText = "smilies = true;";
var rwscript = document.createElement("script");
rwscript.type = "text/javascript";
rwscript.textContent = scriptText;
document.documentElement.appendChild(rwscript);
rwscript.parentNode.removeChild(rwscript);
Run Code Online (Sandbox Code Playgroud)

javascript google-chrome userscripts content-script

9
推荐指数
1
解决办法
6600
查看次数

从网站调用Chrome扩展程序的后台功能

我正在寻找网页内的功能te激活chrome扩展.

想象一下,http://www.example.com/test.html包含:

<script>
hello();
</script>
Run Code Online (Sandbox Code Playgroud)

我的背景页面包含hello函数的定义:

function hello() {
    alert("test");
}
Run Code Online (Sandbox Code Playgroud)

如何确保hellotest.html通话时调用Chrome扩展程序的后台页面hello();

javascript google-chrome google-chrome-extension content-script

9
推荐指数
2
解决办法
1万
查看次数

使用Chrome扩展程序修改HTTP请求的响应正文

我正在开发Chrome扩展程序.我想在(第一次)页面加载发生时修改一些内容.我不知道如果我使用的方法getContent()chrome.devtools.network.onRequestFinished.addListener,我怎么能修改的内容是从方法返回后?

这种方法仅用于网络/流量观察吗?我可以修改响应正文吗?

javascript google-chrome-extension

9
推荐指数
1
解决办法
6568
查看次数