Как заставить букмарклет запускаться только один раз? - PullRequest
7 голосов
/ 10 сентября 2011

Мой букмарклет состоит из вызова скрипта запуска, который вставляется в body. При запуске он вставляет аналогичным образом больше сценариев (jQuery, собственно приложение) и CSS.

Bookmarklet

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 ]

4 голосов
/ 10 сентября 2011

Вы можете установить свойство для объекта 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;
      }  
    })();
3 голосов
/ 22 сентября 2011

Я нашел самый простой способ сделать это - назвать функцию, которая загружает внешний js-файл, тем же именем, что и функция во внешнем файле, которую я хочу запускать каждый раз, когда пользователь нажимает на букмарклет. Таким образом, при первом нажатии на букмарклет загружается внешний файл, и при последующих щелчках запускается функция во внешнем файле.

Вот код sudo:

Это будет код в ссылке ссылки на букмарклет

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 во второй раз.

0 голосов
/ 10 сентября 2011

Самый простой / чистый способ реализации синглтона в JavaScript?

Пример хорошего способа реализации Singletons в JS. Я не буду копировать / вставлять его ответ, но хорошо прочитаю :)

...