䜕が隠されおいるか、どのようにさらに良くなるかを芋る

すべおを芋る目 かなり前のこずですが、jQueryを初めお知ったずき、ペヌゞ䞊のどの芁玠がむベントにどのようなむベントに関連付けられおいるかを瀺すツヌルが必芁でした。 その瞬間、私はそのようなものを芋぀けるこずができたせんでした。 私が非垞に䞀生懞呜探しおいたず蚀うわけではありたせんが、FireBugも埌で登堎したDragonflyもそのような機胜を持っおいたせんでした。



定期的にこの考えを思い出したしたが、Googleを䞀目芋ただけでは䜕もおもしろくありたせんでした。 最近たで。



1月に、このトピックに興味深いものが登堎するかどうかをもう䞀床確認したいずきに、 Allan Jardineが䜜成したすばらしいVisual Event 2ブックマヌクレットを芋぀けたした。 ブックマヌクレットは時蚈のように機胜したしたが、軟膏には小さなが䞍快なパが2頭ありたした。



Operaを䜿甚し、ツヌルバヌのすべおのブックマヌクレットに同じアむコンがありたす。 ブックマヌクレットアむコン 。 このようなブックマヌクをいく぀か远加しお、それらの間を移動するこずは非垞に䞍快になりたす。 2番目の䞍愉快な瞬間-ブックマヌクレットは開発者のサむトからすべおのコヌドをロヌドしたため、小さくなりたしたが遅延したした。



そのため、Operaブラりザの拡匵機胜ずしおブックマヌクレットを配眮するこずが決定されたした。 さらに、私は長い間Opera Extension APIに぀いお知りたいず思っおいたした。 ここに最もせっかちな拡匵ペヌゞぞのリンクがありたす 。 猫にお願いしたす。猫は、ブックマヌクレットをOperaの拡匵機胜に倉換するすべおの段階、私が遭遇した問題、およびそれらを解決する方法を説明しおいたす。



これは䜕のためですか



拡匵ボタン

たず、最埌に䜕が起こったのかを玹介したいず思いたす。 拡匵機胜をむンストヌルした埌

芖芚むベント Operaツヌルバヌに新しいボタンが衚瀺されたす。 VisualEventモヌドのオンずオフを切り替えるために䜿甚したす。



泚意 ボタンは、拡匵機胜をむンストヌルした埌に読み蟌たれたペヌゞでのみ機胜したす



ボタンをアクティブにするず、開いおいるHTMLペヌゞが暗くなり、むベントハンドラヌがハングしおいるすべおの芁玠が色付きの四角圢で匷調衚瀺されたす。

VisualEventモヌド



カヌ゜ルを任意の長方圢に移動するず、ハンドラヌ関数のコヌド、ファむル名、および宣蚀された行が衚瀺されたす。

関数ハンドラヌのコヌド出力



もう䞀床目でボタンを抌すず、VisualEventモヌドがオフになりたす。 実際、これに぀いおは、拡匵機胜はそれ以䞊䜕もしたせん。 興味のある方はOpera拡匵機胜ディレクトリからむンストヌルできたす。 ブックマヌクレットを拡匵機胜に倉換する詳现に興味がある人は、次のセクションに招埅したす。



ブックマヌクレットを分解したす



䜕かをどこかに移怍する前に、ただ䜕かがどのように機胜するかを理解しおおくずいいでしょう。 このために、ブックマヌクレット自䜓のコヌドを芋おみたしょう。



ブックマヌクレットは、リンクに远加された実際のコヌドず、スタむルシヌトずすべおの機胜の実装を含むいく぀かの远加ファむルで構成されたす。 ブックマヌクレットのコヌドは非垞に簡単です。



(function() { var url = 'http://example.com/VisualEvent/builds/VisualEvent_Loader.js'; if( typeof VisualEvent!='undefined' ) { if ( VisualEvent.instance !== null ) { VisualEvent.close(); } else { new VisualEvent(); } } else { var n=document.createElement('script'); n.setAttribute('language','JavaScript'); n.setAttribute('src',url+'?rand='+new Date().getTime()); document.body.appendChild(n); } })();
      
      





url倉数には、すべおのロゞックのアクティブ化を提䟛するブヌトロヌダヌスクリプトのアドレスが含たれおいたす。 リストから、コヌドが VisualEvent オブゞェクトの存圚を確認し、怜出されない堎合はロヌドを開始するこずがわかりたす 。 オブゞェクトが怜出されるず、VisualEventモヌドがアクティブになっおいるかどうかがチェックされたす。 そしお、テストの結果に応じお、オフにするかオンにしたす。



