我的书签包含对{lampher'脚本的调用,该脚本插入body
。在运行时,它以类似的方式插入更多脚本(jQuery,实际应用程序)和CSS。
小书签
javascript:(function(){
var l = document.createElement('script');
l.setAttribute('type','text/javascript');
l.setAttribute('src','launcher.js');
document.body.appendChild(l);
})();
Launcher.js
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.setAttribute('src','my actual script');
document.body.appendChild(s);
// I repeat a block like this once per script/css.
问题是如果单击两次书签,将再次插入所有脚本。我该如何防止这种行为?
答案 0 :(得分:4)
您可以在奇怪命名的window
对象上设置属性,因此在第一次运行时不太可能导致命名空间冲突。在后续运行中,如果属性存在,代码将不会执行:
javascript:(function(){
// Test for existence of your weird property
if (!window.hasOwnProperty('yourWeirdPropertyX774x9ZZYy4')) {
// Run all your existing code
var l = document.createElement('script');
l.setAttribute('type','text/javascript');
l.setAttribute('src','launcher.js');
document.body.appendChild(l);
// Set the flag so this won't run again
window.yourWeirdPropertyX774x9ZZYy4 = true;
}
})();
答案 1 :(得分:3)
我发现对我来说最干净的方法是命名加载外部js文件的函数,该名称与每次用户单击bookmarklet时我想要运行的外部文件中的函数相同。这样,当第一次单击小书签时,它会加载外部文件,并在后续单击时运行外部文件中的函数。
这是一些sudo代码:
这将是bookmarklet链接的URL中的代码
if( ! bookmarklet){
var bookmarklet = {
click: function(){
js = document.createElement('SCRIPT');
js.type = 'text/javascript';
js.src = 'http://external.js?' + (Math.random());
document.getElementsByTagName('head')[0].appendChild(js);
}
};
}
bookmarklet.click(); // this will be called everytime the bookmarklet is clicked
external.js文件将包含一个具有相同名称的函数,如下所示:
var bookmarklet = {
click:function(){
// insert logic you want to run every time the bookmarklet is clicked
}
};
bookmarket.click(); // run once after file is loaded
这样当加载外部文件时,您的函数(示例函数是bookmarklet.click)现在在外部加载的文件中运行该函数,并且不会再次加载外部js文件。
答案 2 :(得分:0)
Simplest/Cleanest way to implement singleton in JavaScript?
一个在JS中实现Singletons的好方法的例子。我不会复制/粘贴他的答案,但请仔细阅读:)