Changeset 36076

Show
Ignore:
Timestamp:
12/06/09 03:27:16 (3 years ago)
Author:
NeoCat
Message:

Make Re-tab to another div element to avoid render HTML every time.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • websites/twicli/twicli.html

    r36024 r36076  
    2727#menu a.new { background-color: #fcc; } 
    2828 
    29 #tw, #tw2 { position: absolute; left: 0px; top: 54px; width: 100%; font-size: small; } 
     29.tw { position: absolute; left: 0px; top: 54px; width: 100%; font-size: small; } 
     30#re { display: none; } 
    3031#tw2 { background-color: #ffd; display: none; min-height: 448px; } 
    3132#tw > div { border-bottom: 1px solid #777; } 
    32 #tw > div > div, #tw2c > div > div { padding: 1px; border-bottom: 1px solid #999; } 
     33.tw-parent > div > div { padding: 1px; border-bottom: 1px solid #999; } 
    3334.dummy { border-bottom: 0; padding: 0; height: 0; clear: both; } 
    3435.uicon { float: left; width: 32px; height: 32px; } 
     
    5051.lock { position: relative; top: 2px; left: 0; } 
    5152.close { color: red; } 
    52 #get_old, #next { text-align: center; background-color: #999; color: #fec; cursor: pointer; } 
     53.get-next { text-align: center; background-color: #999; color: #fec; cursor: pointer; } 
    5354#rep { display: none; background-color: #fee; position: absolute; width: 90%; left: 4%; top: 200px; border: 4px solid #666; z-index: 2; padding: 2px; font-size: small; } 
    5455#reps { margin-top: 5px; } 
     
    7172        #menu a { padding: 1px 5px; height: 22px; line-height: 22px; } 
    7273        #menu a.sel { height: 24px; } 
    73         #tw, #tw2 { margin-top: 5px; } 
     74        .tw { margin-top: 5px; } 
    7475} 
    7576--></style> 
     
    8384        $("menu").style.top = $("counter-div").style.top = h+3+exh*5; 
    8485        $("control").style.height = h+23+exh*5; 
    85         $("tw").style.top = $("tw2").style.top = h+24+exh*4; 
     86        $("tw").style.top = $("tw2").style.top = $("re").style.top = h+24+exh*4; 
    8687} 
    8788// 文字参照をデコード 
     
    269270</div> 
    270271<!--メインタイムライン--> 
    271 <div id="tw"></div> 
    272 <!--TL以外のタブ--> 
    273 <div id="tw2"><div id="tw2h"></div><div id="tw2c"></div></div> 
     272<div id="tw" class="tw tw-parent"></div> 
     273<!--Reply--> 
     274<div id="re" class="tw tw-parent"></div> 
     275<!--TL,Re以外のタブ--> 
     276<div id="tw2" class="tw"><div id="tw2h"></div><div id="tw2c" class="tw-parent"></div></div> 
    274277<!--返信--> 
    275278<div id="rep"><a href="javascript:closeRep()" class="close"><img alt="×" src="clr.png"></a> 
     
    301304pluginstr = pluginstr.substr(1); 
    302305var plugins = new Array; 
    303 var nr_limit = parseInt(readCookie('limit')) || 500;                            // 表示する発言数の上限 
    304 var max_count = (cookieVer>3) && parseInt(readCookie('max_count')) || 50; 
    305 var max_count_u = parseInt(readCookie('max_count_u')) || 50; 
     306var max_count = Math.min((cookieVer>3) && parseInt(readCookie('max_count')) || 50, 200); 
     307var max_count_u = Math.min(parseInt(readCookie('max_count_u')) || 50, 200);; 
     308var nr_limit = Math.max(max_count*2.5, parseInt(readCookie('limit')) || 500);           // 表示する発言数の上限 
    306309var no_since_id = parseInt(readCookie('no_since_id') || "0");           // since_idを使用しない 
    307310var no_counter = parseInt(readCookie('no_counter') || "0");                     // 発言文字数カウンタを無効化 
     
    313316var nr_tw = 0;                                  // 現在のTLの発言数 
    314317var cur_page = 1;                               // 現在表示中のページ 
    315 var nr_page = 0;        // 次に取得するページ 
     318var nr_page = 0;                                // 次に取得するページ 
     319var nr_page_re = 0;                             // 次に取得するページ(reply用) 
    316320var get_next_func = getOldTL;   // 次ページ取得関数 
    317321var since_id = null;                    // TLの最終since_id 
     
    319323var in_reply_to_user = null;    // 発言の返信先 
    320324var tl_oldest_id = null;                // TLの最も古いid 
    321 var last_replies = [];                  // 受信した返信 
    322325// クロスドメイン通信関連 
    323326var seq = (new Date).getTime(); 
     
    328331var update_ele2 = null; 
    329332var reply_ele = null; 
     333var reply_ele2 = null; 
    330334var direct_ele1 = null; 
    331335var direct_ele2 = null; 
     
    612616        var ret = document.createElement('div'); 
    613617        ret.id = id; 
     618        ret.className = 'get-next'; 
    614619        ret.onclick = function() { getNext(this); }; 
    615620        ret.innerHTML = '▽' + (p ? '(' + p + ')' : ''); 
     
    702707} 
    703708// 新着reply受信通知 
    704 function noticeNewReply() { 
     709function noticeNewReply(replies) { 
    705710        if ($("reply").className.indexOf("new") < 0) 
    706711                $("reply").className += " new"; 
    707         callPlugins("noticeNewReply"); 
    708         if (selected_menu.id == "reply") 
    709                 twShow2(last_replies); 
    710 } 
    711 // last_repliesの重複排除・要素数制限 
    712 function cleanupLastReplies() { 
    713         var rep_ids = []; 
    714         for (var i = 0; i < last_replies.length; i++) { 
    715                 if (rep_ids[last_replies[i].id]) { 
    716                         last_replies.splice(i--, 1); 
    717                 } 
    718                 rep_ids[last_replies[i].id] = 1; 
    719         } 
    720         last_replies.splice(nr_limit); 
     712        callPlugins("noticeNewReply", replies); 
    721713} 
    722714// 受信repliesを表示 
    723 function twReplies(tw) { 
     715function twReplies(tw, fromTL) { 
    724716        if (tw.error) return alert(tw.error); 
    725         last_replies = tw.concat(last_replies); 
    726         cleanupLastReplies(); 
    727717        tw.reverse(); 
    728718        for (var j in tw) callPlugins("gotNewReply", tw[j]); 
    729719        tw.reverse(); 
    730         var nr = tw.length; 
    731         if (replies_in_tl) 
    732                 nr = twShowToNode(tw, $("tw"), false, false, true, false, true); 
    733         if (nr > 0) 
    734                 noticeNewReply(); 
    735         else if (selected_menu.id == "reply") 
    736                 twShow2(last_replies); 
    737         if (tw.length > 0) since_id_reply = tw[0].id; 
     720        if (nr_page_re == 0) { 
     721                nr_page_re = 2; 
     722                $("re").appendChild(nextButton('get_old_re', nr_page_re)); 
     723        } 
     724        twShowToNode(tw, $("re"), false, false, true, false, false, false, fromTL); 
     725        if (!fromTL && replies_in_tl) 
     726                twShowToNode(tw, $("tw"), false, false, true, false, true); 
     727        if (!fromTL && tw.length > 0) since_id_reply = tw[0].id; 
    738728} 
    739729// 受信twitを表示 
     
    757747        twShowToNode(tw, $("tw"), false, false, true, true, true); 
    758748        if (tl_oldest_id && update_reply_counter-- <= 0) { 
    759                 update_ele2 = loadXDomainScript(twitterAPI + 'statuses/mentions.json?seq=' + (seq++) + 
     749                reply_ele2 = loadXDomainScript(twitterAPI + 'statuses/mentions.json?seq=' + (seq++) + 
    760750                                                '&count=' + (since_id_reply ? 200 : max_count_u) + 
    761751                                                (since_id_reply ? '&since_id='+since_id_reply : '') + 
    762752                                                '&callback=twReplies', 
    763                                         update_ele2); 
     753                                        reply_ele2); 
    764754                update_reply_counter = 4; 
    765755        } 
     
    774764        if (tw.error) return alert(tw.error); 
    775765        var tmp = $("tmp"); 
     766        twShowToNode(tw, $("tw"), false, true, false, false, false, true); 
    776767        if (tmp && tmp.parentNode) tmp.parentNode.removeChild(tmp); 
    777         twShowToNode(tw, $("tw"), false, true, false, false, false, true); 
    778768        $("tw").appendChild(nextButton('get_old', nr_page)); 
     769} 
     770function twOldReply(tw) { 
     771        if (tw.error) return alert(tw.error); 
     772        var tmp = $("tmp"); 
     773        twShowToNode(tw, $("re"), false, true, false, false, false, true); 
     774        if (tmp && tmp.parentNode) tmp.parentNode.removeChild(tmp); 
     775        $("re").appendChild(nextButton('get_old_re', nr_page_re)); 
    779776} 
    780777function twShow2(tw) { 
     
    802799        } 
    803800} 
    804 function twShowToNode(tw, twNode, no_name, after, animation, check_since, ignore_old, ignore_new) { 
     801function twShowToNode(tw, twNode, no_name, after, animation, check_since, ignore_old, ignore_new, weak) { 
    805802        $('loading').style.display = 'none'; 
    806803        var len = tw.length; 
     
    810807        var myname_r = new RegExp("@"+myname+"\\b","i"); 
    811808        var nr_show = 0; 
    812         var need_cleanup_last_replies = false; 
     809        var replies = []; 
    813810        for (var i = len-1; i >= 0; i--) { 
    814                 if ($(twNode.id + "-" + tw[i].id)) 
    815                         continue; 
     811                var duplication = $(twNode.id + "-" + tw[i].id); 
     812                if (duplication) { 
     813                        if (duplication.weak) 
     814                                duplication.parentNode.removeChild(duplication); 
     815                        else 
     816                                continue; 
     817                } 
    816818                if (ignore_old && tl_oldest_id > tw[i].id) 
    817819                        continue; 
     
    824826                        s.screen_name = tw[i].user.screen_name; 
    825827                        s.tw = tw[i]; // DOMツリーにJSONを記録 
     828                        if (weak) s.weak = true; 
    826829                        if (tw[i].d_dir == 1 || tw[i].text.match(myname_r)) { 
    827830                                s.className = "tome"; 
    828                                 if (animation) { 
    829                                         last_replies.unshift(tw[i]); 
    830                                         need_cleanup_last_replies = true; 
    831                                         noticeNewReply(); 
     831                                if (animation && !duplication) { 
     832                                        replies.push(tw[i]); 
    832833                                } 
    833834                        } 
     
    865866        if (animation) { 
    866867                nr_tw += nr_show; 
    867                 while (nr_tw > nr_limit) { 
    868                         var last_node = twNode.childNodes[twNode.childNodes.length-1]; 
    869                         nr_tw -= last_node.childNodes.length; 
    870                         twNode.removeChild(last_node); 
    871                 } 
    872                 tl_oldest_id = 0; // 最大3ブロックスキャンしてoldest更新(repliesの挿入等により必ずしもID順でない) 
    873                 for (var i = 0; i < 3 && i < twNode.childNodes.length; i++) { 
    874                         var target_block = twNode.childNodes[twNode.childNodes.length-i-1].childNodes; 
    875                         for (var j = 0; j < target_block.length; j++) 
    876                                 if (target_block[j].tw && (target_block[j].tw.id < tl_oldest_id || !tl_oldest_id)) 
    877                                         tl_oldest_id = target_block[j].tw.id; 
     868                if (nr_tw > nr_limit) { 
     869                        while (nr_tw > nr_limit) { 
     870                                var last_node = twNode.childNodes[twNode.childNodes.length-1]; 
     871                                nr_tw -= last_node.childNodes.length; 
     872                                twNode.removeChild(last_node); 
     873                        } 
     874                        if (twNode.id == 'TL') { 
     875                                tl_oldest_id = 0; // 最大3ブロックスキャンしてoldest更新(repliesの挿入等により必ずしもID順でない) 
     876                                for (var i = 0; i < 3 && i < twNode.childNodes.length; i++) { 
     877                                        var target_block = twNode.childNodes[twNode.childNodes.length-i-1].childNodes; 
     878                                        var target_ele = target_block[target_block.length-1]; 
     879                                        if (target_ele.tw && (target_ele.tw.id < tl_oldest_id || !tl_oldest_id)) 
     880                                                tl_oldest_id = target_ele.tw.id; 
     881                                } 
     882                        } 
    878883                } 
    879884        } 
     
    884889                } 
    885890        } 
    886         if (need_cleanup_last_replies) 
    887                 cleanupLastReplies(); 
     891        if (replies.length) { 
     892                if (twNode.id == "tw") 
     893                        twReplies(replies, true); 
     894                else  
     895                        noticeNewReply(replies); 
     896        } 
    888897        return nr_show; 
    889898} 
     
    911920                                '&callback=twOld', update_ele2); 
    912921} 
     922function getOldReply() { 
     923        update_ele2 = loadXDomainScript(twitterAPI + 'statuses/mentions.json?seq=' + (seq++) + 
     924                                '&count=' + max_count_u + '&page=' + (nr_page_re++) + 
     925                                '&callback=twOldReply', update_ele2); 
     926} 
    913927function getNextFuncCommon() { 
    914928        if (selected_menu.id == "user" && !fav_mode) 
     
    919933                update_ele2 = loadXDomainScript(twitterAPI + 'favorites/' + last_user + '.json?seq=' + (seq++) + 
    920934                                        '&page=' + (++cur_page) + '&callback=twShow2', update_ele2); 
    921         else if (selected_menu.id == "reply") 
    922                 update_ele2 = loadXDomainScript(twitterAPI + 'statuses/mentions.json?seq=' + (seq++) + 
    923                                         '&count=' + max_count_u + '&page=' + (++cur_page) + 
    924                                         '&callback=twShow2', update_ele2); 
    925935} 
    926936// タイムライン切り替え 
     
    930940        selected_menu.className = "sel"; 
    931941        $("tw").style.display = id=="TL"?"block":"none"; 
     942        $("re").style.display = id=="reply"?"block":"none"; 
    932943        $("tw2h").innerHTML = ""; 
    933944        $("tw2c").innerHTML = ""; 
    934         $("tw2").style.display = id!="TL"?"block":"none"; 
     945        $("tw2").style.display = id!="TL"&&id!="reply"?"block":"none"; 
    935946        $("rep").style.display = "none"; 
    936947        scrollTo(0, 1); scrollTo(0, 0); 
     
    943954} 
    944955function switchReply() { 
    945         if (selected_menu.id == "reply" || last_replies.length == 0) { 
     956        get_next_func = getOldReply; 
     957        if (selected_menu.id == "reply") { 
    946958                switchTo("reply"); 
    947959                $("loading").style.display = "block"; 
    948                 update_ele2 = loadXDomainScript(twitterAPI + 'statuses/mentions.json?seq=' + (seq++) + 
    949                                         '&count=' + max_count_u + '&callback=twReplies', update_ele2); 
     960                reply_ele2 = loadXDomainScript(twitterAPI + 'statuses/mentions.json?seq=' + (seq++) + 
     961                                        '&count=' + max_count_u + '&callback=twReplies', reply_ele2); 
    950962        } else { 
    951963                switchTo("reply"); 
    952                 twShow2(last_replies); 
    953964        } 
    954965}