Mozilla Firefoxの拡張機能を作成することに関するHabrの記事がたくさんあります。
検索を使用すると、たとえば、 here 、 here 、 here 、さらにhereの情報を見つけることができます。
しかし、有効な拡張機能に関する記事はまだありません(もしあれば)。
同時に、開発者向けの拡張機能のバリデーターは長い間存在していました。 ここのページの下部で、ログインするにはログインが必要です。
あなたの許可を得て、上記の記事に記載されている情報をコピーしません。
代わりに、「有効な」アドオンを作成するための一般原則を説明しようとします。
そして、いくつか例を挙げてリンクを投げます。
- eval()を使用しないでください。 誰もがこのルールを知っていますが、ここではさらに複雑です。
また、eval()がクロージャであることを常に覚えている人は少ないと思います。
「スコープ」(スコープ)で宣言されたすべてのものは、eval()に含まれていたコードで利用可能になります。 これを含めると、非常に多くの問題が発生します。 特に、「i」、「str」などのような補助変数名を指定する場合。
- window.setTimeout()を使用する場合は、常に次のように記述します。
window.setTimeout( function (){<br> [ ]<br> }, ); <br><br> * This source code was highlighted with Source Code Highlighter .
第一に、それは有効であり、第二に、それは有効であり、第三にまた有効です。
変数を渡す必要がある場合はどうしますか?
スコープロックを使用してください!
( function ( [ , Timeout ] ){
window.setTimeout( function (){
[ ]
}, );
}( [ , "" Timeout ] ));
* This source code was highlighted with Source Code Highlighter .
もちろん、完全に「正しい」オプションがあります-たとえば、これを使用するには:
Components.classes[ '@mozilla.org/timer;1' ].createInstance(Components.interfaces.nsITimer); <br><br> * This source code was highlighted with Source Code Highlighter .
しかし、これはすでに「完全に」正しいです。
- オーバーレイのためにGlobal Scropeを使用することはありません。
これがこれです:
< toolbarbutton id ="helloButton" label ="&helloworld;" oncommand ="showHello();" /> <br><br> * This source code was highlighted with Source Code Highlighter .
避けなければなりません。
ここで何が間違っていますか?
グローバル関数「showHello()」があるわけではありません。
はい、誰もが「サンドボックス内」にあり、文字通り「利用可能」ではないことを知っています
Firefoxスキンのグローバルオーバーレイ。
しかし、これは彼女がグローバルに留まることを妨げません!
少なくともプロジェクトの枠組みの中で...
したがって、彼女の「何か」または「誰か」は「偶然」に...
どうする?
しかし、まだ「 addEventListener 」をキャンセルした人はいません
つまり、次のようにします。
<toolbarbutton id= "helloButton" label= "&helloworld;" />
var gid = function (id){ return window. document .getElementById(id); }
gid( 'helloButton' ).addEventListener( 'command' , function (evt){ our_event_handler(evt); }, false );
* This source code was highlighted with Source Code Highlighter .
はい、それは「退屈」ですが、検証はより高価です!
自分の人生を困難にするために、他に何を思いつくことができますか:
- XULオーバーレイの場合、「すべてのコード」となるJSファイルを1つだけ作成することが望ましいです(「Highlander」のように、1つだけを残す必要があります)。
さらに、このファイルのコード全体は、次のようにクロージャー内にあります。
( function (){
var e;
try {
[ ]
} catch (e){ window.alert(e); }
})();
* This source code was highlighted with Source Code Highlighter .
- 「多数のディレクトリ内の多数の小さなファイル」上にコードを「分散」させますか?
それも可能です!
var JS_Loader = function ( path_to_file, object_where_file_will_be_loaded ){
Components.classes[ '@mozilla.org/moz/jssubscript-loader;1' ]
.getService(Components.interfaces.mozIJSSubScriptLoader)
.loadSubScript( path_to_file , object_where_file_will_be_loaded ); }
}
var our_scope_object = {};
// USING:
JS_Loader( 'some_path to chrome:// or resource://' , our_scope_object);
/*
, "" 'some_path' our_scope_object.
, 'some_path' this our_scope_object
*/
* This source code was highlighted with Source Code Highlighter .
既知の「グリッチ」が原因で、また、検証中に警告が失敗するという事実のために、このオプションがあなたに合わない場合は、「絶対に正しい」ことを行う必要があります:
Components.utils.import( path_to_file , object_where_file_will_be_loaded )
* This source code was highlighted with Source Code Highlighter .
ただし、わずかに異なる「トラブル」が発生します。
- 一般に、もちろん、コントロールのすべての「ハング」 addEventListenerアクションを個別の関数に削除できます...しかし、存在しないコントロールにイベントを登録しようとすると、「インシデント」があることを覚えておく必要があります。
とりわけ、これは私たちを助けます!:
window.addEventListener( "aftercustomization" , function (evt){
[ , <br> , toolbar ]
}, false );
* This source code was highlighted with Source Code Highlighter .
最後に、いくつかの「楽しい」ささいなことをさせてください。
「拡張」プロパティを操作します。
var ADDON_ID = '[ em:id install.rdf ]' ;
var EXTENSION = {};
if (Application.extensions){ EXTENSION = Application.extensions.get(ADDON_ID); }
else { Application.getExtensions( function (extensions){ EXTENSION = extensions.get(ADDON_ID); }); }
return {
ext : function (){ return EXTENSION; }
, ver : function (){ return EXTENSION.version; }
}
* This source code was highlighted with Source Code Highlighter .
ファイルシステム内の拡張機能へのパス:
var addonLocation = '' ;
Components.utils.import( "resource://gre/modules/AddonManager.jsm" );
AddonManager.getAddonByID( '[ em:id install.rdf ]' , function (addon) {
addonLocation = addon.getResourceURI( "" ).QueryInterface(Components.interfaces.nsIFileURL).file;
} );
* This source code was highlighted with Source Code Highlighter .
ブリンカー...
var blinker = function (cnt){
for ( var i = 1; i < cnt; i++){
( function (ist){
// window.alert('' + ist + ' ' + (ist % 2));
window.setTimeout( function (){ show_status((ist % 2)); }, ist*450 );
})(i);
}
}
/*
show_status, , 1 0
"" , - ""
*/
* This source code was highlighted with Source Code Highlighter .
結論として、いくつかのリンクを提供したいと思います。
コメント不要: addons.mozilla.org/en-US/developers
Mozilla開発者ネットワーク: developer.mozilla.org/en-US
これを注意深く見ていきます。
XUL仕様: developer.mozilla.org/en/XUL
developer.mozilla.org/en/JavaScript
developer.mozilla.org/en/DOM
developer.mozilla.org/en/XUL_Overlays
developer.mozilla.org/en/XUL_controls
そして、これは必見です!:
developer.mozilla.org/en/Setting_up_extension_development_environment
developer.mozilla.org/en/Extension_Frequently_Asked_Questions
developer.mozilla.org/en/Creating_toolbar_buttons
developer.mozilla.org/en/XUL_School/Adding_Toolbars_and_Toolbar_Buttons
developer.mozilla.org/en/XUL_School/Adding_Events_and_Commands
developer.mozilla.org/en/Addons/Add-on_Manager/Code_Samples
developer.mozilla.org/en/chrome_registration
developer.mozilla.org/en/XPCOM_Interface_Reference/mozIJSSubScriptLoader
そして、いつの日か、おそらく覚えておいてください...:
developer.mozilla.org/en/Code_snippets
developer.mozilla.org/en/XUL_School/Handling_Preferences
developer.mozilla.org/en/Security_best_practices_in_extensions