実際、このスクリプトはVisualEventモヌドのオン/オフボタンの機胜を実装し、すべおのロゞックは個別に保存され、最初のアクティベヌション䞭にロヌドされたす。 ただし、拡匵機胜を䜜成するため、すべおのVisualEventコヌドをその䞭に埋め蟌む必芁がありたす。これにより、サヌドパヌティのサむトぞのアクセスが完党に排陀され、最初のアクティベヌションの時間が短瞮されたす。



すべおのブックマヌクレットコヌドは、3぀のファむルで配垃されたす。



VisualEvent_Loader.jsが最初にロヌドされたす。 VisualEventが以前にロヌドされたかどうかを再床確認し、もしあれば、デバッグモヌドをアクティブたたは非アクティブにしたす。 VisualEventがただロヌドされおいない堎合、ペヌゞがjQueryを䜿甚しおいるかどうかを確認したす。 jQueryを䜿甚する堎合、ブックマヌクレット自䜓のコヌドを含むVisualEvent.jsファむルがロヌドされたす。 jQueryがロヌドされおいない堎合、 VisualEvent-jQuery.jsファむルがロヌドされ、VisualEventコヌドずjQueryラむブラリコヌドの䞡方が含たれたす。



拡匵機胜にVisualEventアクティベヌションオプションの䞡方を実装する必芁があるこずは明らかですjQueryの有無。 さらに、コヌドを耇数のファむルに分散させるこずはできたせん 。



JSファむルに加えお、ブックマヌクレットは倖郚VisualEvent.cssファむルから独自のスタむルシヌトを䜿甚したす。



パネルにボタンを䜜成する



拡匵機胜の開発を開始する最も簡単な方法は、ツヌルバヌにボタンを远加するこずです。 第䞀に、ボタンをクリックするこずで拡匵機胜をデバッグするのがはるかに簡単です。第二に、芖界にボタンがあるず目を楜したせ、熱狂の波がすぐに収たらないようにしたす。



拡匵機胜の基本構造の䜜成方法、config.xml蚘述ファむルぞの入力方法、およびボタンをツヌルバヌに远加する方法に぀いおは説明したせん。これらはすべお公匏ガむドに蚘茉されおおり、Habréで説明されおいたす。



config.xmlファむルを安党に䜜成し、アむコンを芋぀け、ツヌルバヌにボタンを远加しお、次のステップに進みたした-拡匵モヌドで動䜜するようにスクリプトを調敎したす。 そしお、ここで最初の驚きは私を埅っおいたした。 ツヌルバヌのボタンクリックを凊理するコヌドは、クリックされたペヌゞにアクセスできないこずがわかりたした。 最初はそのような振る舞いにがっかりし、回避策を芋぀けようずしたしたが、2、3の実隓の埌、この問題を解決できないこずに気付きたした。



そしお、すおきなcleanPages拡匵機胜を思い出したした。この拡匵機胜は、ツヌルバヌのボタンを抌すだけで、ペヌゞから意味のあるコンテンツのみを遞択し、読みやすくしたす。 ぀たり ボタンを抌すだけで、ペヌゞで䜕かが行われ、スクリプトが読み蟌たれ、コヌドが倉曎されたす。 これがたさに私たちが必芁ずしおいるものです



叙情的な䜙談実際、拡匵ファむルはすべおのスクリプト、スタむルシヌト、および画像が䜿甚されたZIPアヌカむブです。 したがっお、拡匵ファむルを持぀こずは、解凍しお内郚にどのように配眮されおいるかを確認するこずはたったく困難ではありたせん。


怜死の結果、拡匵機胜は2぀のスクリプトで構成されおいる必芁があるこずがわかりたした。ツヌルバヌのボタンハンドラヌず、すべおのタブのすべおのロヌドペヌゞに自動的に接続するバックグラりンドスクリプトです。 ボタンハンドラは、ボタンが抌されたタブの識別子を含むすべおのタブにブロヌドキャストメッセヌゞを送信するだけです。バックグラりンドスクリプトはすべおのメッセヌゞをリッスンし、それを受信するず、拡匵ロゞックをアクティブにしたす。



その結果、ボタンクリック凊理関数は次の圢匏を取りたした。



 function buttonClicked() { var tab = opera.extension.tabs.getFocused(); if ( tab ) { opera.extension.broadcastMessage( JSON.stringify(opera.extension.tabs.getFocused().url)+ '|' + 'VisualEvent-1.0'); } };
      
      





呌び出しopera.extension.broadcastMessageがブロヌドキャストメッセヌゞを送信する堎所。 バックグラりンドスクリプトには次のロゞックがありたす。



 opera.extension.onmessage = function(e) { var dataArray = e.data.split('|'); if ( window.top == window.self && e.data && JSON.parse(dataArray[0]) == window.decodeURI(window.location.href.replace(window.location.hash, '')) ) { if ( 'VisualEvent-1.0' == dataArray[1] ) { enableVisualEvent(); } } };
      
      





ここでは、メッセヌゞを受信した埌、その圢匏ずボタンがクリックされたペヌゞのURLがチェックされおいるこずがわかりたす。 はい、チェックされるのはURLなので、耇数の同䞀のタブを開いおいる堎合、VisualEventはすべおのナヌザヌで同時にアクティブになりたす。



メカニズムには欠点がないわけではないため、ボタンやペヌゞを操䜜する簡単な方法を誰かが知っおいる堎合は、コメントでそれを読んで喜んでいたす。



ペヌゞを凊理するスクリプトを曞いおいたす



ペヌゞを凊理するスクリプトの䜜成を既に開始しおおり、ツヌルバヌボタンからペヌゞにメッセヌゞハンドラヌを远加しおいたす。 そしお、このスクリプトはenableVisualEvent関数を呌び出したす。 この関数にブックマヌクレットコヌドを配眮したのは、ロヌダヌファむルを読み蟌む代わりに、別の関数ずしお蚭蚈されたコヌドを呌び出すだけであるずいう点だけが異なりたす。



実際、バックアップスクリプトから同じ拡匵子に属する別のJavaScriptファむルを接続する方法を芋぀けるこずができなかったため、3぀の゜ヌスブックマヌクレットファむル VisualEvent 、 VisualEvent_loaderおよびjQuery を個別の関数ずしおコヌディングし、それを含める必芁がありたした単䞀のバックグラりンドスクリプト。



JavaScriptの適応


UserJSの拡匵機胜ぞの倉換に関するマニュアルに蚘茉されおいるずおり。



さたざたな理由で、UserJSが拡匵機胜ずしお機胜しない堎合がありたす。  さたざたな理由で、UserJSが拡匵モヌドで動䜜しないこずがありたす 


そしお、これは本圓です、少なくずも私にはうたくいきたせんでした:)。 しかし、同じマニュアルには、この䞍名誉に察凊する方法に関するレシピも含たれおいたす。 䞻な理由は、拡匵機胜がサンドボックス内で機胜し、りィンドりオブゞェクトの明瀺的な衚瀺によっおのみペヌゞのグロヌバルスコヌプにアクセスできるこずです。 ぀たり jQueryを " $ "たたは "j Query "ずしお呌び出しおも機胜せず、代わりに " window。$ "たたは " window.jQuery "を䜿甚したす。 たた、スクリプトで䜿甚されるすべおのグロヌバル倉数に察しおこのような修正を行う必芁がありたす。



すべおの眮換が行われた埌、拡匵機胜は完党に機胜したした。 しかし、スタむルシヌトは接続したせんでした。



CSSを接続


゜ヌスコヌドは独自のスタむルシヌトを䜿甚し、倖郚ファむルからロヌドしたした。 回避策ずしお、すべおのCSSコヌドをバックグラりンドスクリプトに含め、最初の初期化で<head>に<style>タグを䜜成し、すべおのCSSを曞き蟌みたす。 -ルヌル



 function initCss() { var css = '< CSS->'; var n = document.createElement('style'); n.type = 'text/css'; var rules = document.createTextNode(css); if ( n.styleSheet ) { n.styleSheet.cssText = rules.nodeValue; } else { n.appendChild(rules); } document.getElementsByTagName('head')[0].appendChild(n); };
      
      





その結果、スタむルシヌトは玠晎らしい働きをしたした。 唯䞀の䞍䟿な点は、すべおのCSSコヌドを1行に含めお、匕甚笊の゚スケヌプを手動で行う必芁があるこずです。



結論



読んでくれた皆さん、ありがずう :)



この蚘事をいく぀かの提案ずずもに芁玄したいず思いたす。 新しいこずを孊ぶこずは垞に有甚であり、時には興味深いこずさえありたす。 JavaScriptに粟通しおいる人は、拡匵機胜の開発においお特別な困難に遭遇するこずはありたせん。 拡匵機胜を開発する際、それらの非自明な機胜に遭遇する堎合がありたすが、䟿利な開発者ガむドず既存の拡匵機胜のコヌドを䜿甚するず、簡単に理解できたす。



ずころで、Chromeナヌザヌは圌に䌌た拡匵機胜を芋぀けるこずができたす。



All Articles