如何强制书签只运行一次?

时间:2011-09-10 19:15:57

标签: javascript bookmarklet

我的书签包含对{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.

问题是如果单击两次书签,将再次插入所有脚本。我该如何防止这种行为?

3 个答案:

答案 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的好方法的例子。我不会复制/粘贴他的答案,但请仔细阅读:)