
ããªãåã®ããšã§ãããjQueryãåããŠç¥ã£ããšããããŒãžäžã®ã©ã®èŠçŽ ãã€ãã³ãã«ã©ã®ãããªã€ãã³ãã«é¢é£ä»ããããŠãããã瀺ãããŒã«ãå¿
èŠã§ããã ãã®ç¬éãç§ã¯ãã®ãããªãã®ãèŠã€ããããšãã§ããŸããã§ããã ç§ãéåžžã«äžçæžåœæ¢ããŠãããšèšãããã§ã¯ãããŸããããFireBugãåŸã§ç»å ŽããDragonflyããã®ãããªæ©èœãæã£ãŠããŸããã§ããã
å®æçã«ãã®èããæãåºããŸããããGoogleãäžç®èŠãã ãã§ã¯äœãããããããããŸããã§ããã æè¿ãŸã§ã
1æã«ããã®ãããã¯ã«èå³æ·±ããã®ãç»å Žãããã©ãããããäžåºŠç¢ºèªããããšãã«ã
Allan Jardineãäœæãããã°ããã
Visual Event 2ããã¯ããŒã¯ã¬ãããèŠã€ããŸããã ããã¯ããŒã¯ã¬ããã¯æèšã®ããã«æ©èœããŸããããè»èã«ã¯å°ããªãäžå¿«ãªããšã2é ãããŸããã
Operaã䜿çšããããŒã«ããŒã®ãã¹ãŠã®ããã¯ããŒã¯ã¬ããã«åãã¢ã€ã³ã³ããããŸãã

ã ãã®ãããªããã¯ããŒã¯ãããã€ãè¿œå ããŠããããã®éã移åããããšã¯éåžžã«äžå¿«ã«ãªããŸãã 2çªç®ã®äžæå¿«ãªç¬é-ããã¯ããŒã¯ã¬ããã¯éçºè
ã®ãµã€ããããã¹ãŠã®ã³ãŒããããŒããããããå°ãããªããŸãããé
延ããŸããã
ãã®ãããOperaãã©ãŠã¶ã®æ¡åŒµæ©èœãšããŠããã¯ããŒã¯ã¬ãããé
眮ããããšã決å®ãããŸããã ããã«ãç§ã¯é·ãéOpera Extension APIã«ã€ããŠç¥ããããšæã£ãŠããŸããã ããã«æããã£ãã¡ãª
æ¡åŒµããŒãžãžã®
ãªã³ã¯ããã
ãŸã ã ç«ã«ãé¡ãããŸããç«ã¯ãããã¯ããŒã¯ã¬ãããOperaã®æ¡åŒµæ©èœã«å€æãããã¹ãŠã®æ®µéãç§ãééããåé¡ãããã³ãããã解決ããæ¹æ³ã説æããŠããŸãã
ããã¯äœã®ããã§ããïŒ

ãŸããæåŸã«äœãèµ·ãã£ãã®ãã玹ä»ããããšæããŸãã æ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããåŸ
èŠèŠã€ãã³ã OperaããŒã«ããŒã«æ°ãããã¿ã³ã衚瀺ãããŸãã VisualEventã¢ãŒãã®ãªã³ãšãªããåãæ¿ããããã«äœ¿çšããŸãã
泚æïŒ ãã¿ã³ã¯ãæ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããåŸã«èªã¿èŸŒãŸããããŒãžã§ã®ã¿æ©èœããŸãïŒ
ãã¿ã³ãã¢ã¯ãã£ãã«ãããšãéããŠããHTMLããŒãžãæããªããã€ãã³ããã³ãã©ãŒããã³ã°ããŠãããã¹ãŠã®èŠçŽ ãè²ä»ãã®åè§åœ¢ã§åŒ·èª¿è¡šç€ºãããŸãã

ã«ãŒãœã«ãä»»æã®é·æ¹åœ¢ã«ç§»åãããšããã³ãã©ãŒé¢æ°ã®ã³ãŒãããã¡ã€ã«åãããã³å®£èšãããè¡ã衚瀺ãããŸãã

ããäžåºŠç®ã§ãã¿ã³ãæŒããšã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.js
- VisualEvent-jQuery.js
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ãŠãŒã¶ãŒã¯åœŒã«
䌌ãæ¡åŒµæ©èœãèŠã€ããããšãã§ããŸãã