iZhihu

知乎插件

  1. // ==UserScript==
  2. // @name iZhihu
  3. // @namespace https://github.com/unogz/izhihu
  4. // @version 2.13.3
  5. // @description 知乎插件
  6. // @match http://www.zhihu.com/*
  7. // @include http://www.zhihu.com/*
  8. // @match https://www.zhihu.com/*
  9. // @include https://www.zhihu.com/*
  10. // @require http://cdn.staticfile.org/jquery/1.8.2/jquery.min.js
  11. // @require http://cdn.staticfile.org/iCheck/1.0.1/icheck.min.js
  12. // @resource jqUI_CSS http://cdn.staticfile.org/iCheck/1.0.1/skins/square/blue.css
  13. // @resource ui-bg_icheck-skin_square_blue http://cdn.staticfile.org/iCheck/1.0.1/skins/square/blue.png
  14. // @resource ui-bg_icheck-skin_square_blue2x http://cdn.staticfile.org/iCheck/1.0.1/skins/square/blue@2x.png
  15. // @require http://cdn.staticfile.org/jqueryui/1.10.4/jquery-ui.min.js
  16. // @require http://cdn.staticfile.org/purl/2.3.1/purl.min.js
  17. // @require http://cdn.staticfile.org/underscore.js/1.6.0/underscore-min.js
  18. // @grant GM_xmlHttpRequest
  19. // @grant GM_addStyle
  20. // @grant GM_getResourceText
  21. // @grant GM_getResourceURL
  22. // @icon https://raw.githubusercontent.com/unogz/izhihu/develop/misc/xpi-config/icon64.png
  23. // @copyright 2015+, @钢盅郭子 @刘勇 @墨磊
  24. // ==/UserScript==
  25.  
  26. var jqUI_CssSrc = GM_getResourceText("jqUI_CSS")
  27. GM_addStyle (jqUI_CssSrc.replace('url(blue', 'url(http://cdn.staticfile.org/iCheck/1.0.1/skins/square/blue'));
  28.  
  29. var version='2.13.3';
  30. var updateDate='2016-4-25';
  31.  
  32. if ( typeof unsafeWindow === "undefined") {
  33. unsafeWindow = ( function () {
  34. var dummyElem = document.createElement('p');
  35. dummyElem.onclick=function(){return window;};
  36. return dummyElem.onclick ();
  37. } ) ();
  38. }
  39.  
  40. //主入口
  41. //$(function main(){
  42.  
  43.  
  44. /**
  45. * @class Utils 辅助类
  46. */
  47. function utils(){
  48. };
  49.  
  50. var cfgDefault = {
  51. 'comment_sidebar': true
  52. , 'answer_orderByTime': false
  53. , 'AuthorList':false
  54. , 'ShowComment':true
  55. , 'HomeLayout':false
  56. , 'QuickFavo':true
  57. , 'QuickFavoPinned':{}
  58. , 'AuthorRear':false
  59. , 'HomeNoti':false
  60. , 'QuickBlock':false
  61. , 'Noti7':true
  62. , 'HomeFeedsColumns':false
  63. , 'RightComment_AutoScrollPageWhenClosing':true
  64. , 'TopNavAutoFold':false
  65. };
  66. /**
  67. * 读取配置
  68. */
  69. utils.getCfg = function(key){
  70. if(!key)return false;
  71. var cfg = $.extend(cfgDefault, this.getValue('izhihu',cfgDefault));
  72. return key ? cfg[key] : cfg;
  73. };
  74.  
  75. utils.setCfg = function(key,value){
  76. if(!key)return;
  77. var cfg = $.extend(cfgDefault, this.getValue('izhihu',cfgDefault));
  78. cfg[key]=value;
  79. this.setValue('izhihu',cfg);
  80. };
  81.  
  82. /**
  83. * 读取存储
  84. */
  85. utils.getValue = function(key, defaultValue){
  86. var v=unsafeWindow.localStorage[key];
  87. if(v)
  88. return JSON.parse(v);
  89. else
  90. return defaultValue;
  91. };
  92.  
  93. /**
  94. * 写入存储
  95. */
  96. utils.setValue = function(key, value){
  97. unsafeWindow.localStorage[key] = JSON.stringify(value);
  98. };
  99.  
  100. /**
  101. * 删除存储
  102. */
  103. utils.deleteValue = function(key){
  104. return delete unsafeWindow.localStorage[key];
  105. };
  106.  
  107. utils.transferOldCfg=function(){
  108. var oldHomeLayout = unsafeWindow.localStorage['izh_HomeLayout']
  109. , oldAuthorList = unsafeWindow.localStorage['izh_AuthorList']
  110. , oldShowComment = unsafeWindow.localStorage['izh_ShowComment']
  111. , oldQuickFavo = unsafeWindow.localStorage['izh_QuickFavo']
  112. , oldAuthorRear = unsafeWindow.localStorage['izh_AuthorRear']
  113. , oldHomeNoti = unsafeWindow.localStorage['izh_HomeNoti']
  114. ;
  115. if(oldHomeLayout){
  116. izhHomeLayout=oldHomeLayout;
  117. unsafeWindow.localStorage.removeItem('izh_HomeLayout');
  118. this.setCfg('HomeLayout',izhHomeLayout);
  119. }
  120. if(oldAuthorList){
  121. izhAuthorList=oldAuthorList;
  122. unsafeWindow.localStorage.removeItem('izh_AuthorList');
  123. this.setCfg('AuthorList',izhAuthorList);
  124. }
  125. if(oldShowComment){
  126. izhRightComment=oldShowComment;
  127. unsafeWindow.localStorage.removeItem('izh_ShowComment');
  128. this.setCfg('ShowComment',izhRightComment);
  129. }
  130. if(oldQuickFavo){
  131. izhQuickFavo=oldQuickFavo;
  132. unsafeWindow.localStorage.removeItem('izh_QuickFavo');
  133. this.setCfg('QuickFavo',izhQuickFavo);
  134. }
  135. if(oldAuthorRear){
  136. izhAuthorRear=oldAuthorRear;
  137. unsafeWindow.localStorage.removeItem('izh_AuthorRear');
  138. this.setCfg('AuthorRear',izhAuthorRear);
  139. }
  140. if(oldHomeNoti){
  141. izhHomeNoti=oldHomeNoti;
  142. unsafeWindow.localStorage.removeItem('izh_HomeNoti');
  143. this.setCfg('HomeNoti',izhHomeNoti);
  144. }
  145.  
  146. };
  147.  
  148.  
  149. /**
  150. * @method formatStr
  151. *
  152. * 格式化字符串模版,支持2种格式:
  153. *
  154. * formatStr("i can speak {language} since i was {age}",{language:'javascript',age:10});
  155. * formatStr("i can speak {0} since i was {1}",'javascript',10);
  156. *
  157. * 如果不希望被转义,则用两个括号,如: `formatStr("i can speak {0} since i was {{1}",'javascript',10);`
  158. *
  159. */
  160. utils.formatStr = function(tpl,obj){
  161. obj = typeof obj === 'object' ? obj : Array.prototype.slice.call(arguments, 1);
  162. return tpl.replace(/\{\{|\}\}|\{(\w+)\}/g, function (m, n){
  163. if (m == "{{") { return "{"; }
  164. if (m == "}}") { return "}"; }
  165. return obj[n];
  166. });
  167. };
  168.  
  169. utils.getParamInQuery=function(queryStr,paramName){
  170. var param=paramName+'='
  171. , start=queryStr.indexOf(param)+param.length
  172. , end=queryStr.indexOf('&',start);
  173. return end<start?queryStr.substring(start):queryStr.substring(start,end);
  174. };
  175.  
  176. utils.observeDOMAttrModified = (function(){
  177. var MutationObserver = window.MutationObserver || window.WebKitMutationObserver,
  178. eventListenerSupported = window.addEventListener;
  179.  
  180. return function(obj, callback){
  181. if( MutationObserver ){
  182. // define a new observer
  183. var obs = new MutationObserver(function(mutations, observer){
  184. if( mutations[0].type == 'attributes' )
  185. callback(mutations[0]);
  186. });
  187. obs.observe( obj, { attributes:true });
  188. }else if( eventListenerSupported ){
  189. obj.addEventListener('DOMAttrModified', callback, false);
  190. }
  191. }
  192. })();
  193.  
  194. utils.observeDOMNodeAdded = (function(){
  195. var MutationObserver = window.MutationObserver || window.WebKitMutationObserver,
  196. eventListenerSupported = window.addEventListener;
  197.  
  198. return function(obj, callback){
  199. if( MutationObserver ){
  200. // define a new observer
  201. var obs = new MutationObserver(function(mutations, observer){
  202. mutations.forEach(function(mutation) {
  203. callback(mutation);
  204. });
  205. });
  206. obs.observe( obj, { childList:true });
  207. }else if( eventListenerSupported ){
  208. obj.addEventListener('DOMNodeInserted', callback, false);
  209. }
  210. }
  211. })();
  212.  
  213. utils.RegexSrcPic = /src="[\s\S]+?.jpg"/g
  214.  
  215. //console.log((new Date()).getTime());
  216.  
  217. var $ = window.$;
  218. var _ = this._;
  219. var purl = window.purl||$.url;
  220.  
  221. //使用CasperJS的模拟用户操作: http://casperjs.org/api.html#client-utils
  222. //var client = window.create();
  223.  
  224. var url = purl();
  225. var page = url.segment(1);
  226.  
  227. var pageIs={}
  228. , $win=$(window)
  229. , _doc=window.document
  230. , $body=$(_doc.body)
  231. , _path=window.frameElement?window.frameElement.src.replace(/https?:\/\/www.zhihu.com/,''):url.data.attr['path']
  232. , css=''
  233. , $h=$('head')
  234. , $s=$('<style>', { 'type': 'text/css' })
  235. , iPathAnswers=_path.indexOf('/answers')
  236. , iPathCollection=_path.indexOf('/collection')
  237. ;
  238. pageIs.Home='/'==_path;
  239. pageIs.Answer=0<_path.indexOf('/answer/');
  240. pageIs.Question=!pageIs.Answer&&0==_path.indexOf('/question/');
  241. pageIs.Answers=0<iPathAnswers&&_path.substr(iPathAnswers)=='/answers';
  242. pageIs.Collection=0==iPathCollection;
  243. pageIs.Debuts=0==_path.indexOf('/debuts/');
  244. pageIs.MyCollection=0==_path.indexOf('/collections/mine');
  245. pageIs.SettingsFilter=0==_path.indexOf('/settings/filter')
  246.  
  247. var i=0
  248. , $user=$('.zu-top-nav-userinfo')//user_avater
  249. , z=$user.length?$user.attr('href'):''
  250. , $banner=$(document.body).children().first()
  251. , $main=$('[role=main]')//main
  252. , css_AuthorListItemA='padding:0 10px 0 0;'
  253. , css_AuthorListItemA_name='padding:0 5px;'
  254. ;
  255.  
  256. window.iZhihu = {
  257. $win:$win
  258. , $body:$body
  259. , $main:$main
  260. , config:$.extend(cfgDefault, utils.getValue('izhihu',cfgDefault))
  261. };
  262.  
  263. var izhHomeLayout = window.iZhihu.config['HomeLayout']
  264. , izhAuthorList = window.iZhihu.config['AuthorList']
  265. , izhRightComment = window.iZhihu.config['ShowComment']
  266. , izhQuickFavo = window.iZhihu.config['QuickFavo']
  267. , izhAuthorRear = window.iZhihu.config['AuthorRear']
  268. , izhHomeNoti = window.iZhihu.config['HomeNoti']
  269. , izhQuickBlock = window.iZhihu.config['QuickBlock']
  270. , izhTopNavAutoFold = window.iZhihu.config['TopNavAutoFold']
  271. ;
  272.  
  273. utils.transferOldCfg();
  274.  
  275. $body.attr({
  276. 'izhHomeLayout' : izhHomeLayout?'1':''
  277. , 'izhAuthorList' : izhAuthorList?'1':''
  278. , 'izhRightComment' : izhRightComment?'1':''
  279. , 'izhQuickFavo' : izhQuickFavo?'1':''
  280. , 'izhAuthorRear' : izhAuthorRear?'1':''
  281. , 'izhHomeNoti' : izhHomeNoti?'1':''
  282. , 'izhQuickBlock' : izhQuickBlock?'1':''
  283. , 'izhTopNavAutoFold' : izhTopNavAutoFold?'1':''
  284. });
  285.  
  286. var _QuickBlock = new QuickBlock(window.iZhihu)
  287. , _QuickFavo = new QuickFavo(window.iZhihu)
  288. , _Comment = new Comment(window.iZhihu)
  289. , _Noti7 = new Noti7(window.iZhihu)
  290. , _Answer = new Answer(window.iZhihu)
  291. , _SearchingList = new SearchingList(window.iZhihu)
  292. , _TopNav = new TopNav(window.iZhihu)
  293. ;
  294.  
  295. css+=['.t_showframe{padding:10px 10px 10px 10px;background:#f0f0f0;border:1px solid #fff;box-shadow:2px 5px 15px #333;border-radius:10px;-moz-box-shadow:2px 5px 15px #333;-moz-border-radius:10px;-webkit-box-shadow:2px 5px 15px #333;-webkit-border-radius:10px}#iZhihu_rtjddiv{width:650px;height:437px}#iZhihu_setdiv{width:600px;height2:295px}.t_setdiv{padding-bottom:10px;background:#fcfcfc;width:100%;height:100%}.t_set_tb{font-family:"Lucida Sans Unicode","Lucida Grande",Sans-Serif !important;font-size:12px !important;text-shadow:none !important;border-collapse:collapse !important;margin:0 !important;line-height:120%}.t_set_tb thead td{background:#0080c0;color:#fff;border:none !important;padding:4px 8px 4px !important;border-radius-topleft:10px;border-radius-topright:10px;-moz-border-radius-topleft:10px;-moz-border-radius-topright:10px;-webkit-border-top-left-radius:10px;-webkit-border-top-right-radius:10px}.t_set_tb th,.t_set_tb td{padding:8px;background:#e8edff;border:none !important;border-top:2px solid #fcfcfc !important;color:#669;line-height:1.1em !important}.t_set_tb td input,.t_set_tb td textarea{font-size:12px !important;padding:0 !important}.t_set_tb tbody tr:hover th,.t_set_tb tbody tr:hover td{background:#d0dafd}.t_set_tb tfoot td{border-radius-bottomleft:10px;border-radius-bottomright:10px;-moz-border-radius-bottomleft:10px;-moz-border-radius-bottomright:10px;-webkit-border-bottom-left-radius:10px;-webkit-border-bottom-right-radius:10px}.t_set_ft{font-family:Arial,sans-serif,瀹�� !important;font-size:12px !important;font-weight:bold !important;text-shadow:none !important;margin-top:15px !important}.t_set_ft a{text-decoration:none;color:#000}.t_setbtn{border:1px solid black;padding:2px;cursor:pointer;background:#fff;color:#0080c0}.t_setftbtn span{padding:2px 10px 2px 10px !important}.t_rtjdbtn{background:#0080c0 !important;color:#fff !important}.t_rtjdtxtpos{padding-top:5px}#iZhihu_rthint{font-family:Arial,sans-serif,瀹�� !important;font-size:16px !important;font-weight:bold;padding:5px 10px 5px 10px;position:fixed;top:20px;border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;display:inline-block;opacity:0.7}.t_rthint_n{color:#fff !important;background:#000 !important}.t_rthint_f{background:#880000 !important;color:#ffffdd !important}.t_upbtn{background:#0080c0 !important;color:#fff !important}.t_upinfo{height:120px !important;vertical-align:text-top !important}#izh_updatediv th{border-right:2px solid #fcfcfc !important}#izh_updatediv tfoot td{border:none !important;border-top:2px solid #fcfcfc !important;font-family:Arial,sans-serif,瀹�� !important;font-size:12px !important;font-style:normal !important;text-shadow:none !important}.t_txtshow{text-align:center;background:#0080c0;color:#f0f0f0;user-select:none;-moz-user-select:none}.t_frshow{font-size:1.2em;position:fixed;z-index:99999;top:45px;width:200px;opacity:0.9;cursor:pointer}.t_tbox{padding:10px;position:relative;border:1px solid #f0f0f0;line-height:20px;*height:1%;width:200px;-moz-box-shadow:2px 5px 15px #333;-moz-border-radius:7px;-webkit-box-shadow:2px 5px 15px #333;-webkit-border-radius:7px}.t_tbox s{position:absolute;top:-20px;left:160px;display:block;height:0;width:0;font-size:0;line-height:0;border-color:transparent transparent #f0f0f0 transparent;border-style:dashed dashed solid dashed;border-width:10px}.t_tbox i{position:absolute;top:-9px;left:-10px;display:block;height:0;width:0;font-size:0;line-height:0;border-color:transparent transparent #0080c0 transparent;border-style:dashed dashed solid dashed;border-width:10px}@media screen and (-webkit-min-device-pixel-ratio:0){#iZhihu_rtjddiv{height:417px}#iZhihu_setdiv{height2:295px}#izh_updatediv{height:315px}}'
  296. ,''].join('\n');
  297. if(pageIs.Question&&izhAuthorList){
  298. css+=['div.uno{position:absolute;left:0;border:1px solid #0771C1;border-right-width:0;border-top-right-radius:6px}'
  299. ,'div.uno .frame{overflow-x:hidden;overflow-y:auto;direction:rtl}'
  300. ,'div.uno span.meT,div.uno span.meB,div.uno ul.pp li span.me{position:absolute;right:0;display:block;height:1px;width:1px;line-height:1px;background-color:transparent;border-style:solid;border-color:transparent;}'
  301. ,'div.uno span.meT{border-width:6px 4px;border-top-width:0px;border-bottom-color:#fff;}'
  302. ,'div.uno span.meB{border-width:6px 4px;border-bottom-width:0px;border-top-color:#fff;margin-top:-7px;}'
  303. ,'div.uno ul{background-color:#0771C1;padding:0;margin:0;direction:ltr}'
  304. ,'div.uno ul li{display:block;list-style-type:none;margin:0;padding:0;white-space:nowrap;}'
  305. ,'div.uno ul li a{display:block;}div.uno li a.sel{text-decoration:none;}'
  306. ,'div.uno ul li a{'+css_AuthorListItemA+'}'
  307. ,'div.uno ul.pp li span.me{position:static;margin:6px -8px;border-width:4px 6px;border-right-color:#fff;float:right;}'
  308. ,'div.uno li a span.name{text-align:right;display:block;'+css_AuthorListItemA_name+'background-color:#fff;}div.uno li a.sel span.name{color:#fff;background-color:#0771C1;}'
  309. ,'div.uno li a span.name.noname{color:#000;}'
  310. ,'div.uno li a span.name.collapsed{color:#999999;}'
  311. ,'div.uno li a span.name.friend{font-style:italic;}'
  312. ,'div.uno li span.hp{background-color:#999999;position:relative;float:right;margin-top:-2px;line-height:2px;height:2px;}'
  313. ,'div.uno table.plus{float:right;margin:7px -9px;height:7px;border-collapse:collapse;border-style:hidden;}div.uno table.plus td{border:1px solid #fff;width:1px;height:1px;}'
  314. ,'div.uno a.sel table.plus{}div.uno a.sel table.plus td{}'
  315. ,'div.uno li a span.func{text-align:center;}'
  316. ,'div.izh-answer-preview{position:fixed;margin-top:1px;background-color:#fff;border:1px solid #0771C1;border-top-width:22px;border-top-right-radius:6px;box-shadow:5px 5px 5px #777;}'
  317. ,'div.izh-answer-preview .zm-editable-content{top:0;bottom:0;left:0;right:0;overflow-y:auto;padding:10px;}'
  318. ,'div.izh-answer-preview img.zm-list-avatar{position:absolute;right:10px;top:-35px;border:1px solid #0771C1;border-radius:6px;}'
  319. ,'div.izh-answer-preview span.comment{position:absolute;top:-18px;line-height:18px;border-top-right-radius:3px;background-color:#fff;padding:0 5px;}'
  320. ,''].join('\n');
  321. }
  322. css+=['.z-icon-izh-fold{background-position:-173px -107px;width:15px;height:15px;}'
  323. ,''].join('\n');
  324. css+=['.t_set_tb{font-family:"Lucida Sans Unicode","Lucida Grande",Sans-Serif !important;font-size:12px !important;text-shadow:none !important;border-collapse:collapse !important;margin:0 !important;line-height:120%}'
  325. ,'.t_set_tb thead td{background:#0080c0;color:#fff;border:none !important;padding:4px 8px 4px !important;border-top-left-radius:6px;border-top-right-radius:6px}'
  326. ,'.t_set_tb th,.t_set_tb td{padding:8px;background:#e7f3f9;border:none !important;border-top:2px solid #fcfcfc !important;color:#669;line-height:1.1em !important}'
  327. ,'.t_set_tb td input,.t_set_tb td textarea{font-size:12px !important;padding:0 !important}'
  328. ,'.t_set_tb tbody tr:hover th,.t_set_tb tbody tr:hover td{background:#d0dafd}'
  329. ,'.t_set_tb tfoot td{border-radius-bottomleft:10px;border-radius-bottomright:10px;-moz-border-radius-bottomleft:10px;-moz-border-radius-bottomright:10px;-webkit-border-bottom-left-radius:10px;-webkit-border-bottom-right-radius:10px}'
  330. ,'.t_set_tb td{white-space:nowrap;}'
  331. ,'.t_set_tb td .icon-help{float:right;}'
  332. ,''].join('\n');
  333. css+=['.izh_boxShadow{box-shadow: 5px 5px 3px 0px #999 !important;}'
  334. ,'#zh-question-meta-wrap.izh_noBorder{border-bottom-color:transparent !important;}'
  335. ,'#zh-question-filter-wrap.izh_noBorder{border-top-color:transparent !important;}'
  336. ,'a.izh-button.on{color:#225599;text-shadow:0 0 1px #225599;}'
  337. ,'a.izh-button .zg-icon{opacity:0.5;}'
  338. ,'a.izh-button.on .zg-icon{opacity:1;}'
  339. ,'a.izh-button.off{color:#eee;}'
  340. ,'a.izh-button.off .zg-icon{opacity:0.2;}'
  341. ,'.izh-feeds-filter{}'
  342. ,'.izh-feeds-filter .izh-feeds-filter-option{opacity:0.5;color:#999999;padding-left:5px;text-decoration:none;cursor:pointer;}'
  343. ,'.izh-feeds-filter .izh-feeds-filter-option i{background-position:-183px -4px;}'
  344. ,'.izh-feeds-filter .izh-feeds-filter-option.on{opacity:1;color:#225599;}'
  345. ,'.izh-feeds-filter .izh-feeds-filter-option.on i{background-position:-183px -24px;}'
  346. ,''].join('\n');
  347. if(izhHomeLayout){
  348. css += ['#zh-question-list { padding-left:30px!important }'
  349. ,'#zh-main-feed-fresh-button { margin-left:-30px!important }'
  350. ,'.feed-item {'
  351. ,' border-bottom:1px solid #EEE!important;'
  352. ,' margin-top:-1px!important'
  353. ,'}'
  354. ,'.feed-item .avatar { display:none!important }'
  355. ,''
  356. ,'.feed-main,.feed-item.combine { margin-left:0!important }'
  357. ,'.feed-item-q { margin-left:-30px!important;padding-left:0!important }'
  358. ,''
  359. ,window.iZhihu.Comment.RightComment ? '' : '.feed-item-a .zm-comment-box { max-width:602px!important }'
  360. ,window.iZhihu.Comment.RightComment ? '' : '.feed-item-q .zm-comment-box { max-width:632px!important; width:632px!important }'
  361. ,''
  362. ,'.zm-tag-editor,'
  363. ,'#zh-question-title,'
  364. ,'#zh-question-detail,'
  365. ,'#zh-question-meta-wrap,'
  366. ,'.zh-answers-title,'
  367. ,'#zh-question-filter-wrap {'
  368. ,' margin-left:-32px!important'
  369. ,'}'
  370. ,''
  371. ,'#zh-question-log-page-wrap .zm-tag-editor,'
  372. ,'#zh-question-log-page-wrap #zh-question-title {'
  373. ,' margin-left:0 !important'
  374. ,'}'
  375. ,''
  376. ,'.zh-answers-title,'
  377. ,'#zh-question-filter-wrap {'
  378. ,' border-bottom:1px solid #EEE!important;'
  379. ,' z-index:1000!important'
  380. ,'}'
  381. ,''
  382. ,'#zh-question-meta-wrap {'
  383. ,' margin-bottom:0!important;'
  384. ,' padding-bottom:10px!important;'
  385. ,' border-bottom:1px solid #EEE!important'
  386. ,'}'
  387. ,''
  388. ,'#zh-question-answer-wrap { margin-top:-1px!important }'
  389. ,''
  390. ,'#zh-question-collapsed-wrap,#zh-question-answer-wrap { border:none!important }'
  391. ,'.zu-question-collap-title { border-top:1px solid #EEE!important }'
  392. ,'#zh-question-collapsed-wrap>div:last-child,.zm-item-answer:last-child { border-bottom:1px solid #EEE!important }'
  393. ,''
  394. ,'.zu-autohide,'
  395. ,'.zm-comment-op-link,'
  396. ,'.zm-side-trend-del,'
  397. ,'.unpin {'
  398. ,' visibility:visible!important;'
  399. ,' opacity:0;'
  400. ,'}'
  401. ,'.feed-item:hover .zu-autohide,'
  402. ,'.zm-item-answer .zu-autohide,'
  403. ,'.zm-item-comment:hover .zm-comment-op-link,'
  404. ,'.zm-side-trend-row:hover .zm-side-trend-del,'
  405. ,'.zm-side-nav-li:hover .unpin {'
  406. ,' opacity:1;'
  407. ,'}'
  408. ,'.zm-item-vote-count:hover,.zm-votebar button:hover{'
  409. ,' background:#a6ce56!important;'
  410. ,' color:#3E5E00 !important'
  411. ,'}'
  412. ,''
  413. ,'a,a:hover,'
  414. ,'i,'
  415. ,'.zu-autohide,'
  416. ,'.zm-votebar button,'
  417. ,'.zm-item-comment:hover .zm-comment-op-link,'
  418. ,'.zm-comment-op-link,'
  419. ,'.zm-side-trend-row:hover .zm-side-trend-del,'
  420. ,'.zm-side-trend-del,'
  421. ,'.zm-side-nav-li,'
  422. ,'.zu-main-feed-fresh-button,'
  423. ,'.zg-icon,'
  424. ,'.zm-side-nav-li:hover .zg-icon,'
  425. ,'.zm-side-nav-li:hover i,'
  426. ,'.unpin,'
  427. ,'.zm-side-nav-li:hover .unpin {'
  428. ,' -moz-transition:color .2s linear,opacity .15s linear,background-color .2s linear,background-position .2s linear .1s;'
  429. ,' -webkit-transition:color .2s linear,opacity .15s linear,background-color .2s linear,background-position .2s linear .1s;'
  430. ,' transition:color .2s linear,opacity .15s linear,background-color .2s linear,background-position .2s linear .1s;'
  431. ,'}'
  432. ,''
  433. ,'h3{ line-height:25px }'
  434. ,'.zu-footer-inner {padding:15px 0!important}'
  435. ,'.zm-side-pinned-topics .zm-side-nav-li{float:left;padding-right:30px!important}'
  436. ,'.zm-side-list-content{clear:both}'
  437. ,'.unpin{ display:inline-block!important }'
  438. ,''].join('\n');
  439. }
  440.  
  441. var css_comment='';
  442. if(pageIs.Home||pageIs.Question||pageIs.Answer){
  443. css_comment = window.iZhihu.Comment.css;
  444. }
  445.  
  446. css += window.iZhihu.Answer.css;
  447.  
  448. if(window.iZhihu.QuickFavo){
  449. css += window.iZhihu.QuickFavo.css;
  450. }
  451. if(window.iZhihu.QuickBlock){
  452. css += window.iZhihu.QuickBlock.css;
  453. }
  454. if(window.iZhihu.Noti7){
  455. css += window.iZhihu.Noti7.css;
  456. window.iZhihu.Noti7.enhance();
  457. }
  458. var heads = _doc.getElementsByTagName("head");
  459. if (heads.length > 0) {
  460. var node = _doc.createElement("style");
  461. node.type = "text/css";
  462. node.id = "izhCSS_main";
  463. node.appendChild(_doc.createTextNode(css));
  464. heads[0].appendChild(node);
  465. if(css_comment!=''){
  466. node = _doc.createElement("style")
  467. node.type = "text/css";
  468. node.id = "izhCSS_comment";
  469. node.appendChild(_doc.createTextNode(css_comment));
  470. heads[0].appendChild(node);
  471. }
  472. }
  473.  
  474. if(!$('.modal-dialog-bg').length){
  475. $body.append(
  476. $('<div', { id: 'izh-dlg-bg', 'class': 'modal-dialog-bg' }).css({
  477. 'z-index': 95
  478. , 'opacity': 0.5
  479. , 'position': 'fixed'
  480. , 'top': 0
  481. , 'bottom': 0
  482. , 'left': 0
  483. , 'right': 0
  484. , 'display': 'none'
  485. })
  486. );
  487. }
  488.  
  489. window.iZhihu.getItem=function($c){
  490. var $item=$(null);
  491. if($c && $c.length){
  492. var $itemMeta=$c.closest('.zm-item-meta');
  493. if ($itemMeta.is('.feed-meta') || $itemMeta.parent().is('.feed-meta')){
  494. $item=$c.closest('.feed-item');
  495. $item.attr('data-aid', $item.children('meta[itemprop=answer-id]').attr('content'))
  496. }else if($itemMeta.is('.answer-actions')){
  497. $item=$c.closest('.zm-item-answer,.feed-item');
  498. }else{
  499. $item=$itemMeta.prev();
  500. }
  501. }
  502. return $item;
  503. };
  504.  
  505. utils.observeDOMNodeAdded(document.body,function(event){
  506. if(izhTopNavAutoFold){
  507. window.iZhihu.TopNav.onNodeAdded(event)
  508. }
  509. })
  510. /**
  511. * @class Answer
  512. */
  513. function Answer(iZhihu) {
  514. if ( typeof iZhihu === 'undefined' || !iZhihu) {
  515. return null;
  516. }
  517. iZhihu.Answer = this;
  518.  
  519. this._e=null;
  520. this.ppWidth=0;
  521. this.ppHeight=400;
  522.  
  523. this.css =
  524. ['.zm-votebar .izh-button.fold{margin:5px 0px 0px;display:block;color:#698EBF;height:24px;line-height:24px;width:38px;border-radius:3px;border:0px none;cursor:pointer;background:none repeat scroll 0% 0% #EFF6FA;font-weight:font-weight;position:relative;}'
  525. ,''].join('\n');
  526.  
  527. this.processAnswer=function($a,$pp,bAuthorRear,bAuthorList){
  528. if(!$a||!$a.length)return;
  529. if($a.attr('izh_processed')=='1')return;
  530. var selCollapse='.meta-item[name=collapse]'
  531. , $meta=$a.find('.zm-item-meta')
  532. , $author=$a.find('.zm-item-answer-author-info')
  533. , $favo=$a.find('.meta-item[name=favo]')
  534. , $vote=$a.find('.zm-votebar')
  535. ;
  536. if(iZhihu.QuickBlock){
  537. // Region: 快速屏蔽
  538. iZhihu.QuickBlock.addQuickBlock($a)
  539.  
  540. // Region end
  541. }
  542. if($author.length){//relocatePersonInfo
  543. if(bAuthorRear){
  544. $author.css({
  545. 'textAlign':'right'
  546. });
  547. if($a.is('.feed-item')){
  548. $a.find('.entry-body .zm-item-answer-detail .zm-item-rich-text')
  549. .append($author.hide()).bind('DOMNodeInserted',function(event){
  550. var $c=$(event.target);
  551. if($c.is('.zm-editable-content')){
  552. $(this).children('.zm-item-answer-author-info')
  553. .insertBefore($c.children('.answer-date-link-wrap'))
  554. .css({
  555. 'position':'absolute'
  556. , 'right':0
  557. }).show();
  558. }
  559. });
  560. }else{
  561. $author.insertBefore($meta);
  562. }
  563. }
  564. $author=$author.children().eq(1);
  565. if ($pp && bAuthorList){
  566. // Region: 回答目录项
  567. var collapsed=$a.attr('data-collapsed')=='1'
  568. , $ppla=$('<a>',{
  569. href:'#answer-'+$a.attr('data-aid')
  570. , target:'_self'
  571. , style:css_AuthorListItemA
  572. })
  573. , $ppl=$('<li>').append($ppla)
  574. , $uno=iZhihu.$unoAnswers
  575. if(collapsed){
  576. $ppl.appendTo($pp)
  577. }else{
  578. $ppl.insertBefore($uno.$endOfLastA)
  579. }
  580. if($a.attr('data-isowner')=='1'){
  581. iZhihu.Answer._e=$a.get(0);
  582. $ppla.append($('<span>', { 'class': 'me' }));
  583. }
  584. var nameCSS='name';
  585. if($a.attr('data-isfriend')=='1'){
  586. nameCSS+=' friend';
  587. }
  588. if(collapsed){
  589. nameCSS+=' collapsed'
  590. }
  591. if(!$author.length){
  592. nameCSS+=' noname';
  593. }
  594. $('<span>',{
  595. 'class':nameCSS
  596. , style:css_AuthorListItemA_name
  597. }).text(!$author.length?'匿名用户':$author.text()).appendTo($ppla);
  598. if ($ppl.width()>iZhihu.Answer.ppWidth)
  599. iZhihu.Answer.ppWidth=$ppl.width();
  600. // Region end
  601. // Region: 回答篇幅指示
  602. var nHP=Math.ceil($('.zm-editable-content',$a).text().length/100);
  603. $('<span>',{
  604. 'class':'hp'
  605. }).css({'width':nHP*10,'margin-left':-nHP*10}).appendTo($ppla);
  606. // Region end
  607. $ppla.mouseover(function(){
  608. var $frm=$(this.parentNode.parentNode.parentNode)
  609. , $uno=iZhihu.$unoAnswers
  610. $(this).addClass('sel');
  611. if(iZhihu.Answer._e){
  612. $uno.children('.meT').css('display',0>iZhihu.Answer._e.offsetTop-$frm.scrollTop()?'':'none');
  613. $uno.children('.meB').css('display',$frm.height()<iZhihu.Answer._e.offsetTop-$frm.scrollTop()+iZhihu.Answer._e.offsetHeight?'':'none');
  614. }
  615. // Region: 回答预览
  616. var nam=$('span.name',this);
  617. if(!nam.length)return;
  618. var aid=$(this).attr('href').replace('#answer-','')
  619. , prv=$uno.next('.izh-answer-preview')
  620. , top=$(this).position().top+$uno.position().top
  621. , sel='.zm-item-answer[data-aid='+aid+'] > .zm-item-rich-text'
  622. , ctx=nam.is('.collapsed')?'#zh-question-collapsed-wrap':'#zh-question-answer-wrap'
  623. , div=$(sel,ctx)
  624. , cmt=$('.zm-item-meta > .zu-question-answer-meta-comment',div.parent())
  625. ;
  626. if(!prv.length){
  627. prv=$('<div>',{
  628. 'class':div.class
  629. })
  630. .addClass('izh-answer-preview').width(div.width()+22)
  631. .mouseover(function(){$uno.mouseover();$('li a[href=#'+$(this).attr('data-aid')+']',$uno).addClass('sel');$(this).show();})
  632. .mouseout(function(){$uno.mouseout();$('li a[href=#'+$(this).attr('data-aid')+']',$uno).removeClass('sel');$(this).hide();})
  633. .click(function(){$('li a[href=#'+$(this).attr('data-aid')+']',$uno)[0].click();})
  634. .insertAfter($uno)
  635. ;
  636. }
  637. if(prv.attr('data-aid')!=aid){
  638. prv.attr('data-aid',aid).empty().append(div.clone().children()).find('a').attr('onclick','return false;');
  639. if($('span.me',this).length)
  640. prv.find('a.zu-edit-button').remove();
  641. if(!nam.hasClass('noname'))
  642. $('img.zm-list-avatar',div.parent()).clone().appendTo(prv);
  643. var t=cmt.text(),i=t.indexOf('条评论');
  644. if(cmt.length&&i>0)
  645. $('<span>',{'class':'comment'}).text(t.substring(0,i)).prepend(cmt.children('i').clone()).appendTo(prv);
  646. }
  647. var th=div.height()+33
  648. , maxTop=$uno.position().top+12
  649. , contentPosition='';
  650. if(maxTop+th<$win.height()){
  651. if(top+th<$win.height()){
  652. prv.css({'top':top>maxTop?top:maxTop,'bottom':''});
  653. }else{
  654. prv.css({'top':'','bottom':0});
  655. }
  656. }else{
  657. prv.css({'top':maxTop,'bottom':0});
  658. contentPosition='absolute';
  659. }
  660. prv.css({'left':$uno.width()}).show().children().first().css('position',contentPosition);
  661. // Region end
  662. }).mouseout(function(){
  663. $(this).removeClass('sel');
  664. var $uno=$(this.parentNode.parentNode.parentNode.parentNode);
  665. $uno.next().hide();
  666. }).click(function(){$(this).mouseout();
  667. iZhihu.$unoAnswers.css('left',9-iZhihu.$unoAnswers.width());});
  668. if(iZhihu.Answer._e==$a.get(0)){
  669. iZhihu.Answer._e=$ppla.get(0);
  670. }
  671. }
  672. }
  673.  
  674. if(iZhihu.QuickFavo)
  675. iZhihu.QuickFavo.addQuickFavo($favo,$a);
  676.  
  677. $meta.bind('DOMNodeInserted',function(event){
  678. iZhihu.Comment.processComment($(event.target));
  679. });
  680. iZhihu.Comment.processCommentButton($a);
  681.  
  682. var $cm=$('.zm-comment-box',$a);
  683. if($cm.length && $cm.is(':visible')){
  684. var focusName = iZhihu.Comment.scrollFocusCommentOnPageLoad($cm);
  685. iZhihu.Comment.metaScrollToViewBottom($cm.closest('.zm-item-meta'),function(){
  686. iZhihu.Comment.processComment($cm, focusName);
  687. });
  688. }
  689. $a.attr('izh_processed','1');
  690. };
  691.  
  692. return this;
  693. }
  694.  
  695. /**
  696. * @class Comment
  697. */
  698. function Comment(iZhihu) {
  699. if ( typeof iZhihu === 'undefined' || !iZhihu) {
  700. return null;
  701. }
  702. iZhihu.Comment = this;
  703.  
  704. var css_comment={
  705. 'background-color':'#fff'
  706. , 'outline':'none'
  707. , 'z-index':'9999'
  708. , 'border-radius':'0 6px 0 0'
  709. , 'position':'absolute'
  710. , 'visibility':'hidden'
  711. , 'top':-70
  712. }
  713. ;
  714. this.RightComment = iZhihu.config['ShowComment'];
  715. this.AutoScrollPageWhenClosing = iZhihu.config['RightComment_AutoScrollPageWhenClosing'];
  716. if (!this.RightComment){
  717. this.css =
  718. ['.zm-comment-box.empty .izh-button-cc{display:none;}'
  719. ,''].join('\n');
  720. } else {
  721. this.css =
  722. ['.mention-popup{z-index:10000 !important;}'
  723. ,'.zm-item-meta .meta-item.toggle-comment{display:block;float:right;margin-left:7px !important;}'
  724. ,'.zm-comment-box{position:absolute;margin-top:0;}'
  725. ,'.zm-comment-box .icon-spike{display:none !important;}'
  726. ,'.zm-comment-box > .zm-comment-box-ft{position:absolute;top:0;left:0;right:0;}'
  727. ,'.zm-comment-box.empty{padding-top:10px !important;}'
  728. ,'.zm-comment-box > .zm-comment-form{margin:15px !important;}'
  729. ,'.zm-comment-box.empty > .zm-comment-form{bottom:25px;}'
  730. ,'.zm-comment-box > .zm-comment-form .zm-comment-editable{position:absolute;bottom:60px;top:0;left:0;right:0;overflow:auto;}'
  731. ,'.zm-comment-box.empty > .zm-comment-form .zm-comment-editable{bottom:25px;}'
  732. ,'.zm-comment-box > .zm-comment-form .zm-command{position:absolute;left:0;right:0;bottom:40px;}'
  733. ,'.zm-comment-box.empty > .zm-comment-form .zm-command{bottom:10px;}'
  734. ,'.zm-comment-box [class^=izh-buttons-cm]{position:absolute;top:70px;}'
  735. ,'.zm-comment-box.empty [class^=izh-buttons-cm]{top:auto;bottom:30px;z-index:10;}'
  736. ,'.zm-comment-box .izh-buttons-cm-L{left:0;}'
  737. ,'.zm-comment-box .izh-buttons-cm-L > a{margin-right:7px;}'
  738. ,'.zm-comment-box .izh-buttons-cm-R{right:1em;}'
  739. ,'.zm-comment-box .izh-buttons-cm-R > a{margin-left:7px;}'
  740. ,'.zm-comment-box a.izh-button.on{color:#225599;text-shadow:0 0 1px #225599;}'
  741. ,'.zm-comment-box a.izh-button .zg-icon{opacity:0.5;}'
  742. ,'.zm-comment-box a.izh-button.on .zg-icon{opacity:1;}'
  743. ,'.zm-comment-box a.izh-button.off{color:#eee;}'
  744. ,'.zm-comment-box a.izh-button.off .zg-icon{opacity:0.2;}'
  745. //,'.zm-comment-box.empty [class^=izh-buttons-cm]{top:auto;bottom:7px;}'
  746. ,'.zm-comment-box.empty .zm-comment-list{visibility:hidden;}'
  747. ,'.zm-comment-box .zm-comment-list .zm-item-comment[izh_hilight]{background-color:rgb(255,255,160);}'
  748. ,'.zm-comment-box .izh-button.on .zg-icon-comment-like{background-position:-222px -79px;}'
  749. ,'.zm-comment-box .izh-button .z-icon-fold{height:6px;}'
  750. ,''].join('\n');
  751. this.onWinLoad=function(){
  752. var iZhihu=window.iZhihu;
  753. iZhihu.$win.scroll(function(event){
  754. if(iZhihu.Comment.Opening&&!iZhihu.Comment.PageNotScroll){
  755. var animate=true;
  756. iZhihu.Comment.box($(iZhihu.Comment.Opening),true,animate);
  757. }
  758. });
  759. iZhihu.$win.resize(function(event){
  760. if(iZhihu.Comment.Opening){
  761. var $cm=$(iZhihu.Comment.Opening);
  762. iZhihu.Comment.Opening = null;
  763. iZhihu.Comment.close(null,$cm);
  764. iZhihu.Comment.open(null,$cm);
  765. }
  766. });
  767. if(iZhihu.ScrollTop){
  768. document.body.scrollTop=iZhihu.ScrollTop;
  769. }
  770. }
  771. this.onWinLoad()
  772. }
  773. this.processCommentButton = function($a){
  774. if(iZhihu.Comment.RightComment){
  775. var $bc=$a.find('.meta-item.toggle-comment');
  776. $bc.prependTo($bc.parent());
  777. }
  778. };
  779. this.scrollFocusCommentOnPageLoad = function($cm){
  780. if(!iZhihu.Comment.RightComment)return;
  781. var focusName=url.data.attr.fragment;
  782. if(!focusName||focusName=='')return;
  783. if(window.iZhihu4CRX){
  784. var $icm2C=$cm.find('.zm-comment-list .zm-item-comment a.zg-anchor-hidden[name="'+focusName+'"]').parent()
  785. , offsetTop=$icm2C.length?$icm2C.offset().top:0
  786. ;if(offsetTop){document.body.scrollTop=offsetTop;}
  787. }
  788. return focusName;
  789. };
  790. this.metaScrollToViewBottom = function($itemMeta,funcAfterScroll,always,animate){
  791. if(!iZhihu.Comment.RightComment || !iZhihu.Comment.AutoScrollPageWhenClosing){
  792. if(funcAfterScroll){funcAfterScroll();}
  793. return;
  794. }
  795. if(typeof always === 'undefined')always=true;//if false, scrolling only when the .zm-item-meta out of visible range
  796. if(typeof animate === 'undefined')animate=false;//if false, scrolling instantly
  797. if(always)$itemMeta.children('.zm-comment-box').css('position','fixed');
  798. var winHeight=iZhihu.$win.height()
  799. , scrollObj=window.iZhihu4CRX?document.body:document.documentElement
  800. , scrollTopNow=scrollObj.scrollTop
  801. , navHeight=iZhihu.$body.children().first().height()
  802. , bar=$('.zu-global-notify.zu-global-notify-info:visible')
  803. , barHeight=!bar.length?0:bar.outerHeight()
  804. , baseTop=((barHeight&&bar.css('position')=='fixed')?barHeight:(scrollTopNow>barHeight?0:barHeight-scrollTopNow))+navHeight
  805. , maxHeight=winHeight-baseTop
  806. , metaHeight=$itemMeta.innerHeight()
  807. , offsetTop=$itemMeta.offset().top
  808. , offsetBottom=offsetTop+metaHeight
  809. , $item=iZhihu.getItem($itemMeta)
  810. , itemHeight=$item.innerHeight()
  811. , offsetTopA=$item.offset().top
  812. , offsetBottomA=offsetTopA+itemHeight
  813. , scrollTopEnd=itemHeight>maxHeight?offsetBottom-winHeight:(offsetTopA<=scrollTopNow?offsetTopA-baseTop:offsetBottom-winHeight)
  814. ;
  815. if(!always){
  816. always=offsetTop<scrollTopNow+baseTop||offsetBottom>scrollTopNow+winHeight-baseTop;
  817. }
  818. if(always){
  819. iZhihu.ScrollTop=scrollTopEnd;
  820. if(animate){
  821. $(scrollObj).animate({'scrollTop':scrollTopEnd},funcAfterScroll);
  822. }else{
  823. $(scrollObj).scrollTop(scrollTopEnd);
  824. if(funcAfterScroll){funcAfterScroll();}
  825. }
  826. }else{
  827. if(funcAfterScroll){funcAfterScroll();}
  828. }
  829. };
  830. this.box = function($cm,keepSize,animate){if(!$cm||!$cm.length)return;
  831. $cm.stop();
  832. if(typeof keepSize === 'undefined')keepSize=false;
  833. if(typeof animate === 'undefined')animate=false;
  834. var winHeight=iZhihu.$win.height()
  835. , th=keepSize?parseInt($cm.attr('izh_cmHeight')):0
  836. , scrollTop=(document.body.scrollTop)?document.body.scrollTop:document.documentElement.scrollTop
  837. , navHeight=iZhihu.$body.children().first().height()
  838. , bar=$('.zu-global-notify.zu-global-notify-info:visible')
  839. , barHeight=!bar.length?0:bar.outerHeight()
  840. , baseTop=((barHeight&&bar.css('position')=='fixed')?barHeight:(scrollTop>barHeight?0:barHeight-scrollTop))+navHeight
  841. , minHeight=112
  842. , maxHeight=winHeight-baseTop-35
  843. , tooSmall=maxHeight<minHeight
  844. , $meta=$cm.closest('.zm-item-meta')
  845. , metaHeight=2*$meta.height()-$meta.innerHeight()
  846. , offsetTop=scrollTop-$meta.offset().top
  847. , offsetBottom=-offsetTop-winHeight
  848. ;if(tooSmall)maxHeight=minHeight;
  849. if(!th||isNaN(th)){
  850. var $t=$cm.clone().css({'position':'absolute','z-index':'-1'}).appendTo(document.body).show()
  851. , $l=$t.children('.zm-comment-list')
  852. ;
  853. if(!$cm.is('.empty')&&$l.children().length>0)$l.css({'position':'absolute','height':'','top':'','bottom':''});
  854. th=$l.height();
  855. th+=th==0?minHeight:100;
  856. $t.remove();$t=null;//console.log(th);
  857. $cm.css('height',th<=minHeight?minHeight:(th<maxHeight?th-100:maxHeight-80));
  858. }
  859. var target={},other={'height':''};
  860. $cm.attr('izh_cmHeight',th).css({'display':'','visibility':'visible','position':'absolute'});
  861. if(th<=maxHeight){
  862. var top=-offsetTop-70,fixHeight=(th<=minHeight?-1:7);
  863. if(!tooSmall&&top+th>winHeight){
  864. target={'top':-offsetBottom-th-metaHeight+fixHeight,'bottom':offsetBottom};
  865. }else{
  866. offsetTop+=((!tooSmall)&&top>baseTop?top:baseTop);
  867. target={'top':offsetTop,'bottom':-offsetTop-th-metaHeight+fixHeight};
  868. }
  869. $cm.filter('.empty').find('.zm-comment-form .zm-comment-editable').css({'bottom':''});
  870. }else{
  871. target={'top':offsetTop+baseTop,'bottom':offsetBottom};
  872. $cm.filter('.empty').find('.zm-comment-form .zm-comment-editable').css({'bottom':'20px'});
  873. }
  874. if(animate){
  875. $cm.animate(target,function(){$cm.css(other);});
  876. }else{
  877. $cm.css($.extend(target,other));
  878. }
  879. $cm;
  880. };
  881. this.open = function($ac,$cm,icmFocus){// if $ac is null, just re-sizing and re-locating comment-box
  882. var noCommentOpening = iZhihu.Comment.Opening == null;
  883. iZhihu.Comment.Opening = $cm.attr('izh-opening','1').css({'display':'none'}).get(0);
  884. $('.zm-comment-box:visible:not([izh-opening=1])')
  885. .each(function(i,e){
  886. $(e).css('visibility','hidden').closest('.zm-item-meta').find('.toggle-comment')[0].click();
  887. });
  888. var winWidth=iZhihu.$win.width()
  889. , mcLeft=iZhihu.$main.offset().left
  890. , $ct=$cm.closest('.zu-main-content-inner')
  891. , ctMarginL=parseInt($ct.css('margin-left'))
  892. , ctWidth=$ct.width()+ctMarginL
  893. , ctLeft=$ct.offset().left-ctMarginL
  894. , $meta=$cm.closest('.zm-item-meta')
  895. , mtWidth=$meta.innerWidth()
  896. , minWidth=iZhihu.$main.width()-ctWidth
  897. , cmWidth=mtWidth
  898. , maxWidth=winWidth-ctWidth
  899. , o=function(){
  900. $cm.attr('opened','1');
  901. if(!$ac){
  902. iZhihu.Comment.box($cm);
  903. return;
  904. }
  905. var currTop=_doc.body.scrollTop
  906. , $n=$ac.next(),$n=$n.length?$n:$ac.parent().next()
  907. , t=$ac.offset().top-iZhihu.$main.offset().top
  908. , b=$ac.offset().top-iZhihu.$main.offset().top
  909. , w=$ac.width()
  910. , inAnswer=$ac.is('.zm-item-answer')
  911. , inQuestion=$ac.is('#zh-question-detail')
  912. , $questionMeta=$('#zh-question-meta-wrap')//question_meta
  913. , h=inQuestion?$questionMeta.offset().top+$questionMeta.height()+parseInt($questionMeta.css('padding-bottom'))-iZhihu.$main.offset().top
  914. :$ac.height()+parseInt($ac.css('padding-bottom'))+parseInt($n.css('padding-top'))
  915. ;
  916. if(!$ac.find('.izh_tape_a,.izh_tape_b').length)
  917. $ac
  918. .append($('<div>', { 'class': 'izh_tape_a' }))
  919. .append($('<div>', { 'class': 'izh_tape_b' }))
  920. if(!$cm)$cm=$ac.find('.zm-comment-box');
  921. if($cm.length){
  922. if(!$cm.attr('tabindex')){
  923. $cm.attr('tabindex','-1').focus();
  924. }
  925. if(inQuestion){
  926. $('#izh_QuestionShadow').css({
  927. 'height':h
  928. , 'margin-bottom':-h
  929. }).show();
  930. $questionMeta.next(':visible').andSelf().addClass('izh_noBorder');
  931. }else{
  932. $ac.addClass('izh_boxShadow');
  933. }
  934. $ac.find('.izh_tape_a').css({
  935. 'position':'absolute'
  936. , 'width':1
  937. , 'height':h
  938. , 'top':0
  939. , 'margin-left':w-1
  940. , 'z-index':'10000'
  941. , 'background-color':'#fff'
  942. }).show();
  943. iZhihu.Comment.box(
  944. $cm.css({'left':mtWidth-1}).attr('izh_inQuestion',inQuestion?'1':'0').removeAttr('izh-opening')
  945. );
  946. $('.mention-popup').attr('data-aid',$ac.attr('data-aid'));
  947. }else{
  948. $ac.find('.zu-question-answer-meta-comment')[0].click();
  949. }
  950. $ac.find('.izh_tape_b').css({
  951. 'position':'absolute'
  952. , 'width':1
  953. , 'height':h
  954. , 'top':0
  955. , 'margin-left':w
  956. , 'z-index':'9998'
  957. , 'background-color':'#eee'
  958. }).show();
  959. //$ac.css('border-color','#999999');
  960. //$n.css('border-color','#999999');
  961. $('.zh-backtotop').css('visibility','hidden');
  962. iZhihu.$body.scrollTop(currTop);
  963. if(icmFocus){
  964. var $icm=$(icmFocus).attr('izh_hilight','1')
  965. , $list=$icm.closest('.zm-comment-list');
  966. $list.scrollTop(icmFocus.offsetTop-$list.get(0).offsetTop);
  967. iZhihu.Comment.HiLightItem=icmFocus;
  968. iZhihu.Comment.HiLightColor='rgb(255,255,160)';
  969. $icm.click(function(){
  970. var iZhihu=window.iZhihu;
  971. if(iZhihu&&iZhihu.Comment.HiLightItem){
  972. $(iZhihu.Comment.HiLightItem).removeAttr('izh_hilight');
  973. }
  974. });
  975. }
  976. };
  977.  
  978. if(maxWidth>549)maxWidth=549;
  979. if(cmWidth>maxWidth)
  980. cmWidth=maxWidth;
  981. if(cmWidth<minWidth)
  982. cmWidth=minWidth;
  983. $cm.addClass('izh_boxShadow').css($.extend(css_comment,{'width':cmWidth-9}));
  984. //if(!$cm.is('.empty'))
  985. $cm.css({'padding':'100px 0px 0px 7px'});
  986. $('i.zm-comment-bubble',$cm).hide();
  987. if(noCommentOpening){
  988. var cmWidthOver=cmWidth-winWidth
  989. , shiftLeft=cmWidthOver+ctWidth+ctLeft
  990. ;
  991. if(shiftLeft>0){
  992. if(shiftLeft>ctLeft){shiftLeft=mcLeft;}
  993. else if(cmWidthOver>0){shiftLeft-=cmWidthOver;}
  994. }
  995. if(shiftLeft<0){shiftLeft=0;}
  996. if(shiftLeft && $ac){
  997. $ct.css({'position':'relative','left':0}).animate({left:-shiftLeft},o);
  998. }else{
  999. $ct.css({'position':'relative','left':-shiftLeft});
  1000. o();
  1001. }
  1002. }else{
  1003. o();
  1004. }
  1005. };
  1006. this.close = function($ac,$cm){
  1007. if(!$cm)$cm=$ac.find('.zm-comment-box');
  1008. var $ct=$cm.closest('.zu-main-content-inner');
  1009. var o=function(){
  1010. $(this).css('position','');
  1011. if(!$ac)return;
  1012. var $n=$ac.next()
  1013. , $n=$n.length?$n:$ac.parent().next()
  1014. , inQuestion=$ac.is('#zh-question-detail');
  1015. if(!$ac){return;}
  1016. if(inQuestion){
  1017. $('#izh_QuestionShadow').hide();
  1018. $('#zh-question-meta-wrap').next(':visible').andSelf().removeClass('izh_noBorder');
  1019. }else{
  1020. $ac.removeClass('izh_boxShadow');
  1021. }
  1022. //$ac.css('border-color','#DDDDDD');
  1023. //$n.css('border-color','#DDDDDD');
  1024. $('.izh_tape_a:visible,.izh_tape_b:visible').hide();
  1025. $('.zh-backtotop').css('visibility','visible');
  1026. };
  1027.  
  1028. if(iZhihu.Comment.Opening == $cm.get(0)){
  1029. iZhihu.Comment.Opening = null;
  1030. $ct.animate({left:0},o);
  1031. }else{
  1032. if(!$ac){$ct.css({left:0});}
  1033. o();
  1034. }
  1035. };
  1036. this.processComment = function($cm,focusName){
  1037. var loading=false;
  1038. if($cm.is('.zm-comment-spinner')){
  1039. $cm=$cm.closest('.zm-comment-box');
  1040. loading=true;
  1041. }
  1042. if(!$cm.is('.zm-comment-box'))return;
  1043. var $item=iZhihu.getItem($cm);
  1044. if(iZhihu.Comment.RightComment&&loading){
  1045. var cmLeft=$item.width()-1;
  1046. $cm.css({'left':cmLeft,'width':216,'z-index':'10000'});
  1047. }
  1048. if($cm.filter('.zm-comment-box').has('.zm-comment-list').length){
  1049. /* Collections for comment
  1050. $cm.find('.zm-comment-editable').bind('DOMNodeInserted',function(event){
  1051. var $c=$(event.target),$cm=$c.closest('.zm-comment-box');
  1052. if($c.is('a.member_mention')){
  1053. if($cm.children('.izh_collections').length<=0){
  1054. $('<div class="izh_collections">loading...</div>').bind('mouseover',function(){
  1055. $(this).show();
  1056. }).bind('mouseout',function(){
  1057. $(this).hide();
  1058. }).appendTo($cm);
  1059. }
  1060. $c.bind('mouseover',function(){
  1061. var $ce=$(this).closest('.zm-comment-editable'),$cm=$(this).closest('.zm-comment-box');
  1062. $cm.children('.izh_collections').css({
  1063. 'bottom':$(this).height()-$(this).position().top-1
  1064. , 'left':$(this).position().left
  1065. }).show();
  1066. $.post('http://www.zhihu.com'+$(this).attr('href')+'/collections'
  1067. , $.param({_xsrf:$('input[name=_xsrf]').val()})
  1068. , function(result,status,xhr){
  1069. console.log(result);
  1070. });
  1071. });
  1072. $c.bind('mouseout',function(){
  1073. var $ce=$(this).closest('.zm-comment-editable'),$cm=$(this).closest('.zm-comment-box');
  1074. $cm.children('.izh_collections').hide();
  1075. });
  1076. }
  1077. });
  1078. */
  1079. if(iZhihu.Comment.RightComment){
  1080. $cm.closest('.zm-item-meta').find('.toggle-comment').click(function(event){
  1081. var $openedBy=$(this)
  1082. , $ac=$openedBy.closest('.zm-item-meta')
  1083. , $cm=($ac.parent().is('.zm-item-meta.feed-meta')?$ac.parent():$ac).find('.zm-comment-box').css('visibility','hidden')
  1084. ;
  1085. if($cm.length){
  1086. var $item=iZhihu.getItem($cm);
  1087. if($cm.is(':hidden')){
  1088. iZhihu.Comment.open($item,$cm);
  1089. }else{
  1090. iZhihu.Comment.close($item,$cm);
  1091. }
  1092. }
  1093. });
  1094. }
  1095. //if($cm.is('.empty')) return;
  1096. var $list=$cm.find('.zm-comment-list');
  1097. $list.bind('DOMNodeInserted',function(event){
  1098. //utils.observeDOMNodeAdded($list[0],function(event){
  1099. /*if(!event.addedNodes)return;
  1100. console.log('Nodes '+event.addedNodes.length+' inserted');
  1101. for(var i=0;i<event.addedNodes.length;i++){
  1102. var $icm=$(event.addedNodes[i]);
  1103. }*/
  1104. var $icm=$(event.target).filter('.zm-item-comment,.zm-comment-form');
  1105. if(!$icm.length)return;
  1106. var $list=$(this)
  1107. , $cm=$list.closest('.zm-comment-box:visible');
  1108. if($icm.is('.zm-item-comment')){
  1109. //console.log($icm);
  1110. if(iZhihu.QuickBlock){
  1111. //console.log('Adding QuickBlock');
  1112. iZhihu.QuickBlock.addQuickBlockInOneComment($icm);
  1113. }
  1114. if(iZhihu.Comment.RightComment){
  1115. $list.css('height','100%');
  1116. $icm.show().bind('DOMNodeRemoved',function(event){
  1117. var $icm=$(event.target);
  1118. if(!$icm.is('.zm-item-comment'))return;
  1119. var $list=$icm.hide().closest('.zm-comment-list')
  1120. , $cm=$list.closest('.zm-comment-box:visible');
  1121. if($cm.length){
  1122. //console.log('Refreshing comment list');
  1123. if($list.children().length==1){
  1124. $('.izh-quick-block-switch',$cm).add('.izh-buttons-cm-R',$cm).hide();
  1125. }
  1126. iZhihu.Comment.box($cm,false,false);
  1127. }
  1128. });
  1129. if($cm.length){
  1130. var countNow=$list.children().length
  1131. , countAll=parseInt($cm.attr('data-count'))
  1132. , countRest=countAll-countNow
  1133. , notAll=$(this).has('.load-more').length
  1134. ;
  1135. if((!notAll)&&countRest>1){
  1136. return;
  1137. }
  1138. //console.log('Refreshing comment list');
  1139. $('.izh-quick-block-switch',$cm).add('.izh-buttons-cm-R',$cm).show();
  1140. iZhihu.Comment.box($cm,false,false);
  1141. if(notAll||countRest<0)$list.scrollTop($icm.get(0).offsetTop);
  1142. }
  1143. }
  1144. }else if($icm.is('.zm-comment-form')){
  1145. if(iZhihu.Comment.RightComment){
  1146. if($cm.length){
  1147. var $rcm=$icm;
  1148. $icm=$rcm.closest('.zm-item-comment');
  1149. $rcm.find('a.zm-comment-close.zm-command-cancel').click(function(event){
  1150. var $rcm=$(this).closest('.zm-comment-form').hide()
  1151. , $cm=$rcm.closest('.zm-comment-box:visible');
  1152. if($cm.length){
  1153. iZhihu.Comment.box($cm,false,false);
  1154. }
  1155. });
  1156. $rcm.parent().find('a.reply.zm-comment-op-link').click(function(event){
  1157. var $rcm=$(this).closest('.zm-comment-content-wrap').children('.zm-comment-form').toggle()
  1158. , $icm=$(this).closest('.zm-item-comment')
  1159. , $list=$icm.closest('.zm-comment-list')
  1160. , $cm=$list.closest('.zm-comment-box:visible');
  1161. if($cm.length){
  1162. iZhihu.Comment.box($cm,false,false);
  1163. if($rcm.is(':visible'))$list.scrollTop($icm.get(0).offsetTop-$list.get(0).offsetTop);
  1164. $rcm.toggle();
  1165. }
  1166. });
  1167. iZhihu.Comment.box($cm,false,false);
  1168. $list.scrollTop($icm.get(0).offsetTop-$list.get(0).offsetTop);
  1169. }
  1170. }
  1171. }
  1172. });
  1173. var cmClose=function(event,alsoScrollToViewBottom){
  1174. var $cm=$(this).closest('.zm-comment-box');
  1175. if($(this).is('[name=closeform]')&&(!$cm.is('.empty')))return;
  1176. var $item=iZhihu.getItem($cm)//.attr('tabindex','-1').focus().removeAttr('tabindex')
  1177. , $itemMeta=$cm.closest('.zm-item-meta')
  1178. , alsoScroll=this.getAttribute('izh-alsoScrollToViewBottom')||''
  1179. , scrollTop=(document.body.scrollTop)?document.body.scrollTop:document.documentElement.scrollTop
  1180. ;
  1181. if(alsoScroll!=='1'){
  1182. $itemMeta.find('.toggle-comment')[0].click();
  1183. setTimeout(function(){
  1184. document.body.scrollTop=scrollTop;
  1185. document.documentElement.scrollTop=scrollTop;
  1186. },100);
  1187. return;
  1188. }
  1189. iZhihu.Comment.metaScrollToViewBottom($itemMeta,function(){
  1190. $itemMeta.find('.toggle-comment')[0].click();
  1191. },false,true);
  1192. }
  1193. , $btnCC=$('<a>',{
  1194. 'class':'zu-question-answer-meta-comment izh-button-cc'
  1195. , href:'javascript:void(0);'
  1196. , click:cmClose
  1197. , 'data-tip':'s$t$收起评论并跳转至所属回答'
  1198. }).text('收起')
  1199. , $buttonsL=$('<div>',{
  1200. 'class':'izh-buttons-cm-L'
  1201. }).prependTo($cm)
  1202. , $buttonsR=$('<div>',{
  1203. 'class':'izh-buttons-cm-R'
  1204. })
  1205. ;
  1206. if(iZhihu.Comment.RightComment){
  1207. $cm.children('.zm-comment-form').find('[name=closeform]').click(cmClose);
  1208. $btnCC.clone(true).css({
  1209. 'background-image': 'url("/static/img/sprites-1.9.2.png")'
  1210. , 'background-position': '-261px -62px'
  1211. , 'background-repeat': 'no-repeat'
  1212. , 'display': 'inline-block'
  1213. , 'width': 15
  1214. , 'height': 15
  1215. , 'position': 'absolute'
  1216. , 'left': 0
  1217. , 'top': 0
  1218. , 'z-index': '10000'
  1219. }).attr('data-tip','s$l$收起评论').text('').prependTo($cm)
  1220. $buttonsR.prependTo($cm);
  1221. if($list.children().length==0){
  1222. $buttonsR.hide();
  1223. }
  1224. $btnCC.css({
  1225. 'float':'left'
  1226. , 'margin-left':7
  1227. }).attr('izh-alsoScrollToViewBottom','1').prepend('<i class="z-icon-izh-fold"/>').prependTo($buttonsL);
  1228. $('<a>',{
  1229. 'class':'izh-button izh-back-top'
  1230. , 'data-tip':'s$l$返回顶部'
  1231. , href:'javascript:void(0);'
  1232. , click:function(){
  1233. $(this.parentNode).nextAll('.zm-comment-list').scrollTop(0);
  1234. }
  1235. }).append(
  1236. $('<i>', { 'class': 'zg-icon z-icon-fold' })
  1237. ).add(
  1238. $('<a>',{
  1239. 'class':'izh-button izh-show-good'
  1240. , 'data-tip':'s$l$人气妙评'
  1241. , href:'javascript:void(0);'
  1242. , click:function(){
  1243. var $e=$(this)
  1244. , $c=$e.closest('.zm-comment-box')
  1245. , $l=$c.find('.zm-comment-list')
  1246. , $n=$l.find('.zm-item-comment').has('span.like-num.nil')
  1247. ;
  1248. if($e.hasClass('on')){
  1249. $e.attr('scrollTop_showgood',$l[0].scrollTop);
  1250. $n.show();
  1251. iZhihu.Comment.box($c,false,false);
  1252. $e.removeClass('on');
  1253. var scrollTop = parseInt($e.attr('scrollTop'));
  1254. if(!isNaN(scrollTop))
  1255. $l.scrollTop(scrollTop);
  1256. }else{
  1257. $e.attr('scrollTop',$l[0].scrollTop);
  1258. $n.hide();
  1259. iZhihu.Comment.box($c,false,false);
  1260. $e.addClass('on');
  1261. var scrollTop = parseInt($e.attr('scrollTop_showgood'));
  1262. if(!isNaN(scrollTop))
  1263. $l.scrollTop(scrollTop);
  1264. }
  1265. }
  1266. }).append(
  1267. $('<i>', { 'class': 'zg-icon zg-icon-comment-like' })
  1268. )
  1269. ).css({
  1270. 'float':'right'
  1271. }).appendTo($buttonsR);
  1272.  
  1273. iZhihu.Comment.PageNotScroll = true;
  1274. $list.scroll(function(){
  1275. var $e=$(this)
  1276. , $b=$e.closest('.zm-comment-box').find('.izh-back-top')
  1277. ;
  1278. if($e.height() < this.scrollTop){
  1279. $b.removeClass('off');
  1280. }else{
  1281. $b.addClass('off');
  1282. }
  1283. }).scroll();
  1284. iZhihu.Comment.PageNotScroll = false;
  1285.  
  1286. var icmFocus=null;
  1287. $list.css({
  1288. 'height':$cm.is('.empty')?'':'100%'
  1289. , 'overflow':'auto'
  1290. });
  1291. $list.children('.zm-item-comment').each(function(i,e){
  1292. var $icm=$(e);
  1293. $icm.bind('DOMNodeRemoved',function(event){
  1294. var $icm=$(event.target);
  1295. if(!$icm.is('.zm-item-comment'))return;
  1296. var $cm=$icm.hide().closest('.zm-comment-box:visible');
  1297. if($cm.length){
  1298. if($(this).closest('.zm-comment-list').children().length==1){
  1299. $('.izh-quick-block-switch',$cm).add('.izh-buttons-cm-R',$cm).hide();
  1300. }
  1301. iZhihu.Comment.box($cm,false,false);
  1302. }
  1303. });
  1304. $icm.find('span.like-num').each(function(i,e){
  1305. var tip=e.getAttribute('data-tip').replace('s$r$','s$l$');
  1306. if(tip!='')e.setAttribute('data-tip',tip);
  1307. });
  1308. if (!icmFocus&&focusName&&focusName!=''
  1309. && $icm.children('a.zg-anchor-hidden[name="'+focusName+'"]').length){
  1310. icmFocus=$icm.get(0);
  1311. }
  1312. });
  1313. iZhihu.Comment.open($item,$cm,icmFocus);
  1314. utils.observeDOMNodeAdded($cm.children('.zm-comment-form').children('.zm-comment-editable')[0],function(event){
  1315. var $e=$(event.target)
  1316. , $f=$e.closest('.zm-comment-form')
  1317. , $l=$f.prev('.zm-comment-list')
  1318. , $c=$f.closest('.zm-comment-box[opened=1]')
  1319. , ch=$c.height()
  1320. , winHeight=iZhihu.$win.height()
  1321. , scrollTop=document.documentElement.scrollTop+document.body.scrollTop
  1322. , navHeight=iZhihu.$body.children().first().height()
  1323. , bar=$('.zu-global-notify.zu-global-notify-info:visible')
  1324. , barHeight=!bar.length?0:bar.outerHeight()
  1325. , baseTop=((barHeight&&bar.css('position')=='fixed')?barHeight:(scrollTop>barHeight?0:barHeight-scrollTop))+navHeight
  1326. , minHeight=112
  1327. , maxHeight=winHeight-baseTop-35
  1328. ;
  1329. if(!$c.length)return;
  1330. if(!$c.is('.empty')&&$l.children().length>0){
  1331. lh=$l.height();
  1332. }else{
  1333. lh=0;
  1334. }
  1335. var $t=$e.clone().appendTo(document.body)
  1336. .css({'position':'absolute','z-index':'-1','width':$e.width(),'min-height':22})
  1337. , eh=$t.height()
  1338. , h=Math.max(eh,lh)+(lh==0?90:100)
  1339. ;
  1340. $t.remove();$t=null;
  1341. if(isNaN(ch)||ch!=h){
  1342. $c.attr('izh_cmHeight',h);
  1343. iZhihu.Comment.box($c,true,false);
  1344. }
  1345. if(!$f.is('.expanded')&&event.addedNodes.length){
  1346. $f.css({'height':'','bottom':''});
  1347. }else{
  1348. eh+=30;
  1349. $f.css(lh==0||eh>ch?{'height':'','bottom':25}:{'height':eh,'bottom':''});
  1350. }
  1351. });
  1352. }else{
  1353. $btnCC.prepend('<i class="z-icon-fold"/>')
  1354. .css({
  1355. 'position':'absolute'
  1356. , 'cursor':'pointer'
  1357. , 'margin-left':-1
  1358. , 'left':0
  1359. , 'background-color':'#fbfbfb'
  1360. , 'padding':'2px 5px'
  1361. , 'bottom':-22
  1362. , 'border':'1px solid #ddd'
  1363. , 'border-radius':'4px'
  1364. }).insertBefore($cm.find('.zm-comment-box-ft'));
  1365. }
  1366. if(iZhihu.QuickBlock){
  1367. iZhihu.QuickBlock.addQuickBlockInCommentList($buttonsL);
  1368. }
  1369. }
  1370. };
  1371.  
  1372. return this;
  1373. }
  1374.  
  1375. /**
  1376. * @class Noti7
  1377. */
  1378. function Noti7(iZhihu) {
  1379. if ( typeof iZhihu === 'undefined' || !iZhihu || !iZhihu.config['Noti7']) {
  1380. return null;
  1381. }
  1382. iZhihu.Noti7 = this;
  1383. this.$noti7 = $('#zh-top-nav-live-new');
  1384. this.$frame = $('.zm-noti7-frame',this.$noti7);
  1385. this.$content = $('.zm-noti7-content-body',this.$noti7);
  1386. this.$footer = $('.zm-noti7-popup-footer',this.$noti7);
  1387. this.$tab = $('.zm-noti7-popup-tab-container','#zh-top-nav-live-new-inner');
  1388.  
  1389. this.css =
  1390. ['#zh-top-nav-live-new .zm-noti7-popup-footer a[unreadonly="1"]{color:#225599 !important;text-shadow:0 0 1px #225599;}'
  1391. ,''].join('\n');
  1392. this.enhance = function(){
  1393. iZhihu.Noti7.$tab.find('.zm-noti7-popup-tab-item').each(function(i,e){
  1394. utils.observeDOMAttrModified(e,function(event){
  1395. var $e=$(event.target);
  1396. if($e.is('.zm-noti7-popup-tab-item.current')){
  1397. var currentClass=$e.attr('class')
  1398. , $bFilterRead=$('.izh-filter-read',iZhihu.Noti7.$footer);
  1399. if(currentClass!=$bFilterRead.attr('currentClass')){
  1400. $bFilterRead.attr({'unreadOnly':'','currentClass':currentClass});
  1401. }
  1402. }
  1403. });
  1404. });
  1405. iZhihu.Noti7.$footer.append(
  1406. $('<a>',{
  1407. 'class':'izh-filter-read'
  1408. , href:'javascript:void(0);'
  1409. , 'unreadOnly':''
  1410. , click:function(){
  1411. var unreadOnly=this.getAttribute('unreadOnly')=='1'
  1412. , $contentVisible=iZhihu.Noti7.$content.filter(':visible')
  1413. , $scroller=$contentVisible.closest('.zh-scroller-inner')
  1414. , $items=$contentVisible.find('.zm-noti7-content-item')
  1415. ;
  1416. unreadOnly=!unreadOnly;
  1417. this.setAttribute('unreadOnly',unreadOnly?'1':'');
  1418. if(unreadOnly){
  1419. $scroller.attr('scrollTop',$scroller[0].scrollTop);
  1420. $items.not('.unread').hide();
  1421. var scrollTop = parseInt($scroller.attr('scrollTop_unread'));
  1422. if(!isNaN(scrollTop))
  1423. $scroller.scrollTop(scrollTop);
  1424. }else{
  1425. $scroller.attr('scrollTop_unread',$scroller[0].scrollTop);
  1426. $items.not('.unread').show();
  1427. var scrollTop = parseInt($scroller.attr('scrollTop'));
  1428. if(!isNaN(scrollTop))
  1429. $scroller.scrollTop(scrollTop);
  1430. }
  1431. }
  1432. }).text('隐藏已读')
  1433. );
  1434. };
  1435.  
  1436. return this;
  1437. }
  1438.  
  1439. /**
  1440. * @class QuickBlock
  1441. */
  1442. function QuickBlock(iZhihu) {
  1443. if ( typeof iZhihu === 'undefined' || !iZhihu || !iZhihu.config['QuickBlock']) {
  1444. return null;
  1445. }
  1446. iZhihu.QuickBlock = this;
  1447. /*
  1448. var css_QuickBlock = {
  1449. 'background-position':'-146px -202px'
  1450. , 'width':16
  1451. , 'height':16
  1452. }
  1453. ;
  1454. */
  1455. this.Pending = {Users:',',Count:0};
  1456. this.Blocking = {Users:',',Count:0};
  1457. this.Unfollowed = {Users:',',Count:0};
  1458. this.Refollowed = {Users:',',Count:0};
  1459. this.Users2B = []
  1460. this.Users2BBQ = []
  1461. this.css =
  1462. ['.izh_blockCart{background-color:#0771C1;position:fixed;right:0;z-index:9;padding:0 30px 0 60px;border:1px solid #0771C1;border-left-width:10px;border-top-left-radius:6px;}'
  1463. ,'.izh_blockCart .do{color:#fff;text-align:center;display:block;margin:2px;min-width:80px;width:100%;height:20px;}'
  1464. ,'.izh_blockCart.pending .do:after{text-decoration:blink;color:red;}'
  1465. ,'.izh_blockCart .do:after{position:relative;content:attr(izh_num2B);}'
  1466. ,'.izh_blockCart .do .button{color:#fff;}'
  1467. ,'.izh_blockCart .frame{overflow-y:auto;overflow-x:hidden;position:absolute;top:25px;bottom:0;left:0;right:0;background-color:#fff;padding-top:5px;}'
  1468. ,'.izh_blockCart .list{display:block;margin:2px;width:100%;padding-right:5px;}'
  1469. ,'.izh_blockCart .list .rel{border-width:0 2px;border-style:solid;border-color:#fff;width:24px;height:18px;}'
  1470. ,'.izh_blockCart .list.i_fo .rel{border-left-color:#259;background-position:-120px -184px;}'
  1471. ,'.izh_blockCart .list.fo_i .rel{border-right-color:#259;background-position:-120px -164px;}'
  1472. ,'.izh_blockCart .list.i_fo.fo_i .rel{background-position:-78px -200px;}'
  1473. ,'.izh_blockCart .user2B{display:block;margin:2px 0;padding:0 40px 0 60px;}'
  1474. ,'.izh_blockCart .user2B i.zg-icon{display:block;position:absolute;right:0;margin-top:5px;}'
  1475. ,'.izh_blockCart .user2B .name{display:block;color:#fff;background-color:#000;white-space:nowrap;padding:2px 5px;border-radius:3px;}'
  1476. ,'.izh_blockCart .list .user2B.unfo .name{background-color:#f00;}'
  1477. ,'.izh_blockCart .user2B .del{display:block;position:absolute;margin-left:-4.5em;}'
  1478. ,'.izh_blockCart .user2B i.say{display:block;position:absolute;margin-left:-44px;border-radius:6px 6px 0 6px;border:1px solid #999;padding:0 5px 0 3px;}'
  1479. ,'.izh_blockCart .user2B i.say_1{display:block;position:absolute;margin-left:-10px;height:6px;background-color:#fff;width:6px;margin-top:17px;border-bottom:1px solid #999;}'
  1480. ,'.izh_blockCart .user2B i.say_2{display:block;position:absolute;margin-left:-9px;height:6px;background-color:#fff;width:6px;margin-top:17px;border-radius:0 0 0 6px;border:1px solid #999;border-width:0 0 1px 1px}'
  1481. ,'.izh-quick-block{position:absolute;text-align:center;width:4em;margin-top:1.5em;white-space:nowrap;}'
  1482. ,'.izh-quick-block [class^=izh-quick-block]{position:absolute;display:block;white-space:nowrap;}'
  1483. ,'.izh-quick-block:after{content:attr(izh_num2B);margin-top:1em;display:block;}'
  1484. ,'.zm-comment-hd .izh-quick-block-pend{position:absolute;left:0;top:40px;}'
  1485. ,''
  1486. ].join('\n');
  1487. this.unblockAll = function(){
  1488. $('.blocked-users > .item-card').each(function(i,e){
  1489. var uid=$(e).attr('data-id');
  1490. $.post('/settings/unblockuser',$.param({
  1491. _xsrf:$('input[name=_xsrf]').val()
  1492. , uid:uid
  1493. }),function(r){
  1494. //console.log(r);
  1495. });
  1496. });
  1497. };
  1498. this.doUnfollow = function(){
  1499. var $e = iZhihu.QuickBlock.Users2BBQ.shift()
  1500. if(typeof $e === 'undefined') return
  1501.  
  1502. var uid=$e.attr('uid');
  1503. $.post('/node/MemberFollowBaseV2'
  1504. , $.param({
  1505. method:'unfollow_member'
  1506. , params:JSON.stringify({'hash_id':uid})
  1507. , _xsrf:$('input[name=_xsrf]').val()
  1508. })
  1509. , function(r){
  1510. var query=decodeURIComponent(this.data)
  1511. , params=utils.getParamInQuery(query,'params')
  1512. ;
  1513. eval('params='+params);
  1514. var bid='fb-'+params.hash_id
  1515. , who=bid+','
  1516. , unfollowed=iZhihu.QuickBlock.Unfollowed
  1517. , refollowed=iZhihu.QuickBlock.Refollowed
  1518. , $cartDIV=$('#izh_blockCart')
  1519. , $user=$cartDIV.find('.user2B[uid='+params.hash_id+']')
  1520. , $list=$user.closest('.list')
  1521. ;
  1522. $user.prependTo($list.next().next());
  1523. if(unfollowed.Users.indexOf(','+who)<0)
  1524. unfollowed.Users += who;
  1525. if(refollowed.Users.indexOf(','+who)>=0)
  1526. refollowed.Users = refollowed.replace(','+who,',');
  1527. }
  1528. ).always(function(data, textStatus, jqXHR){
  1529. iZhihu.QuickBlock.doUnfollow()
  1530. });
  1531. };
  1532. this.doQuickBlock = function(){
  1533. var $e = iZhihu.QuickBlock.Users2BBQ.shift()
  1534. if(typeof $e === 'undefined') return
  1535.  
  1536. var blocking = iZhihu.QuickBlock.Blocking
  1537. , href = $e.attr('href')
  1538. , who = href.split('/').pop()+','
  1539. ;
  1540. if(typeof blocking === 'undefined' || !blocking){
  1541. blocking = iZhihu.QuickBlock.Blocking = { Users:',', Count:0 };
  1542. }else if(blocking.Users.indexOf(','+who) >= 0){
  1543. return; // Already blocking
  1544. }
  1545. var $cartDIV=$('#izh_blockCart');
  1546. $cartDIV.addClass('blocking');
  1547. blocking.Users += who;
  1548. blocking.Count ++;
  1549. $.post(href+'/block',$.param({
  1550. action:'add'
  1551. , _xsrf:$('input[name=_xsrf]').val()
  1552. }),function(r){
  1553. var href=this.url.replace('/block','')
  1554. , userID=href.split('/').pop()
  1555. , who=','+userID+','
  1556. , blocking=iZhihu.QuickBlock.Blocking
  1557. ;
  1558.  
  1559. if(0==--blocking.Count)$cartDIV.removeClass('pending');
  1560. if(blocking.Users.indexOf(who) < 0)
  1561. return; // No this user in pending
  1562. blocking.Users = blocking.Users.replace(who,',');
  1563. $('#izh_blockCart .user2B[href="'+href+'"]').find('.del')[0].click();
  1564. $('a[href$="'+href+'"]').css('text-decoration','line-through');
  1565. }).always(function(data, textStatus, jqXHR){
  1566. iZhihu.QuickBlock.doQuickBlock()
  1567. });
  1568. };
  1569. this.resizeBlockCart = function($cartDIV){
  1570. function parseCssPx($item, name) {
  1571. var m = $item.css(name);
  1572. if (m != 'undefined') {
  1573. return parseInt(m.replace('px',''));
  1574. }
  1575. return 0;
  1576. }
  1577. var $userDIV = $cartDIV.find('.list .user2B');
  1578. var $titleBox = $('#izh_blockCart .do');
  1579. var h = parseCssPx($cartDIV.find('div.frame'),'paddingTop')
  1580. + ($userDIV.height() + parseCssPx($userDIV,'marginTop')) * $userDIV.length
  1581. + $titleBox.height()
  1582. + parseCssPx($titleBox, 'marginTop')
  1583. + parseCssPx($titleBox, 'marginBottom');
  1584. if(h+iZhihu.$main.offset().top<iZhihu.$win.height()){
  1585. $cartDIV.css({'height':h,'bottom':''});
  1586. }else{
  1587. $cartDIV.css({'height':'','bottom':0});
  1588. }
  1589. };
  1590. this.getCartDIV=function(){
  1591. var $cartDIV=$('#izh_blockCart');
  1592. if(!$cartDIV.length){
  1593. $cartDIV=$('<div>', { id: 'izh_blockCart', 'class': 'izh_blockCart' }).css({
  1594. 'top':iZhihu.$main.offset().top
  1595. }).append(
  1596. $('<div>',{
  1597. 'class':'do'
  1598. , 'izh_num2B':0
  1599. , 'title':'下为「候审」列表\n点击左上角可收起/展开\n数字为人犯总数(红色表示仍有人犯正待入列)'
  1600. }).append(
  1601. $('<a>',{
  1602. 'class':'button delAll'
  1603. , href:'javascript:void(0);'
  1604. , title:'清空「候审」列表'
  1605. , click:function(){
  1606. var $cartDIV=$('#izh_blockCart');
  1607. $cartDIV.css('bottom','').find('.list').empty();
  1608. $(this.parentNode).attr('izh_num2B','0');
  1609. $cartDIV.css('height','');
  1610. }
  1611. }).text('大赦').css({
  1612. 'display':'block'
  1613. , 'position':'absolute'
  1614. , 'left':24
  1615. })
  1616. ).append(
  1617. $('<input>',{
  1618. 'class':'unfo'
  1619. , href:'javascript:void(0);'
  1620. , type:'checkbox'
  1621. , title:'选中后,将我关注之人标出,改以放逐(取消关注)论处'
  1622. , click:function(){
  1623. var $cartDIV=$(this.parentNode.parentNode)
  1624. , $users=$('.frame .list.i_fo .user2B',$cartDIV)
  1625. , $action=$('.action',this.parentNode);
  1626. if(this.checked){
  1627. $users.addClass('unfo');
  1628. $action.text('放逐').css('padding','0 2em 0 0').attr('title','对列表内我关注之人取消关注');
  1629. }else{
  1630. $users.removeClass('unfo');
  1631. $action.text('收监').css('padding','0 0 0 2em').attr('title','将下列人犯逐一加入黑名单');
  1632. }
  1633. }
  1634. }).css({
  1635. 'display':'block'
  1636. , 'float':'left'
  1637. , 'height':22
  1638. , 'line-height':22
  1639. })
  1640. ).append(
  1641. $('<span>',{
  1642. 'class':''
  1643. , href:'javascript:void(0);'
  1644. , title:'选中后,将我关注的人标出,准备「取消关注」'
  1645. }).text('从轻').css({
  1646. 'display':'block'
  1647. , 'float':'left'
  1648. , 'margin-right':20
  1649. })
  1650. ).append(
  1651. $('<a>',{
  1652. 'class':'button action'
  1653. , href:'javascript:void(0);'
  1654. , title:'将下列人犯逐一加入黑名单'
  1655. , click:function(){
  1656. var $cartDIV=$(this.parentNode.parentNode);
  1657. if($('.unfo',this.parentNode).is(':checked')){
  1658. $('.list.i_fo .user2B',$cartDIV).each(function(i,e){
  1659. iZhihu.QuickBlock.Users2BBQ.push($(e))
  1660. });
  1661. iZhihu.QuickBlock.doUnfollow();
  1662. }else{
  1663. $('.list .user2B',$cartDIV).each(function(i,e){
  1664. iZhihu.QuickBlock.Users2BBQ.push($(e))
  1665. });
  1666. iZhihu.QuickBlock.doQuickBlock();
  1667. }
  1668. }
  1669. }).text('收监').css({
  1670. 'display':'block'
  1671. , 'float':'right'
  1672. , 'margin-left':20
  1673. , 'margin-right':-10
  1674. , 'padding':'0 0 0 2em'
  1675. })
  1676. ).append(
  1677. $('<a>',{
  1678. 'class':'zg-icon zg-icon-double-arrow'
  1679. , href:'javascript:void(0);'
  1680. , click:function(){
  1681. var $cartDIV=$('#izh_blockCart');
  1682. if($cartDIV.attr('mini')!='1'){
  1683. $cartDIV.find('.frame').hide();
  1684. $cartDIV.css({'height':'','bottom':''});
  1685. $cartDIV.attr('mini','1');
  1686. }else{
  1687. $cartDIV.find('.frame').show();
  1688. iZhihu.QuickBlock.resizeBlockCart($cartDIV);
  1689. $cartDIV.attr('mini','0');
  1690. }
  1691. }
  1692. }).css({
  1693. 'position':'absolute'
  1694. , 'left':0
  1695. , 'top':5
  1696. })
  1697. )
  1698. ).append(
  1699. $('<div>',{'class':'frame'}
  1700. ).append(
  1701. $('<div>',{
  1702. 'class':'list i_fo fo_i'
  1703. })
  1704. ).append(
  1705. $('<div>',{
  1706. 'class':'list i_fo'
  1707. })
  1708. ).append(
  1709. $('<div>',{
  1710. 'class':'list fo_i'
  1711. })
  1712. ).append(
  1713. $('<div>',{
  1714. 'class':'list'
  1715. })
  1716. )
  1717. ).appendTo(iZhihu.$body);
  1718. }
  1719.  
  1720. return $cartDIV
  1721. }
  1722. this.in2BlockCart = function(url,retriedCount){
  1723. var $e = iZhihu.QuickBlock.Users2B.shift() || null
  1724. , $cartDIV = iZhihu.QuickBlock.getCartDIV()
  1725.  
  1726. $cartDIV.addClass('pending');
  1727. if(typeof retriedCount == 'undefined')
  1728. retriedCount = 0
  1729.  
  1730. //console.log(retriedCount)
  1731. if (!$e || $e.length === 0){
  1732. if((url||'')==''){
  1733. $cartDIV.removeClass('pending')
  1734. }else{
  1735. $.ajax(['',url].join(''),{
  1736. type:'GET'
  1737. , maxRetryCount: 3
  1738. }).done(function(data, textStatus, jqXHR){
  1739. $.each(data.payload,function(i,e){
  1740. iZhihu.QuickBlock.addUser2B(e)
  1741. })
  1742. iZhihu.QuickBlock.in2BlockCart(data.paging.next)
  1743. }).fail(function(data,textStatus,jXHR){
  1744. if (++retriedCount < this.maxRetryCount){
  1745. iZhihu.QuickBlock.in2BlockCart(url,retriedCount)
  1746. }else{
  1747. $cartDIV.removeClass('pending')
  1748. }
  1749. })
  1750. }
  1751. return
  1752. }
  1753.  
  1754. var href = $e.attr('href')
  1755. , username = href.split('/').pop()
  1756. , who = username+','
  1757. ;
  1758.  
  1759. if($cartDIV.find('.user2B[href="'+href+'"]').length){
  1760. return;
  1761. }
  1762.  
  1763. $.ajax('/node/MemberProfileCardV2?'+$.param({params:JSON.stringify({'url_token':username})}), {
  1764. type: 'GET'
  1765. , user2B: $e
  1766. , maxRetryCount: 3
  1767. }).done(function(data, textStatus, jqXHR){
  1768. iZhihu.QuickBlock.addUser2B(data)
  1769. iZhihu.QuickBlock.in2BlockCart(url)
  1770. }).fail(function(data,textStatus,jXHR){
  1771. if (++retriedCount < this.maxRetryCount){
  1772. iZhihu.QuickBlock.Users2B.unshift(this.user2B)
  1773. iZhihu.QuickBlock.in2BlockCart(url,retriedCount)
  1774. }else{
  1775. }
  1776. }).always(function(data,textStatus,jXHR){
  1777. $('#izh_blockCart').removeClass('pending');
  1778. });
  1779. };
  1780. this.addUser2B=function(data){
  1781. if (data === '') return
  1782. var $html=$(data.replace(utils.RegexSrcPic, ''))
  1783. , isZHPC=$html.is('.zh-profile-card')
  1784. , $avatarLink=isZHPC?$html.find('.avatar-link:first'):$html.find('.zm-item-link-avatar:first')
  1785. , href=$avatarLink.attr('href')
  1786. if((href||'')=='')return
  1787.  
  1788. var userID=href.substr(8)
  1789. , userName=isZHPC?$avatarLink.text():$avatarLink.attr('title')
  1790. , $btnFollow=$html.find('button[data-follow]')
  1791. , hashID=!$btnFollow.length?'':$btnFollow.attr('data-id')
  1792. , f_=$btnFollow.length&&$btnFollow.is('.zg-btn-unfollow')
  1793. , _f=$btnFollow.length&&$btnFollow.is('[data-followme=1]')
  1794. , cssF=_f||f_?'zg-icon rel ':''
  1795. , $cartDIV=iZhihu.QuickBlock.getCartDIV()
  1796. , $cart=$cartDIV.find('.list')
  1797. , who=','+userID+','
  1798. ;
  1799.  
  1800. if(hashID==''){
  1801. return; // User blocked or you blocked
  1802. }
  1803. if($cartDIV.find('.list .user2B[href="'+href+'"]').length){
  1804. return; // User already in block list
  1805. }
  1806.  
  1807. var $user2B=$('<div>',{
  1808. 'class':'user2B'+(f_&&$cartDIV.find('.do .unfo:checked').length?' unfo':'')
  1809. , 'href':href
  1810. , 'uid':hashID
  1811. })
  1812. .append(
  1813. $('<a>',{
  1814. 'class':'button del'
  1815. , href:'javascript:void(0);'
  1816. , click:function(){
  1817. var $user=$(this).closest('.user2B')
  1818. , $cartDIV=$('#izh_blockCart')
  1819. ;
  1820. $user.remove();
  1821. var num2B=$cartDIV.find('.list .user2B').length;
  1822. $cartDIV.children('.do').attr('izh_num2B',num2B==0?'0':num2B>999?'1k+':num2B);
  1823. if(num2B)
  1824. iZhihu.QuickBlock.resizeBlockCart($cartDIV);
  1825. else
  1826. $cartDIV.css('height','');
  1827. }
  1828. }).text('赦')
  1829. ).append(
  1830. $('<i>',{
  1831. 'class':'say'
  1832. , 'data-tip':'p$t$'+userID
  1833. }).text('冤枉')
  1834. ).append($('<i>',{'class':'say_1'})
  1835. ).append($('<i>',{'class':'say_2'})
  1836. ).append($('<i>',{'class':cssF})
  1837. ).append(
  1838. $('<a>',{
  1839. 'class':'name'
  1840. , href:href
  1841. , target:'_blank'
  1842. }).text(userName)
  1843. ).show()
  1844. ;
  1845. if(f_&&_f){
  1846. $cart.eq(0).append($user2B);
  1847. }else if(f_){
  1848. $cart.eq(1).append($user2B);
  1849. }else if(_f){
  1850. $cart.eq(2).append($user2B);
  1851. }else{
  1852. $cart.eq(3).append($user2B);
  1853. }
  1854. var num2B=$cartDIV.find('.list .user2B').length;
  1855. $cartDIV.children('.do').attr('izh_num2B',num2B==0?'0':num2B>9999?'10k+':num2B);
  1856. iZhihu.QuickBlock.resizeBlockCart($cartDIV);
  1857. }
  1858. this.addQuickBlock = function($a){
  1859. var $voteInfo=$('.zm-item-vote-info',$a)
  1860. if($voteInfo.length){
  1861. var $voters=$voteInfo.children('.voters')
  1862. if($voters.length){
  1863. var s=[',',$voteInfo.attr('data-votecount'),'个也不能忍,果断撕'].join('')
  1864. , aid=$a.attr('data-aid')||$a.children('[itemprop="ZReactor"]').attr('data-id')
  1865. , url=['/',$a.attr('data-type')=='p'?'post':'answer','/',aid,'/voters_profile'].join('')
  1866. $('<a>',{href:'javascript:;','class':'text'}).text(s).bind('click',function(event){
  1867. var $t=$a.find('.author-info > a.name,.zm-item-answer-author-info > a.author-link')
  1868. if($t&&$t.length){
  1869. iZhihu.QuickBlock.Users2B.push($t)
  1870. }
  1871. iZhihu.QuickBlock.in2BlockCart(url)
  1872. }).appendTo($voteInfo)
  1873. }
  1874. }
  1875. };
  1876. this.addQuickBlockInOneComment = function($cmItem){
  1877. var $where=$('.zm-comment-hd',$cmItem);
  1878. if($where.find('.izh-quick-block-pend').length)return;
  1879. $('<a>',{
  1880. 'class':'izh-quick-block-pend izh-button'
  1881. , href:'javascript:void(0);'
  1882. , 'data-tip':'s$l$将此人列入候审名单以待收监'
  1883. }).text('候审').click(function(){
  1884. var $e = $(this).next()
  1885. iZhihu.QuickBlock.Users2B.push($e)
  1886. iZhihu.QuickBlock.in2BlockCart();
  1887. }).prependTo($where).hide();
  1888. };
  1889. this.addQuickBlockInCommentList = function($where){
  1890. // Region: 快速屏蔽
  1891. var $cm=$where.is('.zm-comment-box')?$where:$where.closest('.zm-comment-box')
  1892. , $u=$('.zm-item-comment',$cm)
  1893. ;
  1894. $u.each(function(i,e){
  1895. iZhihu.QuickBlock.addQuickBlockInOneComment($(e));
  1896. });
  1897. var $btnQuickBlock=$('<a>',{
  1898. 'class':'izh-quick-block-switch izh-button'
  1899. , href:'javascript:void(0);'
  1900. , 'data-tip':'s$t$开始从评论者中选择屏蔽对象'
  1901. }).text('快速屏蔽').css({'margin-left':7}).prependTo($where).click(function(){
  1902. if(this.getAttribute('on')=='1'){
  1903. $('.zm-comment-hd .izh-quick-block-pend').hide();
  1904. $(this).attr({'data-tip':'s$t$开始从评论者中选择屏蔽对象','on':'0'}).removeClass('on');
  1905. }
  1906. else{
  1907. $('.zm-comment-hd .izh-quick-block-pend').show();
  1908. $(this).attr({'data-tip':'s$t$结束从评论者中选择屏蔽对象','on':'1'}).addClass('on');
  1909. }
  1910. })
  1911. ;
  1912. if($cm.is('.empty')){
  1913. $btnQuickBlock.hide();
  1914. }
  1915. // Region end
  1916. };
  1917. iZhihu.$body.bind('DOMNodeInserted',function(event){
  1918. $(event.target).filter('#zh-tooltip').bind('DOMNodeInserted',function(event){
  1919. var $a=$(event.target).filter('#zh-tooltip-people').find('a[name=focus]')
  1920. , bid=$a.attr('id')
  1921. , who=','+bid+','
  1922. ;
  1923. if($a.is('.zg-btn-unfollow')&&iZhihu.QuickBlock.Unfollowed.Users.indexOf(who)>=0){
  1924. $a.text('关注').removeClass('zg-btn-unfollow').addClass('zg-btn-follow');
  1925. }
  1926. if($a.is('.zg-btn-follow')&&iZhihu.QuickBlock.Refollowed.Users.indexOf(who)>=0){
  1927. $a.text('取消关注').removeClass('zg-btn-follow').addClass('zg-btn-unfollow');
  1928. }
  1929. });
  1930. });
  1931. return this;
  1932. }
  1933.  
  1934. /**
  1935. * @class QuickFavo
  1936. */
  1937. function QuickFavo(iZhihu) {
  1938. if ( typeof iZhihu === 'undefined' || !iZhihu || !iZhihu.config['QuickFavo']) {
  1939. return null;
  1940. }
  1941. iZhihu.QuickFavo = this;
  1942. this.DefaultCount = 4;
  1943. this.PinnedList = iZhihu.config['QuickFavoPinned'];
  1944. this.css =
  1945. ['.izh-Pin4QuickFavo{padding:3px 5px 0;float:right;display:block;margin-top:4px;margin-right:2em;line-height:1.25;}'
  1946. ,'.izh-Pin4QuickFavo .zm-item-top-btn{visibility:visible;margin:0 4px;float:right;}'
  1947. ,'div.izh_fav{position:absolute;z-index:9999;display:none;border:1px solid #999999;background-color:#fff;border-radius:5px 5px 5px 0;margin-left:-1px;}'
  1948. ,'div.izh_fav .title{padding:0 5px;background-color:#0874c4;color:#fff;font-weight:bold;font-size:15px;text-align:center;border-radius:3px 3px 0 0;}'
  1949. ,'div.izh_fav a.fav{display:block;clear:both;float;left;padding:0 36px 0 24px;line-height:2;}'
  1950. ,'div.izh_fav a.fav i{position:absolute;margin-top:0.5em;}'
  1951. ,'div.izh_fav a.fav i.spinner-gray{left:0;}'
  1952. ,'div.izh_fav a.fav i.z-icon-collect{left:10px;visibility:hidden;background-position:-56px -36px;}'
  1953. ,'div.izh_fav a.fav.selected i.z-icon-collect{visibility:visible;}'
  1954. ,'div.izh_fav a.fav:hover{text-decoration:none}'
  1955. ,'div.izh_fav a.fav span{float:right;display:block;margin-right:-32px}'
  1956. ,'.meta-item.on{position:relative;z-index:10000;background-color:#fff;border:1px solid #999999;border-top-color:#fff;margin:-1px -8px -1px -1px;padding:0 7px;border-radius:2px 2px 3px 3px;}'
  1957. ,''].join('\n');
  1958. this.addQuickFavo = function($v,$a){
  1959. if($v.length){
  1960. if($a.children('.izh_fav').length<=0){
  1961. $('<div>', { 'class': 'izh_fav' })
  1962. .append($('<i>', { 'class': 'spinner-gray' }))
  1963. .append('&nbsp;加载中...&nbsp;')
  1964. .bind('mouseover', function(){
  1965. $(this).show().parent().find('.meta-item[name=favo]').addClass('on');
  1966. })
  1967. .bind('mouseout', function(){
  1968. $(this).hide().parent().find('.meta-item[name=favo]').removeClass('on');
  1969. })
  1970. .appendTo($a);
  1971. }
  1972. $v.bind('mouseenter',function(){
  1973. var $a=iZhihu.getItem($(this))
  1974. , $m=$(this).addClass('on').closest('.zm-item-meta')
  1975. , aid=$a.attr('data-aid')
  1976. , $op=$(this).offsetParent()
  1977. , bottom1=parseInt($op.css('margin-bottom'))
  1978. , bottom2=parseInt($a.css('padding-bottom'))
  1979. , pos=$(this).position()
  1980. ;
  1981. $a.children('.izh_fav').css({
  1982. 'bottom':(isNaN(bottom1)?0:bottom1)+(isNaN(bottom2)?0:bottom2)+$op.height()-pos.top
  1983. , 'left':pos.left+$m.position().left
  1984. }).show();
  1985. $.getJSON('/collections/json',$.param({answer_id:aid}),function(result,status,xhr){
  1986. var aid=this.url.substr(this.url.indexOf('answer_id=')+10)
  1987. , sel=pageIs.Question?'.zm-item-answer'
  1988. :pageIs.Home?'.feed-item'
  1989. :pageIs.Answer?'.zm-item-answer'
  1990. :''
  1991. , $a=$(sel+'[data-aid='+aid+']')
  1992. , $v=$a.children('.izh_fav').empty().append($('<div>',{'class':'title',title:'以下为最近选择的收藏夹'}).append('快速收藏'))
  1993. ;
  1994. if(''==sel)return;
  1995. var favAll=result.msg[0]
  1996. , favSel=result.msg[1]
  1997. , num=iZhihu.QuickFavo.DefaultCount
  1998. , fav=new Array()
  1999. , favNormal=new Array()
  2000. ;
  2001. $.each(favAll,function(i,e){
  2002. var fID=e[0]
  2003. , pinned=iZhihu.QuickFavo.PinnedList[fID]
  2004. ;
  2005. if(pinned){
  2006. fav.push(e);
  2007. }else{
  2008. favNormal.push(e);
  2009. }
  2010. });
  2011. num -= fav.length;
  2012. if(num > 0){
  2013. fav=fav.concat(favNormal.slice(0,num));
  2014. }
  2015. favNormal.length=0;
  2016. while(fav.length){
  2017. var e=fav.shift()
  2018. , fID=e[0]
  2019. , fName=e[1]
  2020. ;
  2021. favNormal[fID]=fName;
  2022. var $f=$('<a/>',{
  2023. 'class':'fav'
  2024. , href:'javascript:;'
  2025. , aid:aid
  2026. , fid:fID
  2027. }).text(fName).click(function(){
  2028. var u='/collection/'
  2029. , $f=$(this)
  2030. , $i=$f.children(':first')
  2031. ;
  2032. if($i.hasClass('spinner-gray'))return;
  2033. u+=$f.hasClass('selected')?'remove':'add';
  2034. $i.attr('class','spinner-gray');
  2035. $.post(u,$.param({_xsrf:$('input[name=_xsrf]').val(),answer_id:$(this).attr('aid'),favlist_id:$(this).attr('fid')}),function(result){
  2036. var act=this.url.substring(this.url.lastIndexOf('/')+1)
  2037. , fid=utils.getParamInQuery(this.data,'favlist_id')
  2038. , aid=utils.getParamInQuery(this.data,'answer_id')
  2039. , sel=pageIs.Question?'.zm-item-answer'
  2040. :pageIs.Home?'.feed-item'
  2041. :''
  2042. , $vi=''==sel?null:$(sel+'[data-aid='+aid+'] .izh_fav a[fid='+fid+']')
  2043. , inc=0;
  2044. if(''==sel)return;
  2045. if(act=='remove'&&result.msg=='OK'){
  2046. $vi.removeClass('selected');
  2047. inc=-1;
  2048. }else if(act=='add'&&result.msg.length){
  2049. $vi.addClass('selected');
  2050. inc=1;
  2051. }
  2052. if(inc!=0){
  2053. $vi.children('span').text(parseInt($vi.children('span').text())+inc);
  2054. }
  2055. $vi.children(':first').attr('class','z-icon-collect');
  2056. });
  2057. }).prepend($('<i/>',{'class':'z-icon-collect'}))
  2058. .append($('<span/>').text(e[3]));
  2059. $f.appendTo($v/*.children(pinned?'.pinned':'.normal')*/);
  2060. };
  2061. $.each(favSel,function(i,e){
  2062. if(favNormal[e])
  2063. $v.find('a.fav[fid='+e+']').addClass('selected');
  2064. });
  2065. });
  2066. });
  2067. $v.bind('mouseleave',function(){
  2068. var $a=iZhihu.getItem($(this).removeClass('on'));
  2069. $a.children('.izh_fav').hide();
  2070. });
  2071. }
  2072. };
  2073.  
  2074. iZhihu.$body.bind('DOMNodeInserted',function(event){
  2075. var $e=$(event.target);
  2076. if($e.is('.modal-dialog')){
  2077. $e.bind('DOMNodeInserted',function(event){
  2078. var $e=$(event.target)
  2079. , $favList=$e.find('.zm-favo-list-content')
  2080. ;
  2081. if($favList.length){
  2082. var $favItems=$favList.children('.zm-favo-list-item-link[data-lid]')
  2083. , funcPin=function(e){
  2084. var pinned=e.checked
  2085. , $e=$(e)
  2086. , $f=$e.closest('.zm-favo-list-item-link')
  2087. ;if(!$f.length)return;
  2088. var lid=$e.attr('lid')
  2089. , $checks=$e.closest('.zm-favo-list-content').find('.izh-Pin4QuickFavo .t_jchkbox')
  2090. , time=50
  2091. , cssStart={position:'relative','background-color':'#0874C4','z-index':'100'}
  2092. , cssEnd={position:'','background-color':'','z-index':''}
  2093. , funcRollUp=function(){
  2094. var $b=$e.closest('.zm-favo-list-item-link')
  2095. , $a=$b.prev()
  2096. ;
  2097. if(!$a.length||($a.hasClass('pinned')&&parseInt($a.attr('data-lid'))<parseInt($b.attr('data-lid')))){
  2098. return;
  2099. }
  2100. $b.animate({bottom:$a.outerHeight()},{
  2101. duration:time
  2102. , step:function(now){$b.css(cssStart);}
  2103. , complete:function(){
  2104. $b.css($.extend({bottom:0},cssEnd));
  2105. $b.insertBefore($a);
  2106. funcRollUp();
  2107. }
  2108. });
  2109. }
  2110. , funcRollDown=function(){
  2111. var $a=$e.closest('.zm-favo-list-item-link')
  2112. , $b=$a.next()
  2113. ;
  2114. if(!$b.length||(!$b.hasClass('pinned')&&parseInt($b.attr('index'))>parseInt($a.attr('index')))){
  2115. return;
  2116. }
  2117. $a.animate({top:$b.outerHeight()},{
  2118. duration:time
  2119. , step:function(now){$a.css(cssStart);}
  2120. , complete:function(){
  2121. $a.css($.extend({top:0},cssEnd));
  2122. $a.insertAfter($b);
  2123. funcRollDown();
  2124. }
  2125. });
  2126. }
  2127. ;
  2128. if(pinned){
  2129. $f.addClass('pinned');
  2130. funcRollUp();
  2131. }else{
  2132. $f.removeClass('pinned');
  2133. funcRollDown();
  2134. }
  2135. iZhihu.QuickFavo.PinnedList[lid]=pinned;
  2136. utils.setCfg('QuickFavoPinned',iZhihu.QuickFavo.PinnedList);
  2137. }
  2138. ;
  2139. $favItems.each(function(i,e){
  2140. var lid=e.getAttribute('data-lid')
  2141. , $pin=$('<a/>',{
  2142. href:'javascript:void(0);'
  2143. , 'class':'izh-Pin4QuickFavo'
  2144. , 'lid':lid
  2145. , 'data-tip':'s$b$保持在「快速收藏」菜单顶部显示'
  2146. }).append($('<span/>').append('置顶').add('<i/>',{'class':'zm-item-top-btn'}))
  2147. .appendTo($('.zg-gray',e)).attr('index',i)
  2148. ;
  2149. e.setAttribute('index',i);
  2150. $pin.bind('click',function(event){
  2151. this.checked=!this.checked;
  2152. funcPin(this);
  2153. if(this.checked){
  2154. $(this).children('span').text('取消置顶');
  2155. $(this).children('i').addClass('zm-item-top-btn-cancel');
  2156. }else{
  2157. $(this).children('span').text('置顶');
  2158. $(this).children('i').removeClass('zm-item-top-btn-cancel');
  2159. }
  2160. if(event.preventDefault)
  2161. event.preventDefault();
  2162. else if(event.stopPropagation)
  2163. event.stopPropagation();
  2164. else
  2165. event.cancelBubble=true;
  2166. return false;
  2167. })[0].checked=false;
  2168. if(iZhihu.QuickFavo.PinnedList[lid]){
  2169. $pin.click();
  2170. }
  2171. });
  2172. }
  2173. });
  2174. }
  2175. });
  2176.  
  2177. return this;
  2178. }
  2179.  
  2180. /**
  2181. * @class SearchingList
  2182. */
  2183. function SearchingList(iZhihu) {
  2184. if ( typeof iZhihu === 'undefined' || !iZhihu) {
  2185. return null
  2186. }
  2187. iZhihu.SearchingList = this
  2188. this.$topSearch = $('#zh-top-search-form')
  2189. this.$topSearchInput = $('#zh-top-search-form > input#q')
  2190. if (!this.$topSearch.length) return
  2191.  
  2192. this.SearchEngineOutsideList = {
  2193. 'google': {icon:'https://www.google.com/favicon.ico',url:'https://www.google.com/?q=site:zhihu.com%20{0}#q=site:zhihu.com+{0}'}
  2194. , 'baidu': {icon:'http://www.baidu.com/favicon.ico',url:'http://www.baidu.com/s?wd=site:zhihu.com%20{0}'}
  2195. }
  2196.  
  2197. utils.observeDOMNodeAdded(this.$topSearch[0],function(event){
  2198. var _a = event.addedNodes || []
  2199. if (!_a.length) return
  2200. utils.observeDOMNodeAdded(_a[0],function(event){console.log(iZhihu.config['SearchEngineOutside'])
  2201. var _a = event.addedNodes || [null]
  2202. , $item = $(_a[0])
  2203. , seoKey = iZhihu.config['SearchEngineOutside'] || 'baidu'
  2204. , seo = iZhihu.SearchingList.SearchEngineOutsideList[seoKey] || {icon:'',url:''}
  2205. , strSearchUrl = seo.url.replace(/\{0\}/g, function(){return iZhihu.SearchingList.$topSearchInput.val()})
  2206. console.log(seoKey)
  2207. if ($item.is('.ac-row[role=option]')){
  2208. var $a = $item.children('a')
  2209. , href = $a.attr('href')
  2210. , css = 'float:right;background-position:-284px -2px;'
  2211. , $aNew = $('<a>', {class:'zg-icon',style:css,href:href,target:'_blank',click:function(event){
  2212. event.stopPropagation()
  2213. }})
  2214. if (href.indexOf('/search?') === 0) {
  2215. $aNew.css({marginTop:'0.5em'})
  2216. $item.append($('<a>', {class:'icon',style:'margin-top:0.5em;float:left',href:strSearchUrl,target:'_blank',click:function(event){
  2217. event.stopPropagation()
  2218. }}).append($('<img>', {border:0,src:seo.icon,width:16,height:16})))
  2219. } else if (href.indexOf('/question/') < 0) {
  2220. $aNew.css({marginTop:'-1.5em'})
  2221. }
  2222. $item.append($aNew)
  2223. }
  2224. })
  2225. })
  2226.  
  2227. return this
  2228. }
  2229.  
  2230. /**
  2231. * @class TopNav
  2232. */
  2233. function TopNav(iZhihu) {
  2234. if ( typeof iZhihu === 'undefined' || !iZhihu || !iZhihu.config['TopNavAutoFold']) {
  2235. return null
  2236. }
  2237. iZhihu.TopNav = this
  2238. this.$topNav = $('body > .zu-top:first')
  2239. .on('mouseover', function(event){
  2240. this.style.top = '0'
  2241. this.setAttribute('izh-mouseover', '1')
  2242. $('#izhCSS_NotiNum').remove()
  2243. })
  2244. .on('mouseout', function(event){
  2245. this.setAttribute('izh-mouseover', '0')
  2246. iZhihu.TopNav.funcFold()
  2247. })
  2248. if (!this.$topNav.length) return
  2249.  
  2250. this.topNavHeight = this.$topNav.height() - 5
  2251.  
  2252. this.funcFold = function(event){
  2253. var scrollTop = document.documentElement.scrollTop || document.body.scrollTop || 0
  2254. , _self = iZhihu.TopNav
  2255. , isMouseOver = '1' === (_self.$topNav.attr('izh-mouseover') || '')
  2256. , $head = $('head:first')
  2257. , $cssNotiNum = $('#izhCSS_NotiNum')
  2258. , $floatingBar = $('body > .goog-scrollfloater-floating')
  2259. if (scrollTop === 0) {
  2260. _self.$topNav.css({top:0})
  2261. } else if (!isMouseOver) {
  2262. if (scrollTop < _self.topNavHeight) {
  2263. _self.$topNav.css({top:-scrollTop})
  2264. $floatingBar.css({marginTop:-scrollTop})
  2265. } else {
  2266. _self.$topNav.css({top:-_self.topNavHeight})
  2267. $floatingBar.css({marginTop:-_self.topNavHeight})
  2268. }
  2269. if (scrollTop > 20) {
  2270. if (!$cssNotiNum.length) {
  2271. $('<style>', {
  2272. id: 'izhCSS_NotiNum'
  2273. , type: 'text/css'
  2274. }).appendTo('head:first').text('#zh-top-nav-count,#zh-top-nav-new-pm{position:absolute;top:40px;border-radius:0 !important}.top-nav-profile .zu-top-nav-userinfo{overflow:visible !important}')
  2275. }
  2276. return
  2277. }
  2278. }
  2279. $cssNotiNum.remove()
  2280. }
  2281.  
  2282. iZhihu.$win.scroll(this.funcFold)
  2283.  
  2284. this.onNodeAdded = function(event){
  2285. iZhihu.TopNav.funcFold()
  2286. $.each(event.removedNodes, function(i, e){
  2287. var $floatingBar = $(e).filter('.goog-scrollfloater').css({marginTop:''})
  2288. })
  2289. }
  2290.  
  2291. return this
  2292. }
  2293.  
  2294. allLinks = function(_name, _listSel, _listName) {
  2295. this.name = _name
  2296. this.listSel = _listSel
  2297. this.listName = _listName
  2298. this.dlgID = 'izh-dlg-' + _name
  2299. this.$dlg = null
  2300. var _initialTitle = _listName + '地址清单'
  2301. , _result = new Array()
  2302. , _loadTimes = 0
  2303.  
  2304. //分析内容
  2305. var processNode = function(content,$dlg){
  2306. var $qCurrent = null;
  2307. $('.zm-item-answer', content).each(function(index, item){
  2308. var $a = $(item)
  2309. , $q = $a.closest(".zm-item").children("h2").children("a")
  2310. ;
  2311. if($q.length){
  2312. $qCurrent=$q;
  2313. }else if($qCurrent){
  2314. $q=$qCurrent;
  2315. }else{
  2316. return;
  2317. }
  2318. var hrefQuestion = url.data.attr["base"] + $q.attr("href").replace(url.data.attr["base"],'');
  2319. var obj = {
  2320. title: $q.text(),
  2321. //questionUrl: hrefQuestion,
  2322. answerUrl: hrefQuestion + ($a.parent().is(".zm-item-fav") ? "/answer/" + $a.attr("data-atoken") : ""),
  2323. answerAuthor: $a.find('.zm-item-answer-author-wrap a[href^="/people"]').text().trim(),
  2324. summary: $a.find(".zm-item-answer-summary").children().remove().end().text(),
  2325. content: $a.find(".zm-editable-content").html()
  2326. };
  2327. _result.push(obj);
  2328. var strTitle = utils.formatStr('* 《{title}》&#13;* {answerAuthor}:&#13;* {summary}', obj)
  2329. , strURL = utils.formatStr('{answerUrl}', obj)
  2330. , $li = $('<li>').append($('<a>', { href: strURL, title: strTitle }).text(strURL)).css({ 'list-style-type': 'none' })
  2331. $('.izhihu-collection-links',$dlg).append($li);
  2332. var count=_result.length;
  2333. $('.izhihu-collection-info',$dlg).text('(努力加载中...已得到记录 ' + count + ' 条)');
  2334. });
  2335. };
  2336. var handler = function(pageWant,pageNow,$dlg){
  2337. if (!pageNow)pageNow=1;
  2338. if($dlg.is(':hidden')){
  2339. var count=_result.length;
  2340. $('.izhihu-collection-info',$dlg).text('(加载被终止...已得到记录 ' + count + ' 条)');
  2341. $('#zh-global-spinner').hide();
  2342. return;
  2343. }
  2344. if(pageWant==1){
  2345. $('.izhihu-collection-links',$dlg).empty();
  2346. $('#zh-global-spinner').show();
  2347. _result.length=0;
  2348. _loadTimes++;
  2349. $('.izhihu-collection-info',$dlg).text('');
  2350. }
  2351. var $pager=$(_listSel).parent().find('.zm-invite-pager')
  2352. , $lastPage=$pager.children('span').last().prev()
  2353. , totalCount=$pager.length==0?1:Number($lastPage.text())
  2354. ;
  2355. if(pageWant>totalCount){
  2356. $('.izhihu-collection-info',$dlg).text('(加载完成,共得到记录 ' + _result.length + ' 条)');
  2357. $('#zh-global-spinner').hide();
  2358. $('.selAll',$dlg).click();
  2359. return;
  2360. }
  2361.  
  2362. var pageNext=pageWant+1;
  2363. if(pageWant==pageNow){
  2364. processNode($(_listSel).html(),$dlg);
  2365. handler(pageNext,pageNow,$dlg)
  2366. }else{
  2367. var _url=url.data.attr['base']+url.data.attr['path']+'?page='+pageWant;
  2368. $.ajax(_url,{type:'get',context:{loadTimes:_loadTimes}}).done(function(result){
  2369. if(this.loadTimes!=_loadTimes)return;
  2370. processNode(result,$dlg);
  2371. handler(pageNext,pageNow,$dlg)
  2372. });
  2373. }
  2374. };
  2375.  
  2376. //初始化弹出框
  2377. this.initDialog = function(){
  2378. this.$dlg=$('#'+this.dlgID);
  2379. var retVal=0<this.$dlg.length;
  2380. if(!retVal){
  2381. this.$dlg = $('<div>', { id: this.dlgID, 'class': 'modal-dialog allLinks', tabindex: '0', style: 'display: none;width:500px', name: _name, 'listSel': _listSel })
  2382. .append($('<div>', { 'class': 'modal-dialog-title modal-dialog-title-draggable' })
  2383. .append($('<span>', { 'class': 'modal-dialog-title-text' }).text(_initialTitle))
  2384. .append($('<span>', { 'class': 'modal-dialog-title-text izhihu-collection-info' }))
  2385. .append($('<span>', {
  2386. 'class': 'modal-dialog-title-close'
  2387. , click: function() {
  2388. $('#zh-global-spinner').hide()
  2389. $('.modal-dialog-bg').hide()
  2390. $(this).closest('.modal-dialog').hide()
  2391. }
  2392. }))
  2393. )
  2394. .append($('<div>', { 'class': 'modal-dialog-content' })
  2395. .append($('<div>')
  2396. .append($('<div>', { 'class': 'zg-section' })
  2397. .append($('<div>', { 'class': 'izhihu-collection-links zg-form-text-input', tabIndex: '-1', style: 'height:300px;overflow-y:scroll;outline:none;' }))
  2398. .append($('<form>', { action: 'http://ilovezhihu.duapp.com/saveMe.py', method: 'post', target: '_blank', style: 'display:none' })
  2399. .append($('<textarea>', { style: "width: 100%;", name: "links", 'class': "izhihu-collection-links-post" }))
  2400. .append($('<input>', { name: 'title' }))
  2401. )
  2402. )
  2403. .append($('<div>', { 'class': 'zm-command' })
  2404. .append($('<div>', { 'class': 'zg-left' })
  2405. .append($('<a>', {
  2406. 'class': 'zg-btn-blue reload'
  2407. , href: 'javascript:void(0);'
  2408. , click: function() {
  2409. var $d = $(this).closest('.modal-dialog')
  2410. handler(1, Number(url.data.param.query['page']), $d)
  2411. }
  2412. }).text('重新获取'))
  2413. )
  2414. .append($('<a>', {
  2415. 'class': 'zg-btn-blue save'
  2416. , href: 'javascript:void(0);'
  2417. , click: function() {
  2418. var $dlg = $(this).closest('.modal-dialog-content')
  2419. , $links = $dlg.find('.izhihu-collection-links')
  2420. , $linksPost = $dlg.find('.izhihu-collection-links-post')
  2421. , $linksTitle = $linksPost.next()
  2422. , $form = $linksPost.parent()
  2423. , links = ''
  2424. ;
  2425. $links.find('li a').each(function(i, e) {
  2426. links += e.getAttribute('href') + '\n'
  2427. })
  2428. $linksPost.val(links)
  2429. $linksTitle.val($('#zh-fav-head-title,.zm-profile-header-main .title-section a.name').text())
  2430. $form.submit()
  2431. }
  2432. }).text('保存'))
  2433. )
  2434. )
  2435. ).appendTo(document.body)
  2436. .draggable({ handle: '.modal-dialog-title-draggable' })
  2437.  
  2438. if(this.$dlg.length)
  2439. retVal = true
  2440.  
  2441. }
  2442. return retVal
  2443. }
  2444.  
  2445. this.start = function($d) {
  2446. if ($('#zh-global-spinner:visible').length) return
  2447. if (!$d) $d = this.$dlg
  2448. if (!$d) return
  2449. if (!$('.izhihu-collection-links', $d).children().length) {
  2450. handler(1, Number(url.data.param.query['page']), $d)
  2451. }
  2452. }
  2453.  
  2454. }
  2455.  
  2456. /**
  2457. * 回答页
  2458. */
  2459.  
  2460. if(pageIs.Answer){
  2461.  
  2462. var $lblQuestionMeta=$('#zh-question-meta-wrap')//question_meta
  2463. ;
  2464.  
  2465. var $questionWrap=$('#zh-question-meta-wrap');
  2466. $questionWrap.children('.panel-container').bind('DOMNodeInserted',function(event){
  2467. window.iZhihu.Comment.processComment($(event.target));
  2468. });
  2469. if(window.iZhihu.Comment.RightComment){
  2470. //$questionWrap.children('.meta-item[name=addcomment]').prependTo($questionWrap);
  2471. window.iZhihu.Comment.processCommentButton($questionWrap);
  2472. if(!$('#izh_QuestionShadow').length){
  2473. $('<div>',{'class':'izh_boxShadow',id:'izh_QuestionShadow'}).css({
  2474. 'z-index': '-1'
  2475. , 'position': 'relative'
  2476. , 'top': -25
  2477. , 'margin-left': -32
  2478. }).prependTo('body>.zu-main:first').hide();
  2479. }
  2480. }
  2481.  
  2482. //process each answer
  2483. var $listAnswers=$('.zm-item-answer,.feed-item','#zh-question-answer-wrap');
  2484. if($listAnswers&&$listAnswers.length){
  2485. $listAnswers.each(function(i,e){
  2486. window.iZhihu.Answer.processAnswer($(e),null
  2487. , izhAuthorRear
  2488. , false);
  2489. });
  2490. }
  2491.  
  2492. $('#zh-question-answer-wrap').bind('DOMNodeInserted',function(event){
  2493. var $na=$(event.target).filter('.zm-item-answer');
  2494. if($na.length){
  2495. window.iZhihu.Answer.processAnswer($na,null
  2496. , izhAuthorRear
  2497. , false);
  2498. }
  2499. });
  2500.  
  2501. var $cm=$('.zm-comment-box',$questionWrap);
  2502. if($cm.length && $cm.is(':visible')){
  2503. var focusName = iZhihu.Comment.scrollFocusCommentOnPageLoad($cm);
  2504.  
  2505. iZhihu.Comment.metaScrollToViewBottom($cm.closest('.zm-item-meta'),function(){
  2506. iZhihu.Comment.processComment($cm, focusName);
  2507. });
  2508. }
  2509. }
  2510.  
  2511. /**
  2512. * 收藏页
  2513. */
  2514. if(pageIs.Collection){
  2515. //添加按钮
  2516. $('#zh-list-meta-wrap')
  2517. .append($('<span>', { 'class': 'zg-bull' }).text('•'))
  2518. .append($('<a>', { href: 'javascript:;', id: 'getAllLinks' }).text('地址清单'));
  2519.  
  2520. var btn = $('#getAllLinks');
  2521. var result = [];
  2522. //注册(不可用)点击事件
  2523. btn.click(function(){
  2524. var allLinksCollection=new allLinks('Collections','#zh-list-answer-wrap','收藏夹内容');
  2525. if(!allLinksCollection.initDialog())return;
  2526. $('.modal-dialog-bg').show();
  2527. var y = ($win.height() - allLinksCollection.$dlg.width()) / 2
  2528. , x = ($win.width() - allLinksCollection.$dlg.width()) / 2
  2529. ;
  2530. allLinksCollection.$dlg.css({'top': y, 'left': x}).fadeIn('slow');
  2531. allLinksCollection.start();
  2532. });
  2533. }
  2534. if(pageIs.Answers){
  2535. //添加按钮
  2536. $('.zm-profile-section-name')
  2537. .append($('<span>', { 'class': 'zg-bull' }).text('•'))
  2538. .append($('<a>', { href: 'javascript:;', id: 'getAllLinks' }).text('地址清单'));
  2539.  
  2540. var btn = $('#getAllLinks');
  2541. var result = [];
  2542. //注册(不可用)点击事件
  2543. btn.click(function(){
  2544. var allLinksAnswers=new allLinks('Answers','#zh-profile-answer-list','用户回答');
  2545. if(!allLinksAnswers.initDialog())return;
  2546. $('.modal-dialog-bg').show();
  2547. var y = ($win.height() - allLinksAnswers.$dlg.width()) / 2
  2548. , x = ($win.width() - allLinksAnswers.$dlg.width()) / 2
  2549. ;
  2550. allLinksAnswers.$dlg.css({'top': y, 'left': x}).fadeIn('slow');
  2551. allLinksAnswers.start();
  2552. });
  2553. }
  2554.  
  2555. if(pageIs.MyCollection&&window.iZhihu.QuickFavo){
  2556. var $favItems=$('#zh-favlists-wrap').children('.zm-item');
  2557. $favItems.each(function(i,e){
  2558. });
  2559. }
  2560.  
  2561. /*
  2562. * 首页
  2563. */
  2564. var $topstory=$('#is-topstory2')
  2565. , isTopStory=$topstory&&$topstory.length
  2566. , propFeedType='data-type'//:'data-feedtype'
  2567. , $lblHomeTitle=$('#zh-home-list-title')//activity_caption
  2568. , $btnNewActivity=$('#zh-main-feed-fresh-button')//new_activity
  2569. , $feedList=$('.zh-general-list')//feed_list
  2570. , $topLinkHome=$('#zh-top-link-home')
  2571. , $filter=//isTopStory?
  2572. $('<span>', { 'class':'izh-feeds-filter' })
  2573. .append($('<a>', { 'class': 'izh-button izh-feeds-filter-option', 'showFeeds': 'q' })
  2574. .append($('<i>', { 'class': 'zg-icon' }))
  2575. .append('问题')
  2576. )
  2577. .append($('<a>', { 'class': 'izh-button izh-feeds-filter-option', 'showFeeds': 'a' })
  2578. .append($('<i>', { 'class': 'zg-icon' }))
  2579. .append('回答')
  2580. )
  2581. .append($('<a>', { 'class': 'izh-button izh-feeds-filter-option', 'showFeeds': 'p,r', 'data-tip': 's$t$专栏、圆桌' })
  2582. .append($('<i>', { 'class': 'zg-icon' }))
  2583. .append('其他')
  2584. )
  2585. , $filterInfo=$('<a>',{'class':'izh-feeds-filter-info nothing',href:'javascript:void(0);'}).on('click',function(){$filter.trigger($filter.is(':hidden')||$filter.attr('doing')=='hide'?'show':'hide');})
  2586. , ShowFeeds=function(type,enable){
  2587. var id="izhCSS_FilterFeed_"+type
  2588. , nd=document.getElementById(id)
  2589. ;
  2590. if(enable){
  2591. if(nd)nd.parentNode.removeChild(nd);
  2592. }else if(heads.length){
  2593. if(!nd){
  2594. nd=_doc.createElement('style');
  2595. nd.type='text/css';
  2596. nd.id=id;
  2597. nd.appendChild(_doc.createTextNode('.feed-item['+propFeedType+'^="'+type+'"]{display:none}'));
  2598. heads[0].appendChild(nd);
  2599. }
  2600. //{ROUNDTABLE_ADD_RELATED: "roundtable",ARTICLE_VOTE_UP: "post_vote",ARTICLE_CREATE: "post_create",RECOMMENDED: "feed_recommended",QUESTION_FOLLOW: "feed_question_follow",QUESTION_CREATE: "feed_question",ANSWER_VOTE_UP: "feed_answer_vote",ANSWER_CREATE: "feed_answer_answer"};
  2601. }
  2602. }
  2603. , refreshFilterInfo=function(){
  2604. var count=$feedList.children('.feed-item:hidden').length
  2605. , info=' >过滤选项<'
  2606. ;
  2607. if(count){
  2608. info='('+count+'条动态被隐藏)';
  2609. $filterInfo.removeClass('nothing').css({display:''});
  2610. }else{
  2611. $filterInfo.addClass('nothing');
  2612. }
  2613. $filterInfo.text(info);
  2614. }
  2615. , feedsColumns=function(){ // Implemented by morley, modified by unogz
  2616. //动态的类型
  2617. var feedTypes = //isTopStory?
  2618. [{
  2619. index: 0,
  2620. name: '全部',
  2621. codeName: ''
  2622. }, {
  2623. index: 1,
  2624. name: '问题',
  2625. codeName: 'q'
  2626. }, {
  2627. index: 2,
  2628. name: '回答',
  2629. codeName: 'a'
  2630. }, {
  2631. index: 3,
  2632. name: '专栏',
  2633. codeName: 'p'
  2634. }];
  2635. //自定义 CSS 到 head
  2636. var styles = [];
  2637. styles.push('.za-filter{display: inline-block;margin-right:10px;cursor:pointer;color:#999;}');
  2638. styles.push('.za-filter.active{color:#259;}');
  2639. styles.push('.za-filter>.zg-num.hide{display:none;}');
  2640. $('<style/>').text(styles.join('')).appendTo('head');
  2641. var $zhHomeListTitle = $lblHomeTitle;
  2642. //根据类型添加过滤按钮 到 #zh-home-list-title
  2643. var filterBtns = []
  2644. , i = feedTypes.length;
  2645. while (i--) {
  2646. filterBtns.push(
  2647. $('<span>').addClass('za-filter')
  2648. .attr('typeIndex', feedTypes[i].index)
  2649. .text(feedTypes[i].name)
  2650. .append($('<span>', { 'class': 'zg-num' }).addClass('hide'))
  2651. .on('click', toggleFeedType)
  2652. );
  2653. }
  2654. filterBtns.reverse();
  2655. filterBtns[0].addClass('active');
  2656.  
  2657. $zhHomeListTitle.contents().filter(function(i,e){
  2658. return (e!=null&&(e.nodeValue||'').indexOf('最新动态')>=0)
  2659. }).remove()
  2660. $zhHomeListTitle.find('i').eq(0).after(filterBtns).remove();
  2661. var $targetZero = filterBtns[0].find('.zg-num')
  2662. , curfeedTypeCodeName = ''
  2663. function typeMatch($elem) {
  2664. if (curfeedTypeCodeName == '') {
  2665. $elem.show();
  2666. } else if (0 <= $elem.attr(propFeedType).indexOf(curfeedTypeCodeName)) {
  2667. $elem.show();
  2668. } else {
  2669. $elem.hide();
  2670. }
  2671. }
  2672. //按钮事件
  2673. function toggleFeedType() {
  2674. var $clicked = $(this);
  2675. $clickedNum = $clicked.find('.zg-num');
  2676. // 交互效果
  2677. filterBtns.forEach(function(item) {
  2678. item.removeClass('active');
  2679. });
  2680. $clicked.addClass('active');
  2681. if ($clicked.attr('typeIndex') == 0) {
  2682. $('.zg-num', '.za-filter').text('').addClass('hide');
  2683. } else {
  2684. var totalUnread = (parseInt($targetZero.text()) || 0) - (parseInt($clickedNum.text()) || 0);
  2685. if (totalUnread != 0) {
  2686. $targetZero.text(totalUnread);
  2687. } else {
  2688. $targetZero.text('').addClass('hide');
  2689. }
  2690. $clickedNum.text('').addClass('hide');
  2691. }
  2692. curfeedTypeCodeName = feedTypes[$clicked.attr('typeIndex')].codeName;
  2693. // 信息流过滤
  2694. $('.feed-item').each(function() {
  2695. typeMatch($(this));
  2696. });
  2697. }
  2698. function getTypeIndexByCodeName(codeName) {
  2699. var i = feedTypes.length;
  2700. while (i--) {
  2701. if (codeName == feedTypes[i].codeName) {
  2702. return i;
  2703. };
  2704. }
  2705. }
  2706. var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
  2707. //监听推送
  2708. var hasNewFeed = false;
  2709. //create an observer instance
  2710. var observer = new MutationObserver(function(mutations) {
  2711. if ( !! parseInt($btnNewActivity.text())) {
  2712. mutations.forEach(function(mutation) {
  2713. if (mutation.type === 'childList') {
  2714. console.log('Has New Feed');
  2715. // 有新推送则触发之
  2716. hasNewFeed = true;
  2717. $btnNewActivity.text('');
  2718. $.when($btnNewActivity[0].click()).done(function() {
  2719. setTimeout(function() {
  2720. hasNewFeed = false;
  2721. }, 1000);
  2722. });
  2723. }
  2724. });
  2725. };
  2726. });
  2727. //pass in the target node, as well as the observer options
  2728. observer.observe(
  2729. $btnNewActivity[0], {
  2730. childList: true
  2731. });
  2732. //监听插入
  2733. $feedList.on("DOMNodeInserted", function(e) {
  2734. var $self = $(e.target);
  2735. if ($self.hasClass('feed-item')) {
  2736. if (hasNewFeed) {
  2737. $self.hide();
  2738. var $target = filterBtns[getTypeIndexByCodeName($self.attr(propFeedType))].find('.zg-num');
  2739. $target.text((parseInt($target.text()) || 0) + 1).removeClass('hide');
  2740. $targetZero.text((parseInt($targetZero.text()) || 0) + 1).removeClass('hide');
  2741. } else {
  2742. typeMatch($self);
  2743. }
  2744. }
  2745. });
  2746. }
  2747. , homeFeeds=function(izhHomeFeedsColumns){
  2748. if (izhHomeFeedsColumns){
  2749. feedsColumns();
  2750. }else{
  2751. $filter.children('.izh-feeds-filter-option').addClass('on').click(function(event){
  2752. var i=0
  2753. , $e=$(this)
  2754. , fs=$e.attr('showFeeds')
  2755. , fa=fs.split(',')
  2756. ;
  2757. $('.izh-feeds-filter-option[showFeeds="'+fs+'"]').toggleClass('on');
  2758. for(;i<fa.length;i++){
  2759. ShowFeeds(fa[i],$e.is('.on'));
  2760. }
  2761. refreshFilterInfo();
  2762. });
  2763. if($topLinkHome.length){
  2764. var $filter2=$('<div>')
  2765. .css({position:'absolute',border:'1px solid #777',backgroundColor:'#fff'}).hide()
  2766. .append($filter.clone(true,true).css({display:'block'}))
  2767. .on('show',function(){
  2768. var $e=$(this).stop();
  2769. if($e.is(':hidden'))
  2770. $e.css({display:'',opacity:0})
  2771. $e.animate({opacity:1},'slow');
  2772. })
  2773. .on('hide',function(){
  2774. var $e=$(this).stop();
  2775. $e.fadeOut('slow');
  2776. })
  2777. ;
  2778. $topLinkHome.after($filter2).parent()
  2779. .on('mouseenter',function(event){
  2780. var $e=$(this)
  2781. , $f=$e.children().last()
  2782. ;
  2783. $f.trigger('show');
  2784. $filterInfo.filter('.nothing').hide();
  2785. })
  2786. .on('mouseleave',function(event){
  2787. var $e=$(this)
  2788. , $f=$e.children().last()
  2789. ;
  2790. $f.trigger('hide');
  2791. $filterInfo.filter('.nothing').hide();
  2792. })
  2793. ;
  2794. }
  2795. if($lblHomeTitle.length){
  2796. $filterInfo.css({
  2797. display:'none'
  2798. , textDecoration:'none'
  2799. , cursor:'pointer'
  2800. }).insertBefore(isTopStory?$topstory:$('#feed-ver'));
  2801. $lblHomeTitle.css({overflow:'hidden'})
  2802. .prepend($filter)
  2803. //.children('i:first')
  2804. .on('mouseenter',function(event){
  2805. var $e=$(this)
  2806. , $f=$e.children('.izh-feeds-filter-info.nothing').stop()
  2807. ;
  2808. if($f.is(':hidden'))
  2809. $f.css({display:'',opacity:0})
  2810. $f.animate({opacity:1},'fast');
  2811. })
  2812. .on('mouseleave',function(event){
  2813. var $e=$(this)
  2814. , $f=$e.children('.izh-feeds-filter-info.nothing').stop()
  2815. ;
  2816. $f.fadeOut('fast');
  2817. })
  2818. ;
  2819. $filter.css({marginLeft:-$filter.width(),display:'none'})
  2820. .on('show',function(){
  2821. var $e=$(this);
  2822. if($e.attr('doing')==='show')return;
  2823. $e.attr('doing','show').stop();
  2824. if($e.is(':hidden'))
  2825. $e.css({display:''})
  2826. $e.animate({marginLeft:0},'slow',function(){$(this).css('display','').removeAttr('doing');});
  2827. })
  2828. .on('hide',function(){
  2829. var $e=$(this);
  2830. if($e.attr('doing')==='hide')return;
  2831. $e.attr('doing','hide').stop();
  2832. $e.animate({marginLeft:-$filter.width()},'slow',function(){$(this).css('display','none').removeAttr('doing');});
  2833. })
  2834. .on('mouseenter',function(event){
  2835. var $e=$(this)
  2836. ;
  2837. $e.trigger('show');
  2838. })
  2839. .on('mouseleave',function(event){
  2840. var $e=$(this)
  2841. ;
  2842. $e.trigger('hide');
  2843. })
  2844. ;
  2845. refreshFilterInfo();
  2846. }
  2847. }
  2848. }
  2849. ;
  2850. if(pageIs.Home||pageIs.Debuts){
  2851. $feedList.find('.feed-item').each(function(i,e){
  2852. window.iZhihu.Answer.processAnswer($(e),null
  2853. , izhAuthorRear
  2854. , izhAuthorList
  2855. );
  2856. });
  2857. $feedList.bind('DOMNodeInserted',function(event){
  2858. var $item=$(event.target);
  2859. if($item.is('.feed-item')){
  2860. window.iZhihu.Answer.processAnswer($item,null
  2861. , $body.attr('izhAuthorRear')=='1'
  2862. , $body.attr('izhAuthorList')=='1'
  2863. );
  2864. refreshFilterInfo();
  2865. }
  2866. });
  2867. }
  2868.  
  2869. if (pageIs.Home){
  2870. var bHomeFeedsColumns=window.iZhihu.config['HomeFeedsColumns']
  2871. if (izhHomeNoti&&!bHomeFeedsColumns
  2872. && $lblHomeTitle.length
  2873. && $btnNewActivity.length
  2874. ){
  2875. $lblHomeTitle.css({
  2876. 'float':'left'
  2877. , 'margin-bottom':'2px'
  2878. , 'line-height':'32px'
  2879. , 'width':'100%'
  2880. }).next().css('clear','both');
  2881. $btnNewActivity.css({
  2882. 'float':'right'
  2883. , 'margin':'0'
  2884. , 'line-height':'22px'
  2885. }).appendTo($lblHomeTitle);
  2886. }
  2887. homeFeeds(bHomeFeedsColumns);
  2888. }
  2889.  
  2890.  
  2891. /**
  2892. * 问题页
  2893. */
  2894.  
  2895. if(pageIs.Question){
  2896.  
  2897. var $lblQuestionMeta=$('#zh-question-meta-wrap')//question_meta
  2898. , $listAnswers=$('#zh-question-answer-wrap,#zh-question-collapsed-wrap').children()//$('.zm-item-answer','#zh-single-question')
  2899. , numAnswersCount=$listAnswers.length
  2900. , $btnCollapsedSwitcher=$('#zh-question-collapsed-switcher')
  2901. , numCollapsedCount=!$btnCollapsedSwitcher.length||$btnCollapsedSwitcher.is(':hidden')?0:parseInt($('#zh-question-collapsed-num').text())
  2902. , numAnswersCountTotal=numAnswersCount+numCollapsedCount
  2903. , $reply=$('#zh-question-answer-form-wrap')//reply_form
  2904. ;
  2905. if($lblQuestionMeta.length){
  2906. var s=new Array()
  2907. , $a=$('<a>')
  2908. , $c=$('<span>',{'class':'zg-bull'}).text('•')
  2909. , $p=$lblQuestionMeta.children('.zm-meta-panel').children('a.meta-item:last')
  2910. , $m=$('.zu-answer-form-disabled-wrap:visible > a','#zh-question-answer-form-wrap')
  2911. ;
  2912. if($m.length){
  2913. s.push($m.attr('href'));
  2914. $a.text('我的回答');
  2915. }else if($reply.length){
  2916. var id='new_answer'
  2917. , $b=$('<a>',{name:id}).before($reply.children().first());
  2918. s.push('#draft');
  2919. $a.text('我要回答');
  2920. }
  2921. $c.insertAfter($p);
  2922. $a.attr('href',s.join('')).attr('target','_self')
  2923. .insertAfter($c);
  2924. }
  2925. if (izhAuthorList&&
  2926. numAnswersCountTotal>100&&
  2927. confirm('这个问题的回答数较多,是否暂时关闭「iZhihu 回答目录」?')){
  2928. //$('#izhCSS_comment').remove();
  2929. //return;
  2930. izhAuthorList=false;
  2931. $body.attr('izhAuthorList','0');
  2932. }
  2933. //console.log((new Date()).getTime());
  2934. var $lblAnswersCount=$('#zh-question-answer-num')//answers_count
  2935. , $uno=$('<div>',{'class':'uno',style:'float:left'})//izh_AuthorsList
  2936. , $ppT=$('<span>',{'class':'meT',style:'display:none'})//izh_AuthorsList_TopSelfIndicator
  2937. , $frm=$('<div>',{'class':'frame'})//izh_AuthorsList_frame
  2938. , $ppB=$('<span>',{'class':'meB',style:'display:none'})//izh_AuthorsList_BottomSelfIndicator
  2939. , $pp=$('<ul>',{'class':'pp'})//izh_AuthorsList_UL
  2940. , $ppI=$('<div>')
  2941. ;
  2942.  
  2943. window.iZhihu.$unoAnswers = $uno
  2944. /*
  2945. //答案按时间排序
  2946. if(utils.getCfg('answer_orderByTime')){
  2947. client.click('.zh-answers-filter-popup div[data-key=added_time]');
  2948. }
  2949. */
  2950. var $questionWrap=$('#zh-question-meta-wrap');
  2951. $questionWrap.children('.panel-container').bind('DOMNodeInserted',function(event){
  2952. window.iZhihu.Comment.processComment($(event.target));
  2953. });
  2954. if(window.iZhihu.Comment.RightComment){
  2955. //$questionWrap.children('.meta-item[name=addcomment]').prependTo($questionWrap);
  2956. window.iZhihu.Comment.processCommentButton($questionWrap);
  2957. if(!$('#izh_QuestionShadow').length){
  2958. $('<div>',{'class':'izh_boxShadow',id:'izh_QuestionShadow'}).css({
  2959. 'z-index': '-1'
  2960. , 'position': 'relative'
  2961. , 'top': -25
  2962. , 'margin-left': -32
  2963. }).prependTo('body>.zu-main:first').hide();
  2964. }
  2965. }
  2966.  
  2967. //process each answer
  2968. if($listAnswers&&$listAnswers.length){
  2969. if(izhAuthorList){
  2970. $uno.appendTo($banner);
  2971. $ppT.appendTo($uno);
  2972. $frm.appendTo($uno);
  2973. $pp.appendTo($frm);
  2974. $ppB.appendTo($uno);
  2975. //uno.appendChild(ppI);
  2976. $uno.$endOfLastA=$('<li>').addClass('endOfLastA').appendTo($pp)
  2977. }
  2978. $listAnswers.each(function(i,e){
  2979. window.iZhihu.Answer.processAnswer($(e),$pp
  2980. , izhAuthorRear
  2981. , izhAuthorList);
  2982. });
  2983. if($reply.children('.zu-answer-form-disabled-wrap').is(':hidden')){
  2984. var $ppla=$('<a>',{href:'#draft',target:'_self'})
  2985. .append($('<table>', { 'class': 'plus' })
  2986. .append($('<tr>')
  2987. .append($('<td>'))
  2988. .append($('<td>'))
  2989. )
  2990. .append($('<tr>')
  2991. .append($('<td>'))
  2992. .append($('<td>'))
  2993. )
  2994. )
  2995. .append($('<span>', { 'class': 'name func' }).text('-new-'))
  2996. , $ppl=$('<li>')
  2997. .append($ppla)
  2998. .appendTo($pp)
  2999. ;
  3000. }
  3001. }
  3002. var resizeAuthorList=function($f){
  3003. // Adjust AuthorList's size and locate its position
  3004. if(!$f||!$f.length)return;
  3005. var frm=$f.get(0);
  3006. var width=window.iZhihu.Answer.ppWidth
  3007. , height=$win.height()-$main.offset().top-3-$f.position().top;
  3008. if(frm.scrollHeight>height){
  3009. $f.height(height);
  3010. width+=20;
  3011. }else{
  3012. $f.height('');
  3013. }
  3014. $f.width(width);
  3015. };
  3016. if(isNaN(numCollapsedCount))numCollapsedCount=0;
  3017. if($listAnswers.length||numCollapsedCount){
  3018. if(izhAuthorList){
  3019. $uno.css({
  3020. 'float':'none'
  3021. , 'left':9-$uno.width()
  3022. });
  3023. if(!$btnCollapsedSwitcher.length&&!numCollapsedCount)
  3024. resizeAuthorList($frm);
  3025. $('<div>',{'class':'modal-dialog-title'}).css({
  3026. 'border-top-left-radius':0
  3027. }).insertBefore($ppT);
  3028. $uno.mouseover(function(){
  3029. resizeAuthorList($('.frame',this));
  3030. $(this).css('left','0');
  3031. }).mouseout(function(){
  3032. $(this).css('left',9-$(this).width());
  3033. });
  3034. if(window.iZhihu.Answer._e){
  3035. $uno.children('.meT').css('display',0>window.iZhihu.Answer._e.offsetTop-$frm.scrollTop()?'':'none');
  3036. $uno.children('.meB').css('display',$frm.height()<window.iZhihu.Answer._e.offsetTop-$frm.scrollTop()+window.iZhihu.Answer._e.offsetHeight?'':'none');
  3037. }
  3038. }
  3039. if($btnCollapsedSwitcher.length){
  3040. if(numCollapsedCount>0){
  3041. $('#zh-question-collapsed-wrap').show().bind('DOMNodeInserted',function(event){
  3042. var $a=$(event.target);
  3043. if($a.is('.zm-item-answer')){
  3044. window.iZhihu.Answer.processAnswer($a,$pp
  3045. , $body.attr('izhAuthorRear')=='1'
  3046. , $body.attr('izhAuthorList')=='1'
  3047. );
  3048. var count = $('.zm-item-answer[izh_processed=1]','#zh-question-collapsed-wrap').length;
  3049. if(count==numCollapsedCount){
  3050. resizeAuthorList($frm);
  3051. }
  3052. }
  3053. });
  3054. }
  3055. $btnCollapsedSwitcher[0].click();
  3056. }
  3057. }
  3058.  
  3059. $('#zh-question-answer-wrap').bind('DOMNodeInserted',function(event){
  3060. var $na=$(event.target).filter('.zm-item-answer');
  3061. if($na.length){
  3062. window.iZhihu.Answer.processAnswer($na,$pp
  3063. , $body.attr('izhAuthorRear')=='1'
  3064. , $body.attr('izhAuthorList')=='1'
  3065. );
  3066. }
  3067. });
  3068. //console.log((new Date()).getTime());
  3069.  
  3070. var $cm=$('.zm-comment-box',$questionWrap);
  3071. if($cm.length && $cm.is(':visible')){
  3072. var focusName = iZhihu.Comment.scrollFocusCommentOnPageLoad($cm);
  3073. iZhihu.Comment.metaScrollToViewBottom($cm.closest('.zm-item-meta'),function(){
  3074. iZhihu.Comment.processComment($cm, focusName);
  3075. });
  3076. }
  3077. }
  3078.  
  3079. /**
  3080. * 配置界面
  3081. */
  3082.  
  3083. var $btnSettings = $('<li>')
  3084. .append($('<a>', { href: 'javascript:void(0);', tabindex: '-1' })
  3085. .append($('<i>', { 'class': 'zg-icon zg-icon-dd-settings izhihu-settings' }))
  3086. .append('iZhihu')
  3087. ).click(function(){
  3088. var $settings = $('#izh-dlg-settings')
  3089. $('.modal-dialog-bg').show()
  3090. $('.izh-option', '#izh-dlg-settings').each(function(i, e){
  3091. var key = e.getAttribute('name')
  3092. , value = utils.getCfg(key)
  3093. , $e = $(e)
  3094. if ($e.is('input:checkbox')) {
  3095. if(value)
  3096. $(e).iCheck('check')
  3097. } else if ($e.is('select')) {
  3098. e.value = value
  3099. }
  3100. })
  3101. $settings.css({
  3102. 'z-index':'99'
  3103. , 'position':'fixed'
  3104. , 'top': ($win.height() - $settings.height()) / 2
  3105. , 'left': ($win.width() - $settings.width()) / 2
  3106. }).fadeIn('slow')
  3107. }).insertBefore($('ul#top-nav-profile-dropdown li:last'))
  3108. , $dlgSettings = $('<div>', { id: 'izh-dlg-settings', 'class': 'modal-dialog', tabindex: '0', style: 'display:none;width:600px'})
  3109. .append($('<div>', { 'class': 'modal-dialog-title modal-dialog-title-draggable' })
  3110. .append($('<span>', { 'class': 'modal-dialog-title-text' }).text('配置选项'))
  3111. .append($('<span>', {
  3112. 'class': 'modal-dialog-title-close'
  3113. , click: function(){
  3114. $('.modal-dialog-bg').hide()
  3115. $('#izh-dlg-settings').first().hide()
  3116. }
  3117. }))
  3118. )
  3119. .append($('<div>', { 'class': 'modal-dialog-content' })
  3120. .append($('<div>', {})
  3121. .append($('<div>', { 'class': 'zg-section' })
  3122. .append($('<table>', { 'class': 't_set_tb', border: 0, cellspacing: 0, cellpadding: 5, width: '100%' })
  3123. .append($('<thead>', {})
  3124. .append($('<tr>', {})
  3125. .append($('<td>', { colspan: 6, align: 'left' }).text('(更改后设置将立刻保存,但只有当页面再次打开时才会生效)')
  3126. .prepend(
  3127. $('<b>').text('功能开关')
  3128. )
  3129. )
  3130. )
  3131. )
  3132. .append($('<tbody>', {})
  3133. /*
  3134. .append($('<tr>', {})
  3135. .append($('<td>', { colspan: 4, align: 'left' }).text('在首页直接浏览常去话题'))
  3136. .append($('<td>', { align: 'right'})
  3137. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': ""}))
  3138. )
  3139. .append($('<td>', { align: 'right'})
  3140. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setHomeTopics", name: "HomeTopics" }))
  3141. )
  3142. )
  3143. */
  3144. .append($('<tr>', {})
  3145. .append($('<td>', { colspan: 4, align: 'left' }).text('改变网页样式外观'))
  3146. .append($('<td>', { align: 'right'})
  3147. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': "s$t$* 首页隐藏大头像<br/>* 缩进投票按钮(问题/回答页)<br/>* 按钮图标动画 "}))
  3148. )
  3149. .append($('<td>', { align: 'right'})
  3150. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setHomeLayout", name: "HomeLayout" }))
  3151. )
  3152. )
  3153. .append($('<tr>', {})
  3154. .append($('<td>', { colspan: 4, align: 'left' }).text('自动收起导航栏'))
  3155. .append($('<td>', { align: 'right'})
  3156. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': "s$t$* 滚动页面至下方时,自动收起顶部导航栏 "}))
  3157. )
  3158. .append($('<td>', { align: 'right'})
  3159. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setTopNavAutoFold", name: "TopNavAutoFold" }))
  3160. )
  3161. )
  3162. .append($('<tr>', {})
  3163. .append($('<td>', { colspan: 4, align: 'left' }).text('调整首页「新动态」提醒按钮'))
  3164. .append($('<td>', { align: 'right'})
  3165. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': "s$t$挪到 Timeline 右上角<br/>与标题「最新动态」平行"}))
  3166. )
  3167. .append($('<td>', { align: 'right'})
  3168. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setHomeNoti", name: "HomeNoti" }))
  3169. )
  3170. )
  3171. .append($('<tr>', {})
  3172. .append($('<td>', { colspan: 4, align: 'left' }).text('开启「首页分栏」'))
  3173. .append($('<td>', { align: 'right'})
  3174. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': "s$t$将首页动态分类单独显示:<br/>问题、回答、专栏"}))
  3175. )
  3176. .append($('<td>', { align: 'right'})
  3177. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setHomeFeedsColumns", name: "HomeFeedsColumns" }))
  3178. )
  3179. )
  3180. .append($('<tr>', {})
  3181. .append($('<td>', { colspan: 4, align: 'left' }).text('将用户信息挪到回答下方'))
  3182. .append($('<td>', { align: 'right'})
  3183. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': ""}))
  3184. )
  3185. .append($('<td>', { align: 'right'})
  3186. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setAuthorRear", name: "AuthorRear" }))
  3187. )
  3188. )
  3189. .append($('<tr>', {})
  3190. .append($('<td>', { align: 'left' }).text('开启「右舷评论」'))
  3191. .append($('<td>', { align: 'right'})
  3192. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': "s$t$在页面右侧浮动显示打开的评论列表<br/>在首页、问题、回答页中生效"}))
  3193. )
  3194. .append($('<td>', { align: 'right'})
  3195. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setRightComment", name: "ShowComment" }))
  3196. )
  3197. .append($('<td>', { width: 1, nowrap: 'nowrap', align: 'left' }).text('关闭时自动卷屏至对应条目'))
  3198. .append($('<td>', { align: 'right'})
  3199. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': "s$t$仅对右舷评论生效"}))
  3200. )
  3201. .append($('<td>', { align: 'right'})
  3202. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setRightComment_AutoScrollPageWhenClosing", name: "RightComment_AutoScrollPageWhenClosing" }))
  3203. )
  3204. )
  3205. .append($('<tr>', {})
  3206. .append($('<td>', { colspan: 4, align: 'left' }).text('开启「快速屏蔽」(加入黑名单/取消关注)功能'))
  3207. .append($('<td>', { align: 'right'})
  3208. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': "s$t$在赞同列表、评论列表中使用"}))
  3209. )
  3210. .append($('<td>', { align: 'right'})
  3211. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setQuickBlock", name: "QuickBlock" }))
  3212. )
  3213. )
  3214. .append($('<tr>', {})
  3215. .append($('<td>', { colspan: 4, align: 'left' }).text('开启「快速收藏」菜单'))
  3216. .append($('<td>', { align: 'right'})
  3217. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': "s$t$鼠标移上「收藏」按钮时显示"}))
  3218. )
  3219. .append($('<td>', { align: 'right'})
  3220. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setQuickFavo", name: "QuickFavo" }))
  3221. )
  3222. )
  3223. .append($('<tr>', {})
  3224. .append($('<td>', { colspan: 4, align: 'left' }).text('开启「回答目录」'))
  3225. .append($('<td>', { align: 'right'})
  3226. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': "s$t$在问题页面左侧掩藏,鼠标移上时展开<br/>并在右侧即时显示回答预览"}))
  3227. )
  3228. .append($('<td>', { align: 'right'})
  3229. .append($('<input>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setAuthorList", name: "AuthorList" }))
  3230. )
  3231. )
  3232. .append($('<tr>', {})
  3233. .append($('<td>', { colspan: 4, align: 'left' }).text('选择「外部搜索引擎」'))
  3234. .append($('<td>', { align: 'right'})
  3235. .append($('<i>', { 'class': 'icon icon-help', 'data-tip': "s$t$你懂的"}))
  3236. )
  3237. .append($('<td>', { align: 'right'})
  3238. .append($('<select>', { type: "checkbox", 'class': "izh-option", id: "iZhihu_setSearchEngineOutside", name: "SearchEngineOutside"})
  3239. .append($('<option>', { value:'google' }).text('Google'))
  3240. .append($('<option>', { value:'baidu' }).text('百度'))
  3241. )
  3242. )
  3243. )
  3244. )
  3245. )
  3246. )
  3247. .append($('<div>', { 'class': 'zg-left' })
  3248. .append('当前版本:'+version+';')
  3249. .append('最后更新:'+updateDate)
  3250. .append($('<br>'))
  3251. .append('制作:')
  3252. .append($('<a>', { 'data-tip': "p$t$unogzx", href: "/people/unogzx" }).text('@钢盅郭子'))
  3253. .append(',')
  3254. .append($('<a>', { 'data-tip': "p$t$liuyong25", href: "/people/liuyong25" }).text('@天猪(刘勇)'))
  3255. .append(',')
  3256. .append($('<a>', { 'data-tip': "p$t$luoxr", href: "/people/luoxr" }).text('@yukirock'))
  3257. .append(',')
  3258. .append($('<a>', { 'data-tip': "p$t$morlay", href: "/people/morlay" }).text('@墨磊'))
  3259. .append($('<br>'))
  3260. .append('感谢:')
  3261. .append($('<a>', { 'data-tip': "p$t$PeterDeng", href: "/people/PeterDeng" }).text('@邓文博'))
  3262. .append(',')
  3263. .append($('<a>', { 'data-tip': "p$t$cakvfcwz", href: "/people/cakvfcwz" }).text('@水云逸'))
  3264. )
  3265. .append($('<div>', { 'class': 'zm-command' })
  3266. .append($('<a>', { id: 'izhRefresh', 'class': 'zg-btn-blue', href: 'javascript:void(0);' }).text('刷新网页'))
  3267. )
  3268. )
  3269. ).appendTo(_doc.body).draggable({handle: '.modal-dialog-title-draggable'})
  3270.  
  3271. $('.izh-option', $dlgSettings).each(function(i, e){
  3272. var key = e.getAttribute('name')
  3273. , $chk = $(e).filter('input:checkbox').iCheck({
  3274. checkboxClass: 'icheckbox_square-blue'
  3275. , increaseArea: '20%' // optional
  3276. }).bind('ifChanged', function(event){
  3277. var value = this.checked
  3278. utils.setCfg(key, value)
  3279. })
  3280. , $sel = $(e).filter('select').bind('change', function() {
  3281. utils.setCfg(key, this.value)
  3282. })
  3283. })
  3284. $('#izhRefresh').click(function(){
  3285. location.reload()
  3286. })
  3287.  
  3288. /*
  3289. * 设置-屏蔽
  3290. */
  3291. if (pageIs.SettingsFilter){
  3292. var all=[]
  3293. , $secBlockedUsers = $('#section-blocked-users')
  3294. , $secBlockedUsersTitle = $secBlockedUsers.children('.settings-section-title:first').children('h2:first')
  3295. , $pnlUnBlockedUsers = $('<div>').appendTo($secBlockedUsersTitle).css({
  3296. float: 'right'
  3297. })
  3298. , $lbFilterBlockedUsers = $('<label/>').appendTo($pnlUnBlockedUsers).css({
  3299. float: 'left'
  3300. })
  3301. , $tbFilterBlockedUsers = $('<input/>', {
  3302. 'class': 'zg-form-text-input zg-mr15'
  3303. , placeholder: '用户名或昵称'
  3304. }).appendTo($pnlUnBlockedUsers).on('keyup', function(event){
  3305. var kw=this.value
  3306. , n=0
  3307. , $listBlockedUsers=$secBlockedUsers.find('.blocked-users > .item > .body > a').each(function(i,e){
  3308. var $a = $(e)
  3309. , href = e.getAttribute('href') || ''
  3310. , text = e.innerHTML
  3311. , notMatch = (href.indexOf(kw) < 0 && text.indexOf(kw) < 0)
  3312. if(!notMatch){
  3313. n++
  3314. }
  3315. $a.closest('.item').css('display', notMatch ? 'none' : '')
  3316. })
  3317. $lbFilterBlockedUsers.text([n?n+' ':'无','人匹配:'].join(''))
  3318. }).css({
  3319. float: 'left'
  3320. }).trigger('keyup')
  3321. , funcUnblock=function(){
  3322. if(all.length==0){return}
  3323. var e=all.shift()
  3324. $.post('/settings/unblockuser', $.param({
  3325. _xsrf: $('input[name=_xsrf]').val()
  3326. , uid: e.getAttribute('data-id')
  3327. })).done(function(result){
  3328. $(e).remove()
  3329. }).fail(function(result){
  3330. all.push(e)
  3331. }).always(function(result){
  3332. $lbFilterBlockedUsers.text([all.length?all.length+' ':'无','人匹配:'].join(''))
  3333. funcUnblock()
  3334. })
  3335. }
  3336. , h=$tbFilterBlockedUsers.outerHeight()
  3337. , $btUnBlockedUsers = $('<input/>', {
  3338. 'class': 'zg-btn zg-btn-unfollow'
  3339. , type: 'button'
  3340. , value: '取消屏蔽'
  3341. }).appendTo($pnlUnBlockedUsers).on('click', function(event){
  3342. $('#section-blocked-users > .settings-item > .settings-item-content > .blocked-users > .item').each(function(i,e){
  3343. var $e = $(e)
  3344. if($e.is(':visible')){
  3345. all.push(e)
  3346. }
  3347. })
  3348. funcUnblock()
  3349. }).css({
  3350. float: 'left'
  3351. }).height(h)
  3352. $lbFilterBlockedUsers.css('line-height', h+'px')
  3353. }
  3354.  
  3355. var firstRun = parseInt(utils.getValue('izh_fr','1'));
  3356.  
  3357. function _FRshow(){
  3358. if(firstRun>0 && document.domain=='zhihu.com'){
  3359. var tboxleft=0;
  3360. var accitem1= $('#zh-top-inner div.top-nav-profile .zu-top-nav-userinfo');
  3361. if(accitem1.length>0){
  3362. tboxleft = accitem1.offset().left;
  3363. }
  3364. if(tboxleft>0){
  3365. $('<div>', { id: 'iZhihu_tbox', 'class': 't_frshow' }).appendTo('body.zhi').hide()
  3366. .append($('<div>', { 'class': 't_txtshow t_tbox' })
  3367. .append('感谢使用')
  3368. .append($('<b>').text('iZhihu'))
  3369. .append($('<br />'))
  3370. .append('您可通过菜单【iZhihu】对功能进行设置')
  3371. .append($('<br />'))
  3372. .append($('<s>')
  3373. .append($('<i>'))
  3374. )
  3375. );
  3376. $('#iZhihu_tbox').css('left',tboxleft-100).show().mouseenter(function(){
  3377. utils.setValue('izh_fr','0');
  3378. //_Menu();
  3379. $(this).remove();
  3380. });
  3381. }
  3382. }
  3383. }
  3384. setTimeout(function(){
  3385. _FRshow();
  3386. },1000);
  3387.  
  3388.  
  3389. console.log('iZhihu '+version+' started.');
  3390. //console.log(window.iZhihu);
  3391. //console.log((new Date()).getTime());
  3392. //});

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址