我有一个我制作的书签,它将我的服务器上的脚本加载到用户当前页面.但是我在我的脚本中检查了if如果不满足条件则不采取任何措施.但是,如果用户满足该条件,则运行代码,但导致在其页面中插入两组脚本.我可以阻止这个吗?
<a href="javascript: (function () {
var jsCode = document.createElement('script');
jsCode.setAttribute('src', 'http://xxx.co.uk/xxx/script.js');
document.body.appendChild(jsCode);
}());">Bookmarklet</a>
Run Code Online (Sandbox Code Playgroud)
Dag*_*bit 31
您可以检查脚本是否像这样加载:
function isMyScriptLoaded(url) {
if (!url) url = "http://xxx.co.uk/xxx/script.js";
var scripts = document.getElementsByTagName('script');
for (var i = scripts.length; i--;) {
if (scripts[i].src == url) return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以这样做:
<a href="javascript:
if (!jsCode) {
var jsCode = document.createElement('script');
jsCode.setAttribute('src', 'http://xxx.co.uk/xxx/script.js');
document.body.appendChild(jsCode);
}
">Bookmarklet</a>
Run Code Online (Sandbox Code Playgroud)
这会用jsCode
变量"污染"全局命名空间,但这可能是必要的恶魔.您可以将其重命名为不太可能出现在运行书签的文档中的内容.
请注意,虽然javascript
URI方案适用于这种情况下的bookmarklet,但它不被认为是正常使用的好习惯.
Rob*_*son 11
只需检查选择器长度.这是使用jQuery的一个例子:
if ($('script[src="http://xxx.co.uk/xxx/script.js"]').length > 0) {
//script exists
}
Run Code Online (Sandbox Code Playgroud)
您可以id
在script
标记上放置属性,并document.getElementById('your-id')
在添加之前用于标识脚本是否在页面上.
if (!document.getElementById('your-id')) {
// append your script to the document here, ensure it has its id attribute set to 'your-id'
}
Run Code Online (Sandbox Code Playgroud)
使用 ES6 的解决方案,没有 jQuery:
const url = 'http://xxx.co.uk/xxx/script.js';
function scriptExists(url) {
return document.querySelectorAll(`script[src="${url}"]`).length > 0;
}
if(scriptExists(url){
...
}
Run Code Online (Sandbox Code Playgroud)
不建议将 JS 内联到 HTML 中。而是添加事件侦听器:
function bookmark() {
if(scriptExists(url){
...
}
}
document.querySelectorAll('a.bookmark').addEventListener('click',
bookmark, false);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
28504 次 |
最近记录: |