我必须为项目使用vanilla JavaScript.我有一些功能,其中一个是打开菜单的按钮.它适用于目标ID存在的页面,但会导致id不存在的页面出错.在那些函数找不到id的页面上,我收到一个"无法读取属性'addEventListener'的null"错误,我的其他函数都没有工作.
下面是打开菜单的按钮的代码.
function swapper() {
toggleClass(document.getElementById('overlay'), 'open');
}
var el = document.getElementById('overlayBtn');
el.addEventListener('click', swapper, false);
var text = document.getElementById('overlayBtn');
text.onclick = function(){
this.innerHTML = (this.innerHTML === "Menu") ? "Close" : "Menu";
return false;
};
Run Code Online (Sandbox Code Playgroud)
我该如何处理?我可能需要将所有代码包装在另一个函数中或使用if/else语句,以便它只搜索特定页面上的id,但不确定.
我在chrome扩展中使用外部JavaScript库.我有内联执行,所以我得到了一些错误
(我在控制台上得到的错误)
拒绝执行JavaScript URL,因为它违反了以下内容安全策略指令:"script-src'self'chrome-extension://".要么是'unsafe-inline'关键字,哈希('sha256 -...'),要么是nonce('nonce -...')来启用内联执行.
错误消息清楚地表明有可能解决方法.
Chrome内容安全政策说不可能.许多相关问题引用了此链接.
博客这位博主说这是可能的,但可能这只适用于较旧的Chrome扩展程序.
任何可能的工作?
PS:不想/不能改变我正在使用的整个库.
编辑:如何使用哈希或随机数启用内联执行.
google-chrome google-chrome-extension content-security-policy
我创建了一个角度应用程序。这在浏览器中给出了以下错误
Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution. Note that hashes do not apply to event handlers, style attributes and javascript: navigations unless the 'unsafe-hashes' keyword is present.
Run Code Online (Sandbox Code Playgroud)
原因是 Angular 在 index.html 中注入了以下内容
<link rel="stylesheet" href="styles.css" media="print" onload="this.media='all'">
Run Code Online (Sandbox Code Playgroud)
就是那个onload="this.media='all'"
一种解决方案是设置"optimization"为 false,在这种情况下 Angular 不会注入此代码。但这听起来并不是最好的解决方案。有什么建议如何做到这一点?
另一种解决方案(我认为比前一个解决方案好一点)是创建一个包装器组件,其中包含styles.scss. 就我而言,为了使其工作,我还需要将该encapsultaion包装器组件的设置为ViewEncapsulation.None
我试图通过设置 Content-Security-Policy 标头来减轻 XSS 攻击,但 Chrome 不断抛出错误:
拒绝执行内联事件处理程序,因为它违反了以下内容安全策略指令:“script-src 'self' 'nonce-Njg3MGUxNzkyMjViNDZkN2I3YTM3MDAzY2M0MjUxZGEzZmFhNDU0OGZjNDExMWU5OTVmMmMwMTg4OQ3ZmY.” 启用内联执行需要“unsafe-inline”关键字、散列(“sha256-...”)或随机数(“nonce-...”)。
我尝试设置 nonce,<script nonce="Njg3MGUxNzkyMjViNDZkN2I3YTM3MDAzY2M0MjUxZGEzZmFhNDU0OGZjNDExMWU5OTVmMmMwMTg4NTA3ZmY4OQ==" href="main.js"></script>但它不起作用。
这是我的Content-Security-Policy标题:
default-src 'none';
script-src 'self' 'nonce-NjJjN2E5YjA0ZDJhNDlhZjlhMDFmZjQzMjE4YzhmMTAzOWNjZjVjMGZjNDIxMWU5YWIyNGMwMTg4NTA3ZmY4OQ==';
connect-src 'self' https://vimeo.com;
img-src 'self';
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
font-src 'self' https://fonts.gstatic.com;
media-src 'self' http://player.vimeo.com;
frame-src 'self' http://player.vimeo.com;
Run Code Online (Sandbox Code Playgroud)
我不喜欢设置script-srcas unsafe-inline,因为它使 Content-Security-Policy 无效
有人知道为什么我总是收到此消息吗?拒绝运行 JavaScript URL,因为它违反了以下内容安全策略指令:“default-src 'self'”。启用内联执行需要“unsafe-inline”关键字、哈希值(“sha256-...”)或随机数(“nonce-...”)。另请注意,“script-src”未明确设置,因此“default-src”用作后备。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>Title</title>
<script type="text/javascript">
function checkoutForm() {
var inputValue = document.querySelectorAll('.form-control')[0].value;
alert('Your input value: ' + inputValue);
window.open('/search/' + inputValue);
}
</script>
</head>
<body>
<form class="navbar-search navbar-search-dark form-inline mr-3 d-none d-md-flex ml-lg-auto" method="get"
action="javascript:checkoutForm()">
<div class="form-group mb-0">
<div class="input-group input-group-alternative">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-search"></i></span>
</div>
<input class="form-control" placeholder="Search" type="search" value>
</div>
</div>
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)