您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
在天使动漫论坛版块页面里,为所选的帖子进行一键评分(可自行修改默认评分设置)
当前为
// ==UserScript== // @name 天使动漫一键评分 // @namespace https://greasyfork.org/users/4514 // @author 喵拉布丁 // @homepage https://github.com/miaolapd/TsdmOneKeyRating // @description 在天使动漫论坛版块页面里,为所选的帖子进行一键评分(可自行修改默认评分设置) // @include http://www.tsdm.net/forum.php?mod=forumdisplay* // @require https://code.jquery.com/jquery-3.0.0.min.js // @version 1.0 // @grant none // @run-at document-end // @license MIT // @include-jquery true // ==/UserScript== /** * 配置项 */ var Config = { // 是否在选择的时候排除已评分的帖子,true:开启;false:关闭 excludeRatingThreadEnabled: true, // 是否在选择的时候排除自己的帖子,true:开启;false:关闭 excludeMyThreadEnabled: true, // 是否在关闭评分结果对话框后自动刷新页面,true:开启;false:关闭 refreshPageAfterCloseRatingResultDialogEnabled: true, // ajax请求的时间间隔(毫秒) ajaxInterval: 200, // ajax请求的超时时间(毫秒) ajaxTimeout: 20000 }; /** * 默认评分设置 * 关键字:可通过jQuery选择的dom对象 * 值:想要设置的预设值 * @example * var DefValueConfig = { * '[name="score1"]': '+1', // 将威望设为+1 * '[name="score2"]': '+2', // 将天使币设为+1 * '[name="score3"]': '+3', // 将宣传设为+1 * '[name="score4"]': '+4', // 将天然设为+1 * '[name="score5"]': '+5', // 将腹黑设为+1 * '[name="score6"]': '-1', // 将精灵设为-1 * '#reason': '很给力', // 将评分理由设为“很给力” * '#highlight_thread': true, // 高亮帖子 * '[name="highlight_color"]': '4', // 将帖子高亮颜色设为深绿色 * '#highlight_op_1': true, // 将帖子标题设为粗体 * '#highlight_op_2': true, // 将帖子标题设为斜体 * '#highlight_op_3': true, // 为帖子标题添加下划线 * '[name="sendreasonpm"]': true, // 勾选通知作者的复选框 * }; */ var DefValueConfig = { '[name="score1"]': '+10', '[name="score2"]': '+20', '#highlight_thread': true, '[name="highlight_color"]': '4', '#highlight_op_1': true, }; jQuery.noConflict(); (function ($) { // 用户的formHash var formHash = ''; // 自己的用户名 var userName = ''; // window对象 var w = typeof unsafeWindow !== 'undefined' ? unsafeWindow : window; // 高亮颜色可选项 var highlightColorOptions = { '0': '#000', '1': '#EE1B2E', '2': '#EE5023', '3': '#996600', '4': '#3C9D40', '5': '#2897C5', '6': '#2B65B7', '7': '#8F2A90', '8': '#EC1282' }; /** * 添加CSS */ var appendCss = function () { $('head').append( '<style>' + '.pd_rating_btns { margin: 10px 0; padding: 0 5px; }' + '.pd_rating_btns input { vertical-align: middle; }' + '.pd_mask { position: fixed; width: 100%; height: 100%; left: 0; top: 0; z-index: 400; }' + '.pd_msg_text strong { margin-left: 15px; float: none; color: #369; }' + '.pd_msg_text strong em { color: #FF6600; float: none; }' + '.flb .pd_select_thread_num { margin: 0 3px; color: #F26C4F; float: none; }' + '.flb .pd_fail_num { color: #3C9D40; }' + '.pd_dialog_main { max-height: 620px; overflow-y: auto; }' + '#floatlayout_topicadmin.pd_dialog_main { width: 350px; }' + '#pd_rating_result { padding: 10px; width: 770px; }' + '#pd_rating_result h4 { color: #369; font-size: 14px; }' + '#pd_rating_result ol { list-style-position: inside; list-style-type: decimal-leading-zero; }' + '#pd_rating_result li { line-height: 2em; }' + '#pd_rating_result a, #pd_rating_result em {' + ' display: inline-block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; vertical-align: top;' + '}' + '#pd_rating_result a { color: #2B65B7; width: 400px; }' + '#pd_rating_result em { margin-left: 5px; max-width: 300px; }' + '#pd_rating_result em b { color: #F26C4F; }' + '</style>' ); }; /** * 显示提示消息 * @param {string} msg 提示消息 * @param {boolean} [canClose=false] 是否可以关闭 * @returns {jQuery} 消息框的jQuery对象 */ var showMsg = function (msg, canClose) { if (!$('.pd_mask').length) $('<div class="pd_mask"></div>').appendTo('body'); var $msg = $( '<div id="fwin_dialog" class="fwinmask" style="position: fixed; z-index: 401;">' + ' <table class="fwin" cellpadding="0" cellspacing="0">' + ' <tbody>' + ' <tr>' + ' <td class="t_l"></td>' + ' <td class="t_c"></td>' + ' <td class="t_r"></td>' + ' </tr>' + ' <tr>' + ' <td class="m_l"> </td>' + ' <td class="m_c">' + ' <h3 class="flb">' + ' <em class="pd_msg_text"><img style="width: 16px; height: 16px;" src="static/image/common/loading.gif"> {0}</em>'.replace('{0}', msg) + ' <span style="display: none"><a href="javascript:;" class="flbc pd_msg_close" title="关闭">关闭</a></span>' + ' </h3>' + ' </td>' + ' <td class="m_r"></td>' + ' </tr>' + ' <tr>' + ' <td class="b_l"></td>' + ' <td class="b_c"></td>' + ' <td class="b_r"></td>' + ' </tr>' + ' </tbody>' + ' </table>' + '</div>' ).appendTo('#append_parent'); if (canClose) { $msg.find('.pd_msg_close').click(function () { $(this).closest('#fwin_dialog').data('stop', true); }).parent().css('display', 'inline'); } $msg.css('top', $(window).height() / 2 - $msg.height() / 2) .css('left', $(window).width() / 2 - $msg.width() / 2); return $msg; }; /** * 隐藏提示消息 * @param {jQuery} $msg 消息框的jQuery对象 */ var hideMsg = function ($msg) { $msg.remove(); $('.pd_mask').remove(); }; /** * 输出经过格式化后的控制台消息 * @param {string} type 消息类别 * @param {string} msg 回应消息 */ var showFormatLog = function (type, msg) { var result = ''; if (/succeedhandle_/i.test(msg)) { var matches = /succeedhandle_\w+\('[^']*',\s*'([^']*)'/i.exec(msg); if (matches) result = $.trim(matches[1]); } else if (/errorhandle_/i.test(msg)) { var matches = /errorhandle_\w+\('([^']*)'/i.exec(msg); if (matches) result = $.trim(matches[1]); } if (!result) result = '未能获得预期的回应'; console.log('【{0}】回应:{1}'.replace('{0}', type).replace('{1}', result)); }; /** * 获取经过本地编码后的字符串 * @param {string} str 待编码的字符串 * @returns {string} 经过本地编码后的字符串 */ var getLocaleEncodeString = function (str) { var img = $('<img />').appendTo('body').get(0); img.src = 'nothing?sp=' + str; var encodeStr = img.src.split('nothing?sp=').pop(); $(img).remove(); return encodeStr; }; /** * 排除置顶的帖子 */ var excludeTopThread = function () { $('input[name="moderate[]"]:checked').each(function () { var $this = $(this); if ($this.parent('td').prev('td').find('a[title*="置顶"]').length > 0) { $this.prop('checked', false); } }); }; /** * 排除已评分的帖子 */ var excludeRatingThread = function () { $('input[name="moderate[]"]:checked').each(function () { var $this = $(this); if ($this.parent('td').next().find('img[title="帖子被加分"]').length > 0) { $this.prop('checked', false); } }); }; /** * 排除自己的帖子 */ var excludeMyThread = function () { $('input[name="moderate[]"]:checked').each(function () { var $this = $(this); if ($this.parent('td').next().next('td').find('cite > a').text() === userName) { $this.prop('checked', false); } }); }; /** * 添加一键评分相关按钮 */ var addRatingBtns = function () { $( '<div class="pd_rating_btns">' + ' <button class="pn" data-action="selectAll"><span>全选</span></button>' + ' <button class="pn" data-action="selectInverse"><span>反选</span></button>' + ' <button class="pn" data-action="oneKeyRating" style="color: #F00"><span>一键评分</span></button>' + ' <label><input id="pd_exclude_rating" type="checkbox"{0} /> 排除已评分的帖子</label>' .replace('{0}', Config.excludeRatingThreadEnabled ? ' checked="checked"' : '') + ' <label><input id="pd_exclude_my_thread" type="checkbox"{0} /> 排除自己的帖子</label>' .replace('{0}', Config.excludeMyThreadEnabled ? ' checked="checked"' : '') + '</div>' ).insertBefore('#diyfastposttop').on('click', 'button', function (e) { e.preventDefault(); var action = $(this).data('action'); if (action === 'selectAll') { $('input[name="moderate[]"]').prop('checked', true); excludeTopThread(); if ($('#pd_exclude_rating').prop('checked')) excludeRatingThread(); if ($('#pd_exclude_my_thread').prop('checked')) excludeMyThread(); } else if (action === 'selectInverse') { $('input[name="moderate[]"]').each(function () { $(this).prop('checked', !$(this).prop('checked')); }); excludeTopThread(); if ($('#pd_exclude_rating').prop('checked')) excludeRatingThread(); if ($('#pd_exclude_my_thread').prop('checked')) excludeMyThread(); } else if (action === 'oneKeyRating') { if (!$('input[name="moderate[]"]:checked').length) { alert('请选择要评分的帖子'); return; } showRatingDialog(); } }); $(document).on('click', 'input[name="moderate[]"]', function () { if ($('.pd_select_thread_num').length > 0) { $('.pd_select_thread_num').text($('input[name="moderate[]"]:checked').length); } }); }; /** * 显示一键评分对话框 */ var showRatingDialog = function () { if ($('#fwin_rate').length > 0) return; $('#mdly').remove(); w.pd_modeRateData = null; var $dialog = $( '<div style="position: fixed; z-index: 201;" class="fwinmask" id="fwin_rate">' + ' <table class="fwin" cellpadding="0" cellspacing="0">' + ' <tbody>' + ' <tr>' + ' <td class="t_l"></td>' + ' <td class="t_c" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)" ondblclick="hideWindow(\'rate\')"></td>' + ' <td class="t_r"></td>' + ' </tr>' + ' <tr>' + ' <td class="m_l" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)" ondblclick="hideWindow(\'rate\')"> </td>' + ' <td fwin="rate" style="" class="m_c" id="fwin_content_rate">' + ' <div fwin="rate" class="tm_c pd_dialog_main" id="floatlayout_topicadmin">' + ' <h3 id="fctrl_rate" class="flb">' + ' <em fwin="rate" id="return_rate">一键评分 (共选择了<span class="pd_select_thread_num">0</span>个帖子)</em><span><a href="javascript:;" class="flbc" onclick="hideWindow(\'rate\')" title="关闭">关闭</a></span>' + ' </h3>' + /* 评分form */ ' <form fwin="rate" id="rateform" method="post" autocomplete="off">' + ' <input name="formhash" value="" type="hidden" />' + ' <input name="referer" value="" type="hidden" />' + ' <input name="handlekey" value="rate" type="hidden" />' + ' <div class="c">' + ' <table class="dt mbm" cellpadding="0" cellspacing="0">' + ' <tbody>' + ' <tr>' + ' <th>单位</th>' + ' <th width="65">数值</th>' + ' </tr>' + ' <tr>' + ' <td> 威望</td>' + ' <td>' + ' <input fwin="rate" name="score1" id="score1" class="px z" value="0" style="width: 25px;" type="text" />' + ' <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score1\', \'scoreoption1\')">^</a>' + ' <ul fwin="rate" id="scoreoption1" style="display:none">' + ' <li>+100</li>' + ' <li>+89</li>' + ' <li>+78</li>' + ' <li>+67</li>' + ' <li>+56</li>' + ' <li>+45</li>' + ' <li>+34</li>' + ' <li>+23</li>' + ' <li>+12</li>' + ' <li>+1</li>' + ' <li>-10</li>' + ' </ul>' + ' </td>' + ' </tr>' + ' <tr>' + ' <td> 天使币</td>' + ' <td>' + ' <input fwin="rate" name="score2" id="score2" class="px z" value="0" style="width: 25px;" type="text" />' + ' <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score2\', \'scoreoption2\')">^</a>' + ' <ul fwin="rate" id="scoreoption2" style="display:none">' + ' <li>+200</li>' + ' <li>+179</li>' + ' <li>+158</li>' + ' <li>+137</li>' + ' <li>+116</li>' + ' <li>+95</li>' + ' <li>+74</li>' + ' <li>+53</li>' + ' <li>+32</li>' + ' <li>+11</li>' + ' <li>-10</li>' + ' </ul>' + ' </td>' + ' </tr>' + ' <tr>' + ' <td> 宣传</td>' + ' <td>' + ' <input fwin="rate" name="score3" id="score3" class="px z" value="0" style="width: 25px;" type="text" />' + ' <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score3\', \'scoreoption3\')">^</a>' + ' <ul fwin="rate" id="scoreoption3" style="display:none">' + ' <li>+50</li>' + ' <li>+45</li>' + ' <li>+40</li>' + ' <li>+35</li>' + ' <li>+30</li>' + ' <li>+25</li>' + ' <li>+20</li>' + ' <li>+15</li>' + ' <li>+10</li>' + ' <li>+5</li>' + ' </ul>' + ' </td>' + ' </tr>' + ' <tr>' + ' <td> 天然</td>' + ' <td>' + ' <input fwin="rate" name="score4" id="score4" class="px z" value="0" style="width: 25px;" type="text" />' + ' <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score4\', \'scoreoption4\')">^</a>' + ' <ul fwin="rate" id="scoreoption4" style="display:none">' + ' <li>+20</li>' + ' <li>+16</li>' + ' <li>+12</li>' + ' <li>+8</li>' + ' <li>+4</li>' + ' <li>-4</li>' + ' <li>-8</li>' + ' <li>-12</li>' + ' </ul>' + ' </td>' + ' </tr>' + ' <tr>' + ' <td> 腹黑</td>' + ' <td>' + ' <input fwin="rate" name="score5" id="score5" class="px z" value="0" style="width: 25px;" type="text" />' + ' <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score5\', \'scoreoption5\')">^</a>' + ' <ul fwin="rate" id="scoreoption5" style="display:none">' + ' <li>+20</li>' + ' <li>+16</li>' + ' <li>+12</li>' + ' <li>+8</li>' + ' <li>+4</li>' + ' <li>-4</li>' + ' <li>-8</li>' + ' <li>-12</li>' + ' </ul>' + ' </td>' + ' </tr>' + ' <tr>' + ' <td> 精灵</td>' + ' <td>' + ' <input fwin="rate" name="score6" id="score6" class="px z" value="0" style="width: 25px;" type="text" />' + ' <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'score6\', \'scoreoption6\')">^</a>' + ' <ul fwin="rate" id="scoreoption6" style="display:none">' + ' <li>+2</li>' + ' <li>+1</li>' + ' </ul>' + ' </td>' + ' </tr>' + ' </tbody>' + ' </table>' + ' <div class="tpclg">' + ' <h4>可选评分理由:</h4>' + ' <table class="reason_slct" cellpadding="0" cellspacing="0">' + ' <tbody>' + ' <tr>' + ' <td>' + ' <ul fwin="rate" id="reasonselect" class="reasonselect pt">' + ' <li class="">很给力!</li>' + ' <li class="">神马都是浮云</li>' + ' <li>赞一个!</li>' + ' <li>淡定</li>' + ' <li>恶意灌水</li>' + ' <li>违规帖子</li>' + ' </ul>' + ' </td>' + ' </tr>' + ' <tr>' + ' <td><input fwin="rate" id="reason" class="px" type="text" /></td>' + ' </tr>' + ' </tbody>' + ' </table>' + ' </div>' + ' </div>' + ' </form>' + /* 高亮form */ ' <form fwin="mods" id="moderateform" method="post" autocomplete="off">' + ' <input name="formhash" value="" type="hidden" />' + ' <input name="fid" value="" type="hidden" />' + ' <input name="redirect" value="" type="hidden" />' + ' <input name="handlekey" value="mods" type="hidden" />' + ' <div class="c">' + ' <ul class="tpcl">' + ' <li class="copt" fwin="mods" id="itemcp_highlight">' + ' <table cellpadding="5" cellspacing="0">' + ' <tbody>' + ' <tr>' + ' <td width="15"><input id="highlight_thread" name="operations[]" class="pc" value="highlight" type="checkbox" /></td>' + ' <td class="hasd"><label class="labeltxt" style="color: #444">高亮</label>' + ' <div class="dopt">' + ' <span class="hasd">' + ' <input fwin="mods" id="highlight_color" name="highlight_color" value="" type="hidden" />' + ' <input fwin="mods" id="highlight_style_1" name="highlight_style[1]" value="" type="hidden" />' + ' <input fwin="mods" id="highlight_style_2" name="highlight_style[2]" value="" type="hidden" />' + ' <input fwin="mods" id="highlight_style_3" name="highlight_style[3]" value="" type="hidden" />' + ' <a fwin="mods" href="javascript:;" id="highlight_color_ctrl" onclick="showHighLightColor(\'highlight_color\')" class="pn colorwd"></a>' + ' </span>' + ' <a fwin="mods" href="javascript:;" id="highlight_op_1" data-id="1" class="dopt_b" style="text-indent:0;text-decoration:none;font-weight:700;" title="文字加粗">B</a>' + ' <a fwin="mods" href="javascript:;" id="highlight_op_2" data-id="2" class="dopt_i" style="text-indent:0;text-decoration:none;font-style:italic;" title="文字斜体">I</a>' + ' <a fwin="mods" href="javascript:;" id="highlight_op_3" data-id="3" class="dopt_l" style="text-indent:0;text-decoration:underline;" title="文字加下划线">U</a>' + ' </div>' + ' </td>' + ' </tr>' + ' <tr class="dopt">' + ' <td> </td>' + ' <td>' + ' <p class="hasd">' + ' <label for="expirationhighlight" class="labeltxt" style="color: #444">有效期</label>' + ' <input fwin="mods" name="expirationhighlight" id="expirationhighlight" class="px" autocomplete="off" value="" tabindex="1" type="text" style="width:120px" />' + ' <a href="javascript:;" class="dpbtn" onclick="showselect(this, \'expirationhighlight\')">^</a>' + ' </p>' + ' </td>' + ' </tr>' + ' </tbody>' + ' </table>' + ' </li>' + ' </ul>' + ' </div>' + ' </form>' + /* 提交按钮 */ ' <p class="o pns">' + ' <label for="sendreasonpm"><input fwin="rate" name="sendreasonpm" id="sendreasonpm" class="pc" type="checkbox" />通知作者</label>' + ' <button id="ratesubmit" name="ratesubmit" type="submit" value="true" class="pn pnc"><span>确定</span></button>' + ' </p>' + ' </div>' + ' </td>' + ' <td class="m_r" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)" ondblclick="hideWindow(\'rate\')"></td></tr>' + ' <tr>' + ' <td class="b_l"></td>' + ' <td class="b_c" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)" ondblclick="hideWindow(\'rate\')"></td>' + ' <td class="b_r"></td>' + ' </tr>' + ' </tbody>' + ' </table>' + '</div>' ).appendTo('#append_parent'); $dialog.end().find('.pd_select_thread_num').text($('input[name="moderate[]"]:checked').length) .end().find('input[name="formhash"]').val(formHash) .end().find('input[name="fid"]').val($('input[name="srhfid"]').val()) .end().find('input[name="referer"]').val(location.href) .end().find('input[name="redirect"]').val(location.href); $dialog.find('#reasonselect').on('mouseover', 'li', function () { $(this).addClass('xi2 cur1'); }).on('mouseout', 'li', function () { $(this).removeClass('xi2 cur1'); }).on('click', 'li', function () { $('#reason').val($(this).text()); }).end().find('#reason').keyup(function (e) { if (e.keyCode === 13) $dialog.find('#ratesubmit').click(); }); $dialog.on('click', '[id^="highlight_op_"]', function () { var $this = $(this); var id = $this.data('id'); if (parseInt($('#highlight_style_' + id).val())) { $('#highlight_style_' + id).val(0); $this.removeClass('cnt'); } else { $('#highlight_style_' + id).val(1); $this.addClass('cnt'); } }); w.showHighLightColor = function (hlid) { var showid = hlid + '_ctrl'; if (!document.getElementById(showid + '_menu')) { var str = ''; var coloroptions = highlightColorOptions; var menu = document.createElement('div'); menu.id = showid + '_menu'; menu.className = 'cmen'; menu.style.display = 'none'; for (var i in coloroptions) { str += '<a href="javascript:;" onclick="document.getElementById(\'' + hlid + '\').value=' + i + ';document.getElementById(\'' + showid + '\').style.backgroundColor=\'' + coloroptions[i] + '\';hideMenu(\'' + menu.id + '\')" style="background:' + coloroptions[i] + ';color:' + coloroptions[i] + ';">' + coloroptions[i] + '</a>'; } menu.innerHTML = str; document.getElementById('append_parent').appendChild(menu); } showMenu({'ctrlid': hlid + '_ctrl', 'evt': 'click', 'showid': showid}); }; w.today = new Date(); $dialog.find('form').submit(function (e) { e.preventDefault(); $dialog.find('#ratesubmit').click(); }).end().find('#ratesubmit').click(function (e) { e.preventDefault(); if (!$('input[name="moderate[]"]:checked').length) { alert('请选择要评分的帖子'); return; } batchRating($dialog); }); $.each(DefValueConfig, function (key, value) { if (key.indexOf('highlight_color') > -1) { $dialog.find(key).val(value) .end().find('#highlight_color_ctrl').css('background-color', highlightColorOptions[value]); } else if (typeof value === 'boolean') { $dialog.find(key).click(); } else { $dialog.find(key).val(value); } }); $dialog.css('top', $(window).height() / 2 - $dialog.height() / 2) .css('left', $(window).width() / 2 - $dialog.width() / 2); }; /** * 批量评分 * @param {jQuery} $dialog 评分对话框的jQuery对象 */ var batchRating = function ($dialog) { var tidList = [], pidList = {}; $('input[name="moderate[]"]:checked').each(function () { tidList.push($(this).val()); }); var rateData = $dialog.find('#rateform').serialize(); var modeRateData = $dialog.find('#moderateform').serialize(); var reason = $.trim($dialog.find('#reason').val()); if (reason) { rateData += '&reason=' + getLocaleEncodeString(reason); } if ($dialog.find('#sendreasonpm').prop('checked')) { rateData += '&sendreasonpm=on'; } modeRateData += '&moderate%5B%5D={0}'.replace('{0}', tidList[0]); if ($dialog.find('input[name="operations[]"][value="highlight"]').prop('checked')) { w.pd_modeRateData = modeRateData; } $dialog.remove(); var $msg = showMsg('正在获取各帖子的pid,请稍后...<strong>剩余数量:<em id="pd_count">{0}</em></strong>'.replace('{0}', tidList.length), true); var count = 0; var itvFuncList = []; $.each(tidList, function (index, tid) { var itvFunc = window.setTimeout(function () { $.ajax({ type: 'GET', url: 'forum.php?mod=viewthread&tid=' + tid, timeout: Config.ajaxTimeout, success: function (html) { var matches = /<table id="pid(\d+)"/.exec(html); if (matches) pidList[tid] = parseInt(matches[1]); }, error: function () { //pidList[tid] = 0; }, complete: function () { count++; var $count = $('#pd_count'); $count.text(tidList.length - count); var isStop = $count.closest('#fwin_dialog').data('stop'); if (isStop) { hideMsg($msg); $.each(itvFuncList, function (i, itvFunc) { if (itvFunc) window.clearTimeout(itvFunc); }); } else if (count >= tidList.length) { hideMsg($msg); rating(tidList, pidList, rateData); } } }); }, index * Config.ajaxInterval); itvFuncList.push(itvFunc); }); }; /** * 评分 * @param {number[]} tidList 帖子ID列表 * @param {{}} pidList 帖子顶楼的pid列表 * @param {string} rateData 提交评分的数据 */ var rating = function (tidList, pidList, rateData) { var $msg = showMsg('正在进行评分,请稍后...<strong>剩余数量:<em id="pd_count">{0}</em></strong>'.replace('{0}', tidList.length)); var successNum = 0, failNum = 0; var failList = []; $.each(tidList, function (index, tid) { window.setTimeout(function () { var pid = pidList[tid] ? pidList[tid] : 0; $.ajax({ type: 'POST', url: 'forum.php?mod=misc&action=rate&ratesubmit=yes&infloat=yes&inajax=1', data: rateData + '&tid={0}&pid={1}'.replace('{0}', tid).replace('{1}', pid), timeout: Config.ajaxTimeout, success: function (xml) { var msg = xml.documentElement ? xml.documentElement.textContent : ''; showFormatLog('评分', msg); if (/succeedhandle_rate\(/i.test(msg)) { successNum++; } else if (/errorhandle_rate\(/i.test(msg)) { failNum++; var matches = /errorhandle_rate\('([^']*)'/i.exec(msg); failList.push({tid: tid, pid: pid, failMsg: matches ? matches[1] : '未知的回应'}); } else { failNum++; failList.push({tid: tid, pid: pid, failMsg: '未知的回应'}); } }, error: function () { failNum++; failList.push({tid: tid, pid: pid, failMsg: '连接超时'}); }, complete: function () { $('#pd_count').text(tidList.length - successNum - failNum); if (successNum + failNum >= tidList.length) { hideMsg($msg); showRatingResultDialog(successNum, failNum, failList); if (w.pd_modeRateData) highlightThread(tidList, w.pd_modeRateData); } } }); }, index * Config.ajaxInterval); }); }; /** * 显示一键评分结果的对话框 * @param {number} successNum 评分成功数量 * @param {number} failNum 评分失败数量 * @param {[]} failList 评分失败列表 */ var showRatingResultDialog = function (successNum, failNum, failList) { var $dialog = $( '<div style="position: fixed; z-index: 201;" class="fwinmask" id="fwin_rate">' + ' <table class="fwin" cellpadding="0" cellspacing="0">' + ' <tbody>' + ' <tr>' + ' <td class="t_l"></td>' + ' <td class="t_c" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)"></td>' + ' <td class="t_r"></td>' + ' </tr>' + ' <tr>' + ' <td class="m_l" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)"> </td>' + ' <td fwin="rate" style="" class="m_c" id="fwin_content_rate">' + ' <div fwin="rate" class="tm_c" id="floatlayout_topicadmin">' + ' <h3 id="fctrl_rate" class="flb">' + (' <em fwin="rate" id="return_rate" style="{0}">评分结果 (共有<span class="pd_select_thread_num">{1}</span>个帖子评分成功,' + '共有<span class="pd_select_thread_num pd_fail_num">{2}</span>个帖子评分失败<i style="font-style: normal;" id="pd_highlight_thread_result"></i>)</em>') .replace('{0}', w.pd_modeRateData ? 'min-width:540px' : '') .replace('{1}', successNum) .replace('{2}', failNum) + ' <span><a href="javascript:;" class="flbc" title="关闭">关闭</a></span>' + ' </h3>' + ' <div class="pd_dialog_main" id="pd_rating_result" style="display: none;"></div>' + ' </div>' + ' </td>' + ' <td class="m_r" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)"></td></tr>' + ' <tr>' + ' <td class="b_l"></td>' + ' <td class="b_c" style="cursor:move" onmousedown="dragMenu($(\'fwin_rate\'), event, 1)"></td>' + ' <td class="b_r"></td>' + ' </tr>' + ' </tbody>' + ' </table>' + '</div>' ).appendTo('#append_parent'); var result = ''; $.each(failList, function (index, obj) { var $node = $('input[name="moderate[]"][value="{0}"]'.replace('{0}', obj.tid)); if (!$node.length) return; var $link = $node.parent('td').next().find('span > a.xst'); if (!$link.length) return; result += '<li><a target="_blank" href="{0}" title="《{1}》by:{2}">{1}</a> <em title="失败原因:{3}"><b>失败原因:</b>{3}</em></li>' .replace('{0}', $link.attr('href')) .replace(/\{1\}/g, $link.text()) .replace('{2}', $node.parent('td').next().next('td').find('cite > a').text()) .replace(/\{3\}/g, obj.failMsg); }); if (result) { $dialog.find('#pd_rating_result').html('<h4>评分失败项目:</h4><ol>' + result + '</ol>').css('display', 'block'); } $dialog.find('.flbc').click(function () { $dialog.remove(); if (Config.refreshPageAfterCloseRatingResultDialogEnabled) location.reload(); }); $dialog.css('top', $(window).height() / 2 - $dialog.height() / 2) .css('left', $(window).width() / 2 - $dialog.width() / 2); }; /** * 高亮帖子 * @param {number[]} tidList 帖子ID列表 * @param {string} modeRateData 提交高亮帖子的数据 */ var highlightThread = function (tidList, modeRateData) { var $msg = showMsg('正在高亮帖子,请稍后...'); $.each(tidList, function (i, tid) { modeRateData += '&moderate%5B%5D=' + tid; }); var isSuccess = false; var failReason = ''; $.ajax({ type: 'POST', url: 'forum.php?mod=topicadmin&action=moderate&optgroup=1&modsubmit=yes&infloat=yes&inajax=1', data: modeRateData, timeout: Config.ajaxTimeout, success: function (xml) { var msg = xml.documentElement ? xml.documentElement.textContent : ''; showFormatLog('高亮帖子', msg); if (/succeedhandle_mods\(/i.test(msg)) { isSuccess = true; } else if (/errorhandle_mods\(/i.test(msg)) { var matches = /errorhandle_mods\('([^']*)'/i.exec(msg); failReason = matches ? matches[1] : '未知的回应'; } else { failReason = '未知的回应'; } }, error: function () { failReason = '连接超时'; }, complete: function () { hideMsg($msg); if (isSuccess) { $('#pd_highlight_thread_result').html(',共有<span class="pd_select_thread_num">{0}</span>个帖子高亮成功'.replace('{0}', tidList.length)); } else { $('#pd_highlight_thread_result') .html(',共有<span class="pd_select_thread_num pd_fail_num">{0}</span>个帖子高亮失败'.replace('{0}', tidList.length)) .attr('title', '原因:' + failReason) .css('cursor', 'help'); } } }); w.pd_modeRateData = null; }; /** * 初始化 */ var init = function () { if (!$('input[name="moderate[]"]').length) return; var hashMatches = /formhash=(\w+)/i.exec($('#toptb a[href*="formhash="]').attr('href')); if (hashMatches) formHash = hashMatches[1]; else return; userName = $('#toptb a[href*="home.php?mod=space&uid="]').text(); if (!userName) return; appendCss(); addRatingBtns(); console.log('【天使动漫一键评分】加载完毕'); }; init(); }(jQuery));