ã€ã³ã¹ã¿ã³ããªã¿ãŒã³ã§ããŒãžéã®Ajaxé·ç§»
ã»ãã®æ°æ¥åããã®ãããã¯ã«é¢ããèšäºããããŸãã ã ç§ã®èšäºã¯ãã®æç¹ã§ãã§ã«æºåãã§ããŠããã®ã§ãajaxã«ã€ããŠã®éšåã¯ç§ã®ååãéšåçã«ç¹°ãè¿ããŸãã ããã¯ããã«å¥ã®çµéšã§ããããããããã«ã·ã³ãã«ã§ãããã®èšŒæ ãšèããŠãã ããã ããã«ãç§ã®ä»£æ¿æ¡ã¯ãååã«ãã£ãŠèæ ®ãããªãã£ãããã€ãã®éèŠãªåŽé¢ã«è§Šããå®çšçãªéšåãããæ·±ãæãäžããèšäºã®ã³ãŒãã«åºã¥ããŠããã²ãŒã·ã§ã³ãæåããå®å šã«å®è£ ã§ããããã«ããŸãã
Ajaxãã©ã³ãžã·ã§ã³ãç°¡åãªæ¹æ³ã§å®è£ ããããšã¯ããã»ã©é£ãããããŸããã ããã«äºçŽããŸãããïŒ
確ãã«ããããããã«ç°¡åãã€æ£ç¢ºã«ããæ¢è£œã®ã©ã€ãã©ãªããããŸãã ãã®èšäºã®ç®çã¯ããããæã§ç°¡åã«è¡ããããšã瀺ãããšã§ãã ãªãã§ïŒ ããšãã°ãã¹ã¯ãªããããµã€ãã«åãããŠèª¿æŽããå Žåã ãã®èšäºã®äŸã§ã¯ãajax移è¡ã®ãã¹ãŠã®åŽé¢ïŒããšãã°ãå±¥æŽAPIã䜿çšããªãäœæ¥ã¯åœ±é¿ãåããŸããïŒãã®ãããªãã©ãŠã¶ãŒã§ã¯éåžžã®ãã©ãŠãžã³ã°ãä¿æãããŸãïŒããŸãã¯ã¹ã¯ãªããã®ããŒãžã§ã³ç®¡çïŒã¯ãŸã£ããåãäžããŸããã ãã¹ãŠã®åŽé¢ãèšäºã«åãŸãããã§ã¯ãããŸããããèšåãããŸãã
å€åœäººã話ããŠããããšãç°¡åã«èª¬æããŠãã ããã
ããŒãžãåãæ¿ãããšãã«åæ¢ããããšãªãåäœããVKontakteãªãŒãã£ãªãã¬ãŒã€ãŒãèŠãããšããããŸããïŒ ããã¯ãããŒãžããªããŒããããªãããã§ããåãªã³ã¯ãã¯ãªãã¯ãããšãjavascriptããµãŒããŒã«ãªã¯ãšã¹ããéä¿¡ããå¿çã§ããŒãžãåä¿¡ããçŸåšã®ããŒãžã®ã³ã³ãã³ããããã«çœ®ãæããŸãã ãã®ã¢ãããŒãã®æãããªå©ç¹ïŒç¶ç¶çãªãã¬ãŒã€ãŒãäœæããæ©èœã«å ããŠïŒïŒãµã€ãã®ã³ã³ããŒãã³ããžã®ããæ·±ãæçåã«ãããããŒãžã®èªã¿èŸŒã¿é床ãäžããããšãã§ãïŒããšãã°ããµã€ãã®éçããããŒãåèªã¿èŸŒã¿ã§ããŸããïŒãæ¢ã«èªã¿èŸŒãŸããã¹ã¯ãªãããåèªã¿èŸŒã¿ããå¿ èŠããªãããªã¯ãšã¹ããä¿åããŸãé床ã®åäžïŒããšãã°ããã©ã°ã€ã³ã®ãµãŒãããŒãã£ã®ãã€ãããã¯ã©ã€ãã©ãªã®å Žåããã©ãŠã¶ã®ãã£ãã·ã¥ãåžžã«ãã®åé¡ã解決ãããšã¯éããŸããïŒã ç§ã®å Žåãajaxãžã®ç§»è¡ã¯ãGoogleãã£ãŒãããã£ãã·ã¥ã§ããªãããšã«ãã£ãŠæ±ºå®ãããŸããGoogleãã£ãŒãã®jsã¯å移è¡ã§1ç§ä»¥äžäžãããããã£ãã·ã¥ãããŸããã§ããããµãŒããŒåŽã®æºåã
MVCãJSONãããŒãžã®ã³ã³ãã³ããããã±ãŒãžåããŸãã
ããã§ãããžãã¯ããã¥ãŒããåé¢ããŠããªãå Žåã¯ããããè¡ãæéã§ãã ajaxãä»ããŠããŒãžãæäŸããã«ã¯ããã®ã³ã³ãã³ããè¡ãšããŠååŸããå¿ èŠããããŸãã ãããã£ãŠãã³ãŒããäžéããŒã¿ã®åºåãšäº€ä»£ããå Žåãæ·±å»ãªãªãã¡ã¯ã¿ãªã³ã°ãå¿ èŠã§ãïŒããã¯äŸç¶ãšããŠå¿ èŠã§ãããå°æ¥ã®ç掻ã楜ã«ãªããŸãïŒïŒãã³ãã¬ãŒãã䜿çšããŠãåºåã®ãã¹ãŠã®ããŒã¿ãæåŸã«çæãããããšã確èªããå¿ èŠããããŸãïŒæååãè¿ãéåžžã®é¢æ°ã§ã圹å²ãå®è¡ã§ããŸãïŒäºãã«ç¬ç«ããŠïŒæºåãããåçããŒã¿ãæã€å€æ°ã®è»¢éå ããªã³ã¯ãã¯ãªãã¯ãããšãããŒãžãJavaScriptã§ã¬ã³ããªã³ã°ãããããã«ãªããããäœããã®åœ¢åŒã§ããã±ãŒãžåããå¿ èŠããããŸãã ç°¡åã«ããããã«ãJSONã䜿çšããŸãã
ããŒã¿ãã³ã³ããŒãã³ãã«åå²ããŠã¿ãŸãããïŒhtmlã³ãŒããã€ã³ã©ã€ã³ã¹ã¯ãªãããããŒãžã¿ã€ãã«ããªãã€ã¬ã¯ãã«é¢ããæ å ±ã ãããã®ã³ã³ããŒãã³ããå ¥åãšããŠåãåãããªã³ã¯ãã¯ãªãã¯ãããšãã«JSã«ãªã¯ãšã¹ãã®çµæãè¿ãé¢æ°ãäœæããŸãïŒæ¬äŒŒã³ãŒãã®äžã§ã¯ãåºæ¬ã¯phpã§ãããå¥ã®èšèªãæã£ãŠããå¯èœæ§ããããŸãïŒã
function response(html, options = null) { define res; // JSON res['html'] = html; // html html- . // html, â error. if (options) { if (options['script']) { res['script'] = options['script']; } if (options['redirect']) { res['redirect'] = options['redirect']; } if (options['title']) { res['title'] = options['title']; } } // json UTF-8 header('Content-Type: application/json; charset=UTF-8'); print json_encode($res); // res json http. exit(); // json . }
ããã§ãajaxã®ç§»è¡äžã«ããŒãžã衚瀺ããã«ã¯ãresponseïŒïŒé¢æ°ãåŒã³åºãã ãã§ååã§ãã
ããšãã°ãphpã®å Žåã次ã®ããã«ãªããŸãã
function wrapAbout($employees) { return "<div> 2012 . : {$employees}</div>"; } $employees = getEmployeesNumber(); $html = wrapAbout($employees); response($html, array('title' => ' '));
ãšã©ãŒåŠçã
ããŒãžãè¿ãããšãåžžã«å¯èœã§ãããšã¯éããŸããã ãšã©ãŒæ å ±ã¯åå¥ã«åŠçããŸãããããè¡ãã«ã¯ãé¢æ°ãäœæããŸãã
function error(num, msg) { define res; //, JSON define res['error']; // res['error']['num'] = $num; // res['error']['msg'] = $msg; // print json_encode(res); exit(); }
äŸå€ãçºçããå ŽåããŸãã¯èª€ã£ãããŒã¿ãéä¿¡ãããå Žåã次ã®ããã«å¯Ÿå¿ããŸãã
if ($_POST['password'] != $password) { error(1, 'Invalid password'); }
çŽæ¥ãªã¯ãšã¹ãã®ãµããŒãã
ãããããŠãŒã¶ãŒããªã³ã¯ããã©ããã«çŽæ¥ã¢ã¯ã»ã¹ããå ŽåããŸãã¯F5ããŒãæŒããå Žåã¯ã©ããªããŸããïŒ ãã®ãããªå ŽåãåŠçããå¿ èŠããããŸãã ãã®ãããhtmlãå«ãè¡ãè¿ãããããã«ã³ãŒããæé©åããŸããã ãã®htmlãçŽæ¥äžããã ãã§ååã§ããªã¯ãšã¹ããajaxããã§ã¯ãªãå Žåã®jsonã®åœ¢åŒã§ã¯ãããŸããã ãããç解ããæ¹æ³ã¯ïŒ ajaxãããªã¯ãšã¹ãããå Žåãè¿œå ã®ãã©ã¡ãŒã¿ãŒajax = 1ãæž¡ãã®ã§ããªã¯ãšã¹ãã®çºä¿¡å ãšçµæãè¿ãæ¹æ³ãåžžã«åºå¥ã§ããŸããã¯ã©ã€ã¢ã³ãéš
ã¯ã©ã€ã¢ã³ãåŽã®æºå
ããã§ã¯ãå°ãã®ãªãã¡ã¯ã¿ãªã³ã°ãåŸ ã£ãŠããŸãã ãããŒãžç¶æ ããªã©ã®æŠå¿µã衚瀺ãããŸãã ããŒãžéã移åããããšã¯ãªããªãããã¹ãŠã1ã€ã®ããŒãžã§è¡ããããããç¶æ ãåé¢ããå¿ èŠããããŸãã æ»ããã¿ã³ã䜿çšããŠãããã«ããŒãžã®åã®ç¶æ ã«æ»ããåæã«ãã¹ãŠã®å€æ°ãjavascriptç°å¢ã«å ¥ããããšæããŸãã ãããè¡ãã«ã¯ãçŸåšã®ç¶æ å šäœãä¿åãã1ã€ã®ãšã³ãã£ãã£ã«ç¶æ ãä¿åããŸãã æãã§ããããããã«èŠããŸãïŒ cur = {somevar: true};
ãã¹ãŠã®ããŒãžå€æ°ãcurå ã«ä¿åããŸã-ãã®åŸããã®ç¶æ ãç°¡åã«ä¿åã§ããŸãã
åã®ããŒãžã®ã³ã³ãã³ããæ°ã¹ãããåã«ä¿åãããè£å©ãã£ãã·ã¥ãéå§ããŸãããã
var globalPageHtml = [];
ãªã³ã¯åŠç
ãªã³ã¯ã¯ãã¯ããªã³ã¯ã§ã¯ãªããã¯ãªãã¯ãããšãajaxãä»ããŠå¥ã®ããŒãžãããŒãããJavaScriptãå®è¡ãããã¿ã³ã§ãã åæã«ãajaxããã²ãŒã·ã§ã³ãå©çšã§ããªãå ŽåïŒããšãã°ãå±¥æŽAPIããµããŒããããŠããããURLãå€æŽã§ããªãããããã·ã¥ããã²ãŒã·ã§ã³ã䜿çšããããªãå ŽåïŒãéåžžã®ç§»è¡ã®å¯èœæ§ãç¶æããå¿ èŠããããŸãã ãŸããCtrlããŒãæŒããªããã¯ãªãã¯ããŠæ°ããã¿ãã§ãªã³ã¯ãéãå¿ èŠããããŸãã ãã®æ¹æ³ã§ãã¹ãŠã®ãªã³ã¯ãããçŽããŸãã
<a onclick="go('/someurl', null, event); return false;" href="/someurl">Some link</a>
ã©ãããã®ïŒ ããã¯æãéèŠãªæ¹æ³ã§ããããã²ãŒã·ã§ã³ãæ±ãã®ã¯åœŒã§ããããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
URLãšå±¥æŽãæäœãã
ããã²ãŒã·ã§ã³å±¥æŽãæäœããã«ã¯ãäžè¬çãªhistory.jsã©ã€ãã©ãªã䜿çšããŸãã ããã«ãããå°æ¥çã«ããã·ã¥ããã²ãŒã·ã§ã³ãåæã«ãµããŒãã§ããããã«ãªããŸãããçŸåšã®ãšãããããªããã£ããªAjaxããã²ãŒã·ã§ã³ãæ§ç¯ããŠããŸããã€ãŸããé²è¡ç¶æ³ã«é ãããšããã©ãŠã¶ãŒãè¹å€ã«æ®ãããšãã§ããŸãã
[æ»ã]ãã¿ã³ã䜿çšããäœæ¥ããµããŒãããããã«ãå±¥æŽã§äœæ¥ãåæåããŸãïŒãããžã§ã¯ãã§jqueryã䜿çšããããšãåæãšããŠããŸãïŒã
var History = window.History; History.enabled = !!(window.history && history.pushState); //Temp turn off html4 if (History.enabled) { $(window).bind('statechange', function() { var State = History.getState(); //replacingState - , ajax- . URL , - back . ajax- . if (!cur.replacingState) { cur = State.data; //, , history api, history.js if (globalPageHtml[State.url]) { // ? $('#content').html(globalPageHtml[State.url].html); // , content, html . Html . if (globalPageHtml[State.url].scripts) {// , , , jquery DOM. var fragment = document.createDocumentFragment(); globalPageHtml[State.url].scripts.each( function(nodeIndex, scriptNode) { fragment.appendChild(scriptNode); // , - DOM. }); document.getElementById('content').appendChild(fragment); // DOM , . } window.scrollTo(globalPageHtml[State.url].scroll[0], globalPageHtml[State.url].scroll[1]); // , . delete globalPageHtml[State.url]; // } else { go(State.url, null, null, true); // "" , (, URL ). , . } } cur.replacingState = false; }); }
Ajaxãã©ã³ãžã·ã§ã³ã®åºæ¬çãªJavaScript
ããã§ãæãéèŠãªããšã«çããŸããã ãªã³ã¯ãã¯ãªãã¯ããããšãgoé¢æ°ãåŒã³åºãããŸãã
function go(url, query, event, back) { if (!History.enabled || (event && (event.ctrlKey || event.metaKey))) { // ctrl ( command ) history api var requestString = url; if (query) { requestString += query; } if (!History.enabled) { window.location = requestString; // history api, } else { window.open(requestString, '_blank'); // ctrl, /, ajax } return; } var query = query || {}; var urlString = (url.length > 0) ? url : $(location).attr('href').split('?', 1); // URL ( ), if (jQuery.param(query).length > 0) { urlString += '?' + jQuery.param(query); // ( ) } urlString = window.decodeURI(urlString); // . URL history api. , , rewrite, N /post/N, - /post?item=N - ajax . $.extend(query, {ajax: 1}); // ajax ( , url ) $.ajax({ url: url, global: false, type: "GET", data: query, dataType: "json", success: function (res) { if (res.html) { //ajax html, , if (!back) { // , , var currentUrl = $(location).attr('href'); globalPageHtml[currentUrl] = new Object(); // , url globalPageHtml[currentUrl].html = $('#content').html(); globalPageHtml[currentUrl].scroll = getScrollXY(); // globalPageHtml[currentUrl].scripts = $('script:not([src])'); // . . cur. , - (, ), - , (disclaimer: ). inline , ( ). // state, history api, cur.replacingState = true; History.replaceState(cur, $(document).attr('title') || null, window.decodeURI(currentUrl) || null); // cur, , back, cur.replacingState = true; History.pushState(null, res.title || null, urlString); // URL } window.scrollTo(0, 0); // document.getElementById('content').innerHTML = res.html; //, , cur = {}; $('script:not([src])').each( // ( innerHTML, html() jquery ) function(nodeIndex, scriptNode) { try {eval(scriptNode.innerHTML);} catch(e) {/*Do nothing*/} }); } else { errorAlert(res.error || 'Unable to load page ' + url); //errorAlert - , , } }, error: function (res) { errorAlert(res.error || 'Unable to load page ' + url); } }); }
ããã ãã§ãïŒ Ajaxããã²ãŒã·ã§ã³ã®æºåãã§ããŸããã
ãã®ã¢ãããŒãã§ã¯èæ ®ãããªãåŽé¢ã«é¢ããéèŠãªæ³šæäºé
ããæ·±å»ãªajaxããã²ãŒã·ã§ã³ã§ã¯ãIEã®ããã·ã¥äœæ¥ãèæ ®ãããŸãããã·ã¹ãã ã®å¶éã¯ããã«éå®ãããŸããã
ããŒãžããšã«ç°ãªãã¹ã¯ãªãããããŒããã
çŸåšã®åœ¢åŒã§ã¯ããã¹ãŠã®JSã©ã€ãã©ãªã¯ãããŒãžã«åããŠã¢ã¯ã»ã¹ãããšãã«ããŒãããããšæ³å®ãããŠããŸãã ããã¯ãå°èŠæš¡ãªãµãŒãã¹ãããå Žåã«é©ããŠããŸããã倧èŠæš¡ãªãããžã§ã¯ãã§ã¯ããµã€ãã®ãã®ã»ã¯ã·ã§ã³ã«ã®ã¿é¢é£ããjsã®ã¿ãããŠã³ããŒãããããšæããŸãã ãããã£ãŠãããæ·±å»ãªajaxããã²ãŒã·ã§ã³ã¯ããµãŒãããŒãã£ã®jsã¢ãžã¥ãŒã«ãããŒãããã³ã¢ã³ããŒãã§ããã¯ãã§ãã å®è£ ã¯ç°¡åã§ãããµãŒããŒããããŠã³ããŒãããå¿ èŠãããã¹ã¯ãªããã®URLã®ãªã¹ãã転éããæ¢è£œã®ããŒããŒã䜿çšãã次ã®ajax移è¡æã«ããŠã³ããŒãããã³ãŒããç Žæ£ããã ãã§ååã§ãã ïŒã¹ã¯ãªããããŒãžã§ã³
jsã³ãŒãã«ãã°ããããæ°ããããŒãžã§ã³ããªãªãŒã¹ããã°ããã§ããïŒ åé¡ïŒAjaxããã²ãŒã·ã§ã³äžã«ãã¹ã¯ãªãããæ°æ¥éæŽæ°ãããªãå ŽåããããŸã-ãã©ãŠã¶ãŒã§éãããããŒãžã§ã¯ããªã¯ãšã¹ãããšã«ã¹ã¯ãªãããããŠã³ããŒããããããã§ã¯ãããŸããããé·ãéã¡ã¢ãªå ã«ããããããŠãŒã¶ãŒã¯æŽæ°ãåä¿¡ã§ããŸããã 解決çããããŸããåajaxé·ç§»ã§jsã¢ãžã¥ãŒã«ã®ããŒãžã§ã³çªå·ããµãŒããŒããéä¿¡ããŸãã ã¢ãžã¥ãŒã«ãæŽæ°ãããŠããå Žåã¯ãã¡ã¢ãªãã以åã®ããŒãžã§ã³ã眮ãæããŠãæ°ããããŒãžã§ã³ãããŠã³ããŒãããŸãã åãããšãcssã«ãåœãŠã¯ãŸããŸããAjaxã°ããŒãã«ãã£ãã·ã¥
ããæ·±å»ãªAjaxããã²ãŒã·ã§ã³ã·ã¹ãã ã§ã¯ãã°ããŒãã«ãªã¯ãšã¹ããã£ãã·ã¥ãå®è£ ããŠãäžéšã®ãªã¯ãšã¹ããšããŒãžãæåã§ãã£ãã·ã¥ãããšäŸ¿å©ã§ãã ããã¯ãããªã³ã°æã®ããªããŒãã«åœ¹ç«ã¡ãŸãã å®éãä»ããããªããŒãã«é²ã¿ãŸããããŒãžã®ããªããŒã
Ajaxããã²ãŒã·ã§ã³ãäœæããããã·ã³ãã«ã ãè¶ æ©èœçãªæ©èœã䜿çšããŠãµãŒãã¹ãé«éåã§ããŸãã ãããã®åçŽãªããªãã¯ã®å¹æã¯ãäºæ³ãã¯ããã«è¶ ããŠããŸãããµã€ãã®äœæ¥ã¯å³åº§ã«è¡ãããŸãã ããªããŒãã¯ããã«åœ¹ç«ã¡ãŸãã ããã¯ã°ã©ãŠã³ãã§ã®ããªããŒããšãããŒæã®2ã€ã®æ ¹æ¬çã«ç°ãªãæ¹æ³ã«åããããšãã§ããŸãã 1ã€ç®ã¯ãçŸåšã®ããŒãžã«é¢é£ä»ããããŠãããµã€ãã®å°æ°ã®åºå®ã»ã¯ã·ã§ã³ã§äœ¿çšã§ããŸãã ããšãã°ã[èšå®]ããŒãžã«5ã€ã®ã¿ããããå Žåãã¡ã€ã³ããŒãžãããã¯ã°ã©ãŠã³ãã§èªã¿èŸŒãã åŸããããã®ã¿ããèªã¿èŸŒããšãã¯ãªãã¯ãããšããã«éããŸãã ãã®ææ³ã¯ã補åã®ãªã¹ãïŒããã³éåžžã¯ãªã³ã¯ã®ãªã¹ãïŒã§ã¯æ©èœããŸãã-ãªã¹ãã5èŠçŽ ãè¶ ããå Žåãæ€çŽ¢çµæããå補åã®ããŒãžãèªã¿èŸŒãããšã¯ã§ããŸããã ããã¯ãããŠã¹ããããŒãããšãã«ããªããŒãããã®ã«åœ¹ç«ã¡ãŸããããã¯ã°ã©ãŠã³ãããªããŒã
VKontakteã®æçŽããããã³ãŒãã«åºã¥ããäŸãèããŠã¿ãŸãããã ããã€ãã®ã¿ãããããšä»®å®ããŸãïŒã¿ãã®ä»£ããã«ãéããŠããããŒãžã§ããã«éãã®ã«é©ããã»ã¯ã·ã§ã³ããªã³ã¯ããããŸãïŒã ç§ãã¡ã¯åœŒãã®äžäººã§ãã ããŒãžã®èªã¿èŸŒã¿ã®æåŸã«preloadTabsïŒcurrentTabïŒã¡ãœãããå®è¡ããã ãã§ãã çŸåšã®ã¿ããæž¡ããŠãåãæ¢ã«éããŠããã¿ããèªã¿èŸŒãŸãã«ãæ¬ èœããŠããã¿ãã«é¢ããæ å ±ã®ã¿ãè¿ãããã«ããŸãã ã¢ãããŒãã®äžè¬çãªãã€ã³ãïŒæéããããé£æ¥ã¿ãã«é¢ããæ å ±ãããã«ããŠã³ããŒããã代ããã«ãã¿ãã1ã€ã ãããŒãããéããŠããã¿ãã®æºåãæŽããšããã«æ®ããããã¯ã°ã©ãŠã³ãã§ããŒãããŸãã å¹æã¯çŽ æŽãããã§ãã äŸãèŠãŠã¿ãŸãããïŒ
function preloadTabs(current) { cur.preloading = 1; // ajax ( ajax , ), . , callback ( createElement DOM-, - , ). function(data, tab1Html, tab2Html, tab3Html) { var page = $('#content'); if (cur.section != 'tab1') { page.append(createElement('div', {innerHTML: tab1Html})); } if (cur.section != 'tab2') { page.append(createElement('div', {innerHTML: tab2Html})); } if (cur.section != 'tab3') { page.append(createElement('div', {innerHTML: tab3Html})); } cur.preloading = 2; //0 - , 1 - , 2 - }
ãªã³ã¯ã¯ãªãã¯ãã³ãã©ãŒå ã«ãããå®éã«ã¿ããåãæ¿ããé¢æ°ïŒ
function switchTab(section) { if (cur.section == section) { // return; } var doSwitch = function(section) { hideCurrentSection(); // id cur.section = section; // id showCurrentSection(); // , , append ( display:none ) DOM // history , }; if (!cur.preloading || cur.preloading == 1) { // $('#load_progress').show(); // , , if (cur.preloading != 1) { preloadTabs(cur.section); } var waitPreload = setInterval(function() { if (cur.preloaded == 2) { // $('#load_progress').hide(); // clearInterval(waitPreload); doSwitch(section); } }, 100); } else { doSwitch(section); } }
ãã®ã³ãŒãã®äŸ¿å©ãªç¹ã¯ãã¿ãããŸã ããŒããããŠããªãå Žåã§ãåäœããããšã§ãïŒèª°ããéåžžã«è¿ éã«ãªã³ã¯ãã¯ãªãã¯ããïŒã ããŠã³ããŒãããŸã éå§ãããŠããªãå Žåã¯ããããèµ·åããŠåŸ æ©ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããã¿ãã®èªã¿èŸŒã¿ãéå§ãããŠããå Žåã¯ãããŠã³ããŒããå®äºãããŸã§åŸ æ©ããŠãããã¿ãã衚瀺ããŸãã éåžžã«ã·ã³ãã«ã§ããµãŒãã¹ãéå§ãããŸãã
ããŠã¹ãªãŒããŒããªããŒã
ã»ãšãã©ãã¹ãŠã®ã¯ãªãã¯ã§ãã¯ãªãã¯èªäœãšã«ãŒãœã«ããªã³ã¯äžã«ããæéãšã®éã«å€§å¹ ãªïŒããªç§åäœã®ïŒé 延ããããŸãã ããã«ãããã¯ãªãã¯ããåã«ãªã³ã¯ãããŠã³ããŒãããŠããã©ã³ãžã·ã§ã³ãã€ã³ã¹ã¿ã³ãã«å€ããããšãã§ããŸãã ããã§æ³šæããå¿ èŠããããŸãïŒãŠãŒã¶ãŒãã«ãŒãœã«ããã€ã³ãAããBã«ç§»åãããªã³ã¯ãéè·¯ã«æ²¿ã£ãŠç§»åããå ŽåïŒãããŠåæã«æ°åã®ä»ã®ãªã³ã¯-ã«ãŒãœã«ããªã³ã¯ãã¯ãªãã¯ããã ãã§ãã©ãŠã¶ãŒãšajaxãµãŒãã¹ããªã¯ãšã¹ãã§çæããŸããïŒ ã¯ãªãã¯ããåã«ã«ãŒãœã«ããªã³ã¯äžã«çãŸããã¯ãªãã¯éã®æå°æéç¯å²ãèšç®ã§ããŸãããããŒãžäžã«ããŒãã§ãããªã³ã¯äžã«ã«ãŒãœã«ã眮ããåŸãã¯ãªãã¯ããæå³ãæ£ç¢ºã«ç解ããããã«ååãªæéåŸã«ããŠã³ããŒããéå§ãããŸããã ééããã ãã§ã¯ãããŸããã ããã«ã1ã€ã®ãªã³ã¯ãå³å¯ã«ãã£ãã·ã¥ããŸããæ°ãããªã³ã¯ãããªããŒããããšãå€ããªã³ã¯ãã¡ã¢ãªããæ¶å»ãããŸãã
ã«ãŒãœã«ã®äžã«ã«ãŒãœã«ã眮ããåŸãé¢æ°ãåŒã³åºããŸãïŒããšãã°ããŠãŒã¶ãŒãªã¹ãã®å ŽåããŠãŒã¶ãŒãããã¡ã€ã«ãèªã¿èŸŒã¿ãŸãïŒã
function preloadUser(user_id) { cur.pendingPreloadUid = user_id; cur.pendingPreload = setTimeout(doPreloadUser, 50); //50ms - }
mouseoutã€ãã³ãïŒã«ãŒãœã«ããªã³ã¯ããé¢ãããïŒã«ãã£ãŠã次ãåŒã³åºããŸãïŒ
function cancelPreloadUser() { clearTimeout(cur.pendingPreload); }
ãããŠã50ããªç§åŸ æ©ããããšãã§ããå Žåããªã³ã¯ãããªããŒãããŸãã
function doPreloadUser() { var uid = cur.pendingPreloadUid; if (cur.cachedUser && (uid != cur.cachedUser.uid)) { // - , , unloadUser(cur.cachedUser.uid); } else { cur.cachedUser = new Object(); } cur.cachedUser.uid = uid; // ajax , . , , , , , . cachedUser, . }
æ°ãããªã³ã¯ãããªããŒãããèŠæ±ãå°çããå Žåã¯ããªã³ã¯ãã¢ã³ããŒãããããšãå¿ããªãã§ãã ãããunloadUserïŒuidïŒé¢æ°ã§ãã°ããŒãã«ãã£ãã·ã¥ãã¯ãªã¢ããå¿ èŠããããŸãã
ããªãããã®å Žæãè±éçã«èªãã ãããã®èšäºãæºåããäœæ¥ãè©äŸ¡ããŠãããŠããããšãã èšèŒãããŠãããã¹ãŠã®æ¹æ³ã¯ããããžã§ã¯ãã®ãµã€ãºã«å¿ããŠãæ°æéããæ°æ¥éå®è£ ãããŸãã ãã®è³æããå®éã«WebãµãŒãã¹ãäœåºŠãé«éåããã®ã«åœ¹ç«ã€ããšãæ¬åœã«é¡ã£ãŠããŸãã ã³ã¡ã³ããæžããŠããŠã§ããµã€ãã®é«éåã®çµéšãã³ã¡ã³ãã§å ±æããŠãã ããã