Tieba Advanced

贴吧增强 - Gerald倾情打造

当前为 2015-02-02 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Tieba Advanced
  3. // @namespace http://gera2ld.blog.163.com/
  4. // @author Gerald <gera2ld@163.com>
  5. // @icon http://ww2.sinaimg.cn/small/a56031a1gw1emwlbe1c8gj2097097wfa.jpg
  6. // @version 2.7.7
  7. // @description 贴吧增强 - Gerald倾情打造
  8. // @homepageURL http://geraldl.net/userjs/TiebaAdvanced
  9. // @include http://tieba.baidu.com/*
  10. // @exclude http://tieba.baidu.com/tb/*
  11. // @require https://greasyfork.org/scripts/144/code.user.js
  12. // @grant none
  13. // ==/UserScript==
  14.  
  15. var mask=$('<div class=ge_mask style="padding:100px 100px 20px;">').appendTo('body'); // Mask layer
  16. // Arrays for Lzl initiation
  17. var lzl_init=[],lzl_buttons=[],lzl_styles=[]/*,lzl_efilters=[]*/;
  18. addPButton=function(o,c,m,a) { // 新增楼中楼按钮
  19. lzl_styles=lzl_styles.concat(c);o.addClass(c[0]);
  20. if(!a) a={};
  21. //if(!a.after) a.after='.lzl_panel_submit';
  22. lzl_buttons.push([o,m,a]);
  23. return o;
  24. };
  25. DELAY=2000;
  26.  
  27. // 初始化贴子管理面板
  28. function initPostManager() {
  29. if(utils.postManager) return;
  30. utils.addStyle('\
  31. #ge_tm{display:none;border-collapse:separate;width:100%;height:100%;background:white;color:#333;padding:20px;border-radius:20px;shadow:0 1px 5px #333;border-spacing:5px;table-layout:fixed;}\
  32. #ge_tm tr{height:1px;}\
  33. #ge_tm tr.ge_td{height:auto;}\
  34. .ge_td>td{width:50%;height:100%;vertical-align:top;position:relative;}\
  35. .ge_td>td>*{width:100%;height:100%;border:1px solid;overflow:auto;background:transparent;'+(window.opera?'position:absolute;':'')+'}\
  36. ');
  37. var tm=$('<table id=ge_tm>').appendTo(mask);
  38. tm.listItems=function(t,e,x,s){
  39. var d=[];
  40. if(x) d.push('<option>'+x+'</option>');
  41. t.list.forEach(function(i){d.push('<option>'+i.name+'</option>');});
  42. e.html(d.join(''));
  43. if(s) {x=x?1:0;t.load(s-x);e.prop('selectedIndex',t.last+x);}
  44. };
  45. tm.newItem=function(e,d) {
  46. tm.list.load(tm.list.length-1);
  47. if(!tm.list.cur||tm.list.cur.data) {
  48. tm.list.load(tm.list.push(d));
  49. $('<option>').appendTo(ti).text(tm.list.cur.name);
  50. } else {
  51. tm.list.cur.type=d.type;
  52. tm.list.cur.data=d.data;
  53. }
  54. $(ti).prop('selectedIndex',tm.list.last);
  55. editItem();
  56. };
  57. var th=document.createElement('p'),tk='innerText' in th?'innerText':'textContent';
  58. function h2t(h){ // html to text
  59. th.innerHTML=h.replace(/<br>/g,'\n');
  60. return th[tk];
  61. }
  62. function t2h(t){ // text to html
  63. th[tk]=t;
  64. return th.innerHTML.replace(/ /g,'&nbsp; ').replace(/(^| ) /g,'&nbsp;$1').replace(/\r?\n/g,'<br>');
  65. }
  66. function editItem(e) {
  67. if(e) tm.list.load(ti.prop('selectedIndex'),1);
  68. var t=tm.list.cur;
  69. tc.prop('disabled',!t);
  70. if(!t) t={type:'s',data:''};
  71. tt.val(t.type);
  72. if(['j','h','H'].indexOf(t.type)>=0) tc.val(t.data);
  73. else tc.val(h2t(t.data));
  74. liveShow();
  75. }
  76. function saveItem(e) {
  77. var t=tm.list.cur;if(!t) return;
  78. switch(t.type=tt.val()) {
  79. case 'j':try{eval(t.data=tc.val());}catch(e){}break;
  80. case 's':t.data=t2h(tc.val());break;
  81. case 'H':t.data=tc.val();break;
  82. default:tv.find('img').each(function(i,e){
  83. e.setAttribute('pic_type',1);
  84. unsafeWindow.EditorUI.resizeImage(e,560);
  85. });
  86. tc.val(t.data=tv.html());
  87. }
  88. }
  89. function liveShow(e) {
  90. function show() {
  91. if(--count) return;
  92. var t=tt.val(),s;
  93. if(t=='j') try{s=eval(tc.val());}catch(e){s='<font color=red>JS代码有误!</font>';}
  94. else s=tc.val();
  95. if(t=='s') s=t2h(s);
  96. else if(t=='H') s=s.split('\n').shift();
  97. tv.html(s);
  98. }
  99. count++;
  100. setTimeout(show,500);
  101. }
  102. var count=0;
  103. tm.loadPanel=function(t,n,c) {
  104. tm.list=t;tn.text(n);tm.callback=c;
  105. tm.listItems(t,ti);editItem(1);
  106. mask.fadeIn('fast',function() {
  107. tm.css({display:'table'}).animate({top:'0px',left:'0px'},300);
  108. });
  109. };
  110. var c=$('<td colspan=2>').appendTo($('<tr>').appendTo(tm)),
  111. tn=$('<strong class=ge_rsep>').appendTo(c),
  112. ti=$('<select>').appendTo(c).change(editItem);
  113. $('<span class="ge_sbtn ge_rsep">改名</span>').appendTo(c).click(function(e) {
  114. if(!tm.list.cur) return;
  115. var t=prompt('修改名称:',tm.list.cur.name);
  116. if(t) {tm.list.cur.name=t;ti.children('option:eq('+tm.list.last+')').text(t);}
  117. });
  118. var tt=$('<select>').appendTo($('<label class=ge_rsep>类型:'+utils.getLink('advanced',{title:'帮助',html:'(?)'})+'</label>').appendTo(c)).html('<option value="s" checked>普通字串</option><option value="h">HTML代码</option><option value="H">HTML随机</option><option value="j">JS代码</option>').change(liveShow).blur(saveItem);
  119. $('<span class=ge_sbtn>添加</span>').appendTo(c).click(tm.newItem);
  120. $('<span class=ge_sbtn>删除</span>').appendTo(c).click(function() {
  121. var l=tm.list.last;tm.list.pop(l);ti.children().eq(l).remove();editItem(1);
  122. });
  123. c=$('<div style="float:right;"></div>').appendTo(c);
  124. $('<span class=ge_sbtn>关闭</span>').appendTo(c).click(function() {
  125. tm.list.save();if(tm.callback) tm.callback();
  126. tm.animate({top:innerHeight+'px'},300,function() {$(this).hide();mask.fadeOut('fast');});
  127. });
  128. $('<tr><td>编辑框</td><td align=right>预览框</td></tr>').appendTo(tm);
  129. c=$('<tr class=ge_td>').appendTo(tm);
  130. var tc=$('<textarea>').appendTo($('<td>').appendTo(c)).blur(saveItem).keyup(liveShow).mouseup(liveShow);
  131. var tv=$('<div>').appendTo($('<td>').appendTo(c));
  132. utils.postManager=tm;
  133. }
  134. // 灌水
  135. function initAddWater(editor) {
  136. initPostManager();
  137. var tails=utils.list('tails',null,function(){return {type:'s',data:'',name:'新尾巴'};},[
  138. {type:'j',name:'UA',data:'"——我喂自己袋盐<br>&gt;&gt;"+navigator.userAgent'},
  139. {type:'h',name:'求妹纸',data:'<img pic_type="1" class="BDE_Image" src="http://imgsrc.baidu.com/forum/w%3D580/sign=6ca77dcee5dde711e7d243fe97edcef4/b03533fa828ba61e111605e44134970a314e5905.jpg" width="560" height="11"><br><img pic_type="1" src="http://static.tieba.baidu.com/tb/editor/images/tsj/t_0010.gif" class="BDE_Smiley" height="40" width="40">少壮不追妹,老大去相亲'},
  140. ]).load(),water=utils.list('water',null,function(){return {type:'s',data:'',name:'新水贴'};},[
  141. {type:'s',name:'打酱油',data:'我是打酱油的~'},
  142. ]).load();
  143. function initTails(){utils.postManager.listItems(tails,ti,'随机',utils.getObj('tailindex',1));}
  144. function initWater(){utils.postManager.listItems(water,wi,'随机',utils.getObj('waterindex',0));}
  145. function getItem(t,s){
  146. var l=s.prop('selectedIndex'),L=t.length;if(!L) return;
  147. if(!l) l=Math.floor(Math.random()*L); else l--;
  148. t=t.list[l];var d=t.data;
  149. if(t.type=='j') d=eval(d);
  150. else if(t.type=='H') {d=d.split('\n');d=d[Math.floor(Math.random()*d.length)];}
  151. return d;
  152. }
  153. var op=utils.addRPopup(utils.addSButton('灌 水')).panel;
  154. $('<div class=ge_sbtn style="cursor:default">智能灌水</div>').appendTo(op);
  155. var ti=$('<select class=ge_rsep>').appendTo($('<label>尾巴:</label>').appendTo(op)).change(function(e){utils.setObj('tailindex',this.selectedIndex);});
  156. $('<br>').appendTo(op);
  157. var tail=utils.bindProp($('<input type=checkbox>').prependTo($('<label class=ge_rsep>自动附加尾巴</label>').appendTo(op)),'checked','usetail',true);
  158. $('<br>').appendTo(op);
  159. $('<span class=ge_sbtn>存为新尾巴</span>').appendTo(op).click(function(e){
  160. utils.postManager.loadPanel(tails,'尾巴管理',initTails);
  161. utils.postManager.newItem(e,{type:'h',name:'新尾巴',data:editor.$body.html()});
  162. });
  163. $('<span class=ge_sbtn>管理</span>').appendTo(op).click(function(e){utils.postManager.loadPanel(tails,'尾巴管理',initTails);});
  164. $('<hr>').appendTo(op);
  165. var wi=$('<select class=ge_rsep>').appendTo($('<label>水贴:</label>').appendTo(op)).change(function(e){utils.setObj('waterindex',this.selectedIndex);});
  166. $('<br>').appendTo(op);
  167. $('<span class=ge_sbtn>存为新水贴</span>').appendTo(op).click(function(e){
  168. utils.postManager.loadPanel(water,'水贴管理',initWater);
  169. utils.postManager.newItem(e,{type:'h',name:'新水贴',data:editor.$body.html()});
  170. });
  171. $('<span class=ge_sbtn>管理</span>').appendTo(op).click(function(e){utils.postManager.loadPanel(water,'水贴管理',initWater);});
  172. $('<br>').appendTo(op);
  173. $('<span class=ge_sbtn>载入</span>').appendTo(op).click(function(e){
  174. editor.execCommand('inserthtml',getItem(water,wi));
  175. });
  176. $('<span class=ge_sbtn>发表</span>').appendTo(op).click(function(e){
  177. editor.$body.html(getItem(water,wi));
  178. unsafeWindow.test_poster.post();
  179. });
  180. /*$('<span class=ge_sbtn>人工置顶</span>').appendTo(op).click(function(e){
  181. function post(){PostHandler.post(rich_postor._option.url,b,delay,function(){});}
  182. function delay(m){
  183. if(m) {
  184. if(m.no) d+=1000; else {d=DELAY;e.text('停止('+(++c)+')');}
  185. }
  186. if(!m||!m.no) b.content=getItem(water,wi);
  187. setTimeout(post,d);
  188. }
  189. (e=$(this)).unbind('click').text('停止').click(function(){location.reload();});
  190. var c=0,d=0;b=rich_postor._getData();delay();
  191. });*/
  192. var tailed=false;
  193. utils.hook(unsafeWindow.test_poster,'post',{before:function(){
  194. var t=getItem(tails,ti);
  195. if(!tail.prop('checked')||!t||tailed) return;
  196. editor.$body.append('&nbsp;<br><br>'+t);tailed=true; // 加个空格以免破坏@
  197. }});
  198. utils.hook(unsafeWindow.test_poster,'showPostSuccess',{after:function(){
  199. tailed=false;
  200. }});
  201. initTails();initWater();
  202. }
  203.  
  204. // 尾页直达功能
  205. function initLastPage() {
  206. utils.addStyle('.threadlist_rep_num{cursor:pointer;}');
  207. $('.threadlist_rep_num').prop('title','直达尾页').click(function(e){
  208. e=$(e.target);e.unbind('click');
  209. var s='',d=JSON.parse(e.parents('.j_thread_list').attr('data-field'));
  210. setInterval(function(){
  211. if(s.length>2) s=''; else s+='.';
  212. e.html(s);
  213. },300);
  214. d='/p/'+d.id;
  215. $.get(d,function(data){
  216. var m=data.match(/共<span class="red">(\d+)/)[1];
  217. if(m=='1') m=''; else m='?pn='+m;
  218. location.href=d+m;
  219. });
  220. });
  221. }
  222.  
  223. // 召唤术增强
  224. var calllist=utils.list('calllist','calllast',function(){return {name:'新列表',data:[]};},true).load(),
  225. purl='http://imgsrc.baidu.com/forum/pic/item/fcb4c3fdfc039245664e092a8594a4c27c1e2592.jpg';
  226. function initCard() {
  227. function fix(){
  228. var t=this._j_card,c=calllist.cur.data;
  229. setTimeout(function(){
  230. function updateCSS(e) {e.css('background-position',j<0?'0 0':'-62px 0');}
  231. var u=t.getData().un,j=c.indexOf(u),w=t.find('.interaction_wrap'),a;
  232. if(w.length) updateCSS(a=$('<a href=# style="background:url('+purl+') no-repeat scroll 0 0">').appendTo(w).click(function(e){
  233. e.preventDefault();
  234. if(j<0) {j=c.length;c.push(u);}
  235. else {for(;j<c.length-1;j++) c[j]=c[j+1];c.pop();j=-1;}
  236. calllist.save();
  237. updateCSS(a);
  238. }));
  239. },0);
  240. }
  241. function hook(b){
  242. utils.hook(b.__proto__,'buildVisitCard',{before:function(){
  243. utils.hook(this._visit_card,'setContent',{after:fix});
  244. }});
  245. }
  246. unsafeWindow._.Module.use("ihome/widget/UserVisitCard",{},hook);
  247. unsafeWindow._.Module.use("puser/widget/UserVisitCard",{},hook);
  248. }
  249. function initCall(editor) {
  250. var pl,sl,be,bs,c=calllist;
  251. utils.addStyle('\
  252. #callList{border:1px solid;height:125px;overflow:auto;background:white;margin:0 auto;width:380px;}\
  253. #callList a{padding:2px;border-radius:2px;margin:2px;display:inline-block;}\
  254. #callList a.selected{background:limegreen;color:white}\
  255. .edui-btn-toolbar .edui-btn .call_list,.lzl_panel_call{background:url("'+purl+'") no-repeat scroll transparent -124px 0;width:21px;}\
  256. .lzl_panel_call{height:20px;width:22px;}\
  257. ');
  258. function newList(e) {
  259. c.load(c.push());$('<option>').appendTo(sl).text(c.cur.name);
  260. sl.prop('selectedIndex',c.last);
  261. editList(e);
  262. }
  263. function editList(e) {
  264. if(e) c.load(sl.prop('selectedIndex')); else sl.prop('selectedIndex',c.last);
  265. pl.empty();
  266. c.cur.data.forEach(function(i){$('<a href=#>').html(i).appendTo(pl);});
  267. pl.prop('contenteditable',false);
  268. }
  269. function loadLists(p) {
  270. var op=p.panel;
  271. c.load();op.empty();
  272. $('<div class=ge_sbtn style="cursor:default">超级召唤</div>').appendTo(op);
  273. sl=$('<select>').appendTo($('<label>选择名单:</label>').appendTo(op)).change(editList);
  274. $('<span class="ge_sbtn ge_rsep">改名</span>').appendTo(op).click(function(e) {
  275. e.preventDefault();
  276. var t=prompt('列表名称:',c.cur.name);
  277. if(t) {sl.children(':eq('+c.last+')').text(t);c.cur.name=t;c.save();}
  278. });
  279. $('<span class=ge_sbtn>新建列表</span>').appendTo(op).click(newList);
  280. $('<span class="ge_sbtn ge_rsep">删除列表</span>').appendTo(op).click(function(e){
  281. e.preventDefault();
  282. var l=c.last;c.pop(l);editList();sl.children().eq(l).remove();
  283. });
  284. pl=$('<div id=callList>').appendTo(op).click(function(e){
  285. e.preventDefault();
  286. e=e.target;if(e.tagName=='A') $(e).toggleClass('selected');
  287. }).dblclick(function(e){
  288. e.stopPropagation();
  289. var s=window.getSelection();
  290. if(!s.rangeCount) return;
  291. var r=s.getRangeAt(0),c=r.startContainer,k=r.startOffset;
  292. var i=c.data.substr(0,k).search(/\s\S*$/),j=c.data.substr(k).search(/\s/);
  293. r.setStart(c,i+1);r.setEnd(c,j<0?c.data.length:k+j);
  294. s.removeAllRanges();s.addRange(r); // Compatible with Chrome
  295. });
  296. $('<label>名单管理:</label>').appendTo(op);
  297. be=$('<span>').appendTo(op);
  298. $('<span class=ge_sbtn>编辑</span>').appendTo(be).click(function(e){
  299. bs.show();be.hide();
  300. pl.prop('contenteditable',true);
  301. pl.text(c.cur.data.join(' '));
  302. });
  303. $('<span class=ge_sbtn>全选/不选</span>').appendTo(be).click(function(e){
  304. e.preventDefault();
  305. var a=pl.children('a:not(.selected)');
  306. if(a.length) a.addClass('selected'); else pl.children('a').removeClass('selected');
  307. });
  308. bs=$('<span>').appendTo(op).hide();
  309. $('<span class=ge_sbtn>去重</span>').appendTo(bs).click(function(e){
  310. var d=pl.text().replace(/^\s+|\s+$/,'').split(/\s+/),h={};
  311. d.forEach(function(i){h[i]=0;});
  312. pl.text(Object.getOwnPropertyNames(h).join(' '));
  313. });
  314. $('<span class="ge_sbtn ge_rsep">完成</span>').appendTo(bs).click(function(e){
  315. c.cur.data=pl.text().replace(/^\s+|\s+$/,'').split(/\s+/);
  316. c.save();editList(e);be.show();bs.hide();
  317. });
  318. $('<span>空格隔开,双击选中一个名字</span>').appendTo(bs);
  319. var b=$('<div style="float:right">').appendTo(op);be=be.add(b);
  320. $('<span class=ge_sbtn title="普通召唤,超过十个ID将会失败">召唤</span>').appendTo(b).click(function(e){
  321. var se=p==pM?editor:unsafeWindow.LzlEditor._s_p._se;
  322. pl.children('a.selected').each(function(i,e){se.execCommand('inserthtml','@'+e.innerHTML+'&nbsp;');});
  323. p.onclose();
  324. });
  325. /*$('<span class=ge_sbtn title="插入一个占位符,将自动替换成召唤名单">自动召唤</span>').appendTo(b).click(function(e){
  326. e=[];pl.children('a.selected').each(function(){e.push(this.innerHTML);});
  327. p.onclose();
  328. if(e.length) {
  329. p.holder.names=e;
  330. e=p.holder==E?editor:unsafeWindow.LzlEditor._s_p._se;
  331. e.execCommand('inserthtml','<img class=BDE_Smiley title="将在此自动插入召唤名单" alt="召唤列表" height=18>');
  332. }
  333. });*/
  334. c.list.forEach(function(i){$('<option>').text(i.name).appendTo(sl);});
  335. editList();
  336. }
  337. var l=/<img [^>]*?alt="召唤列表"[^>]*>/;
  338. function addNames(e,n){
  339. if(n.splice) n='@'+n.splice(0,10).join(' @')+' ';
  340. return e.replace(l,n);
  341. }
  342. // 主编辑框
  343. var o=utils.addTButton($('<div unselectable="on" class="edui-icon call_list" title="召唤">')),
  344. pM=utils.addTPopup(o,loadLists);
  345. /*utils.hook(unsafeWindow.PostHandler,'post',{before:function(f,a){
  346. function post(){f.hook_func(a[0],a[1],E.names?delay:a[2],a[3]);}
  347. function delay(m){
  348. if(m){if(m.no) d+=1000; else d=DELAY;}
  349. if((!m||!m.no)&&E.names) {
  350. a[1].content=addNames(e,E.names);
  351. if(!E.names.length) delete E.names;
  352. }
  353. setTimeout(post,d);
  354. }
  355. var e=a[1].content,d=0;f.hookStop();
  356. if(E.names&&e.search(l)<0) delete E.names;
  357. delay();
  358. }});*/
  359. // 楼中楼
  360. /*lzl_init.push(function(){
  361. utils.hook(unsafeWindow.SimplePostor.prototype,'_submitData',{before:function(f){
  362. function post(){
  363. $.tb.post(FORUM_POST_URL.postAdd,b,delay);
  364. }
  365. function delay(m){
  366. if(o.names) {
  367. if(m){if(m.no) d+=1000; else d=DELAY;}
  368. if(!m||!m.no) {
  369. b.content=addNames(a,o.names);
  370. if(!o.names.length) delete o.names;
  371. }
  372. setTimeout(post,d);
  373. } else location.reload();
  374. }
  375. if(o.names&&this._se.editArea.innerHTML.search(l)>=0) {
  376. f.hookStop();var d=0,b=this._getData(),a=b.content;delay();
  377. }
  378. }});
  379. });*/
  380. var o=$('<span title="召唤">'),p=utils.addLPopup(o,loadLists);
  381. lzl_init.push(p.getfunc('reinit'));
  382. addPButton(o,['lzl_panel_call'],p.ontoggle,{keys:['click']});
  383. }
  384.  
  385. // 字体颜色初始化
  386. /* function initFont() {
  387. utils.colors={red:'#e10602'};
  388. utils.switchColor=function(cr,cs) {
  389. document.execCommand('forecolor',false,document.queryCommandValue('forecolor').replace(/\s/g,'')==cr?'#333333':cs);
  390. }
  391. function fix() {
  392. $(this.editArea).find('font[color]').each(function(i,e){
  393. e=$(e);i=e.html();
  394. switch(e.prop('color')){
  395. case utils.colors.red:
  396. e.replaceWith('<span class="edit_font_color">'+i+'</span>');
  397. break;
  398. }
  399. }).end().find('b').each(function(i,e){
  400. e=$(e);i=e.html();e.replaceWith('<strong>'+i+'</strong>');
  401. }).end().find('span.at').each(function(i,e){ // allow at
  402. e.outerHTML=e.innerHTML;
  403. });
  404. }
  405. var p=unsafeWindow.TED.EditorCore.prototype;
  406. p.submitValidHTML=p.submitValidHTML.concat(['span','strong']); // allow font in Lzl
  407. utils.hook(unsafeWindow.rich_postor._editor,'filteSubmitHTML',{before:fix});
  408. lzl_efilters.push(fix);
  409. }*/
  410.  
  411. // 楼中楼初始化
  412. function initLzL() {
  413. // 楼中楼初始化
  414. function fixLzl() {
  415. var p=unsafeWindow.LzlEditor.cur_sec.find('.lzl_panel_btn');
  416. p.parent().css('width','50%').prev().css('width','auto');
  417. p.next().css({left:'auto',right:24});
  418. lzl_buttons.forEach(function(i){utils.addButton(p,i[0],i[1],i[2]);});
  419. lzl_init.forEach(function(i){i();});
  420. }
  421. if(lzl_styles.length) utils.addStyle('.'+lzl_styles.join(',.')+'{margin:2px 6px 0;float:right;cursor:pointer;}');
  422. if(unsafeWindow.LzlEditor.cur_sec) fixLzl();
  423. utils.hook(unsafeWindow.LzlEditor,'_buildEditor',{after:fixLzl});
  424. }
  425.  
  426. function initEditor(editor){
  427. initAddWater(editor); // 灌水+尾巴
  428. initCall(editor); // 召唤增强,召唤列表
  429. //initFont(editor); //初始化:高级字体
  430. }
  431.  
  432. // 以下为模块调用,可将不需要的模块注释,不要改变顺序
  433. if($&&PageData&&PageData.user) { // 出错反馈按钮
  434. initCard(); // 用户卡片上添加召唤按钮
  435. // 以下模块无需登录
  436. if(PageData.thread) { // 以下模块仅在帖子浏览页面加载
  437. } else {
  438. initLastPage(); // 尾页直达功能
  439. }
  440. //以下模块仅在登录时加载
  441. if(PageData.user.is_login&&unsafeWindow.PosterContext&&unsafeWindow.PosterContext.isPostAllowed()) {
  442. utils.wait(unsafeWindow,'test_editor',initEditor);
  443. utils.wait(unsafeWindow,'LzlEditor',initLzL);
  444. }
  445. }