2011-09-10 22 views
7

私のブックマークレットは、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. 

問題はブックマークレットが二回クリックされた場合、すべてのスクリプトが再び挿入されることです。どのように私はこの動作を防ぐことができますか?

答えて

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; 
     } 
    })(); 
+0

oops - 曖昧な構文を修正し、ifブロックを無意味ではなくむしろanon funcの場所に配置するように編集しました。 –

+0

パーフェクト - 私の以前の試みは確かにこれらの行に沿っていましたが、私は全く知らなかったウィンドウ小道具の代わりに変数を使用していました。ありがとう! – vemv

+1

@vemv関数の中で 'your'Var = 1234;という変数の前に' var'キーワードを指定しないで宣言された変数は、実際にはグローバル 'window'オブジェクトのプロパティになりますが、このメソッドははるかに明示的かつ慎重です。 –

0

Simplest/Cleanest way to implement singleton in JavaScript?

JSでシングルトンを実装するための良い方法の一例。私は彼の答えをコピー/ペーストしませんが、それは良い読み取りを与えます:)

+0

たぶん、「シングルトン」という言葉は私の間違いだったかもしれません。アプリをオブジェクトリテラルに囲んでこの問題を解決するとは思いません。 – vemv

3

を私は私がこれを行うためのクリーンな方法は、関数と、同じ名前を外部JSファイルをロードする機能に名前を付けることがわかりましたユーザーがブックマークレットをクリックするたびに実行される外部ファイル内に保存されます。ブックマークレットを最初にクリックすると、外部ファイルがロードされ、サブクエリクリックでは外部ファイルの関数が実行されます。ここで

は、いくつかのsudoのコードです:

これはexternal.jsファイルはこのように同じ名前の関数が含まれますブックマークレットのリンクの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 

のコードのようになります。

var bookmarklet = { 
    click:function(){ 
     // insert logic you want to run every time the bookmarklet is clicked 
    } 
}; 
bookmarket.click(); // run once after file is loaded 

このようにして外部ファイルが読み込まれると、関数(例functionはbookmarklet.click)は外部から読み込まれたファイルの内部で関数を実行し、外部jsファイルをもう一度adしてください。

+0

それを理解するのにはしばらくかかりました(「クリック」という名前は私を誤解させますが)。ニースのアプローチ、歓声! – vemv