开元1973登录入口限时优惠
加载中...
';
} else if (state.error) {
stateArea = '';
} else if (!state.tableData.length) {
stateArea = '暂无数据
';
} else if (!rows.length) {
stateArea = '无匹配的专业名称
';
} else {
var latestScoreYearLabel = getPlanScoreYearLabel();
var columns = state.historyScore
? '专业组' + ' | ' +
'最低分' + sortArrow('lowestScore') + ' | ' +
'平均分' + sortArrow('averageScore') + ' | ' +
'最低位次' + sortArrow('lowestRanking') + ' | '
: '计划人数' + sortArrow('admitCount') + ' | ' +
'专业组 | ' +
'科类 | ' +
'选科 | ' +
'' + latestScoreYearLabel + '最低分' + sortArrow('lowestScore') + ' | ' +
'' + latestScoreYearLabel + '平均分' + sortArrow('averageScore') + ' | ' +
'' + latestScoreYearLabel + '最低位次' + sortArrow('lowestRanking') + ' | ';
var middleCols = state.historyScore ? '省份 | 年份 | 科类 | 类型 | 选科 | ' : '';
var bodyRows = rows.map(function (row) {
var nameCell = renderMajorNameCell(row);
var scoreCell = state.historyScore
? '' + displayNum(row.disciplineGroup) + ' | ' + displayLowestScore(row.lowestScore) + ' | ' + displayScore(row.averageScore) + ' | ' + displayNum(row.lowestRanking) + ' | '
: '' + displayNum(getPlanCount(row)) + ' | ' +
'' + displayNum(row.disciplineGroup) + ' | ' +
'' + displayNum(row.recruitSubjectName || row.recruitSubject) + ' | ' +
'' + displayNum(row.subjectSelectionName || row.subjectSelection) + ' | ' +
'' + displayLowestScore(getScoreValue(row, "lowestScore")) + ' | ' + displayScore(getScoreValue(row, "averageScore")) + ' | ' + displayNum(getScoreValue(row, "lowestRanking")) + ' | ';
var middleCell = state.historyScore
? '' + (row.recruitProvinceName || getCurrentProvinceLabel()) + ' | ' +
'' + displayNum(row.recruitYear) + ' | ' +
'' + displayNum(row.recruitSubjectName) + ' | ' +
'' + displayNum(row.recruitTypeName) + ' | ' +
'' + displayNum(row.subjectSelectionName) + ' | '
: '';
return '' +
'| ' + nameCell + ' | ' +
middleCell +
scoreCell +
'
';
}).join('');
stateArea = '';
}
app.innerHTML =
'' +
'' +
'
省份:' + renderChips(state.options.province, state.filters.recruitProvince, 'recruitProvince', false) + '
' +
'
年份:' + renderChips(state.options.year, state.filters.recruitYear, 'recruitYear', false) + '
' +
'
科类:' + renderChips(state.options.subject, state.filters.recruitSubject, 'recruitSubject', true) + '
' +
'
类型:' + renderChips(state.options.type, state.filters.recruitType, 'recruitType', true) + '
' +
'
选科:' + renderChips(state.options.selection, state.filters.subjectSelection, 'subjectSelection', true) + '
' +
'
专业组:' + renderChips(state.options.group, state.filters.disciplineGroup, 'disciplineGroup', true) + '
' +
'
' +
'' +
'左右滑动表格,查看更多数据
' +
'' + stateArea + '
';
bindEvents();
if (keepSearchFocus) {
var restoredInput = document.getElementById("search-input");
if (restoredInput) {
restoredInput.focus();
var pos = searchCursor == null ? restoredInput.value.length : Math.min(searchCursor, restoredInput.value.length);
try {
restoredInput.setSelectionRange(pos, pos);
} catch (e) {}
}
}
playMobileHint();
}
function clearHintTimers() {
if (!state.hintTimers) return;
state.hintTimers.forEach(function (id) { clearTimeout(id); });
state.hintTimers = [];
}
function playMobileHint() {
if (state.hasPlayedHint || window.innerWidth > 768) return;
var tableScroll = document.getElementById("table-scroll");
if (!tableScroll) return;
var maxScrollLeft = tableScroll.scrollWidth - tableScroll.clientWidth;
if (maxScrollLeft <= 24) return;
state.hasPlayedHint = true;
try { localStorage.setItem(MOBILE_HINT_CACHE_KEY, "1"); } catch (e) {}
clearHintTimers();
tableScroll.scrollLeft = 0;
state.hintTimers = [];
state.hintTimers.push(setTimeout(function () {
tableScroll.scrollTo({ left: maxScrollLeft, behavior: "smooth" });
}, 500));
state.hintTimers.push(setTimeout(function () {
tableScroll.scrollTo({ left: 0, behavior: "smooth" });
}, 1700));
}
async function loadPageData(isInit) {
state.loading = true;
state.error = "";
renderTable();
try {
if (isInit) await loadFilterOptions();
await loadTableData();
} catch (e) {
state.error = "加载失败,请稍后重试";
console.error(e);
} finally {
state.loading = false;
renderTable();
}
}
async function onFilterChange(key, value) {
if (String(state.filters[key]) === String(value)) return;
state.filters[key] = value;
if (key === "recruitProvince") {
syncUrlState();
state.filters.recruitYear = "";
state.filters.recruitSubject = "";
state.filters.recruitType = "";
state.filters.subjectSelection = "";
state.filters.disciplineGroup = "";
await loadPageData(true);
return;
}
if (key === "recruitYear") {
state.filters.recruitSubject = "";
state.filters.recruitType = "";
state.filters.subjectSelection = "";
state.filters.disciplineGroup = "";
await Promise.all([
loadSubordinateOptions("recruitYear"),
loadTableData()
]);
renderTable();
return;
}
if (key === "recruitSubject") {
state.filters.recruitType = "";
state.filters.subjectSelection = "";
state.filters.disciplineGroup = "";
await Promise.all([
loadSubordinateOptions("recruitSubject"),
loadTableData()
]);
renderTable();
return;
}
if (key === "recruitType") {
state.filters.subjectSelection = "";
state.filters.disciplineGroup = "";
await Promise.all([
loadSubordinateOptions("recruitType"),
loadTableData()
]);
renderTable();
return;
}
if (key === "subjectSelection") {
state.filters.disciplineGroup = "";
await Promise.all([
loadSubordinateOptions("subjectSelection"),
loadTableData()
]);
renderTable();
return;
}
await loadTableData();
renderTable();
}
function toggleSort(key) {
if (state.sortKey !== key) {
state.sortKey = key;
state.sortDir = "desc";
} else if (state.sortDir === "desc") {
state.sortDir = "asc";
} else {
state.sortKey = null;
state.sortDir = null;
}
renderTable();
}
function bindEvents() {
var app = document.getElementById("recruit-app");
if (!app) return;
app.querySelectorAll(".chip").forEach(function (btn) {
btn.addEventListener("click", function () {
onFilterChange(btn.getAttribute("data-field"), btn.getAttribute("data-value"));
});
});
var searchInput = document.getElementById("search-input");
var clearBtn = document.getElementById("search-clear-btn");
if (searchInput) {
searchInput.addEventListener("compositionstart", function () {
state.composing = true;
});
searchInput.addEventListener("compositionend", function () {
state.composing = false;
state.searchKeyword = searchInput.value || "";
renderTable({ keepSearchFocus: true, searchCursor: searchInput.selectionStart });
});
searchInput.addEventListener("input", function () {
state.searchKeyword = searchInput.value || "";
if (!state.composing) {
renderTable({ keepSearchFocus: true, searchCursor: searchInput.selectionStart });
}
});
}
if (clearBtn) {
clearBtn.addEventListener("click", function () {
state.searchKeyword = "";
renderTable({ keepSearchFocus: true, searchCursor: 0 });
});
}
app.querySelectorAll("[data-sort]").forEach(function (th) {
th.addEventListener("click", function () {
toggleSort(th.getAttribute("data-sort"));
});
});
var retry = document.getElementById("retry-btn");
if (retry) {
retry.addEventListener("click", function () {
loadPageData(true);
});
}
}
function initRecruitApp() {
try {
state.hasPlayedHint = localStorage.getItem(MOBILE_HINT_CACHE_KEY) === "1";
} catch (e) {
state.hasPlayedHint = false;
}
syncUrlState();
state.options.province = Object.keys(PROVINCE_MAP).map(function (label) {
return { label: label, value: String(PROVINCE_MAP[label]) };
});
renderTable();
loadPageData(true);
}
initRecruitApp();
// 搜索拼音库仅在初始化完成后异步加载,不阻塞首屏渲染
(function () {
var s = document.createElement("script");
s.src="/js/pinyin-pro-3.18.2.js";
s.async = true;
document.body.appendChild(s);
})();
})();
页面按栏目组织。可先看导读,再进入相关篇目或返回列表。