Как заставить букмарклет запускаться только один раз?
Мой букмарклет состоит из вызова скрипта запуска, который вставляется в 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 ответа
Вы можете установить свойство на 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;
}
})();
Я нашел самый простой способ сделать это - назвать функцию, которая загружает внешний js-файл, тем же именем, что и функция во внешнем файле, которую я хочу запускать каждый раз, когда пользователь нажимает на букмарклет. Таким образом, при первом нажатии на букмарклет загружается внешний файл, и при последующих щелчках запускается функция во внешнем файле.
Вот некоторый код sudo:
Это будет код в 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-файл во второй раз.
Самый простой / чистый способ реализовать синглтон в JavaScript?
Пример хорошего способа реализации Singletons в JS. Я не буду копировать / вставлять его ответ, но прочитаю его:)