unction updateViewModeToggle($toggle, label, iconUrl) {
var $text = $toggle.find('.view-mode-text');
var $icon = $toggle.find('.view-mode-icon');
if (!$text.length) {
$toggle.prepend('
');
$text = $toggle.find('.view-mode-text');
}
if (!$icon.length) {
$toggle.append('
![]()
');
$icon = $toggle.find('.view-mode-icon');
}
$text.text(label);
$icon.attr({
src: iconUrl,
alt: label
});
$toggle.attr({
'aria-label': '切换为' + label,
title: '切换为' + label
});
}
function applyViewMode(mode) {
var $viewModeToggle = $('#viewModeToggle');
var $imageList = $('.list_tu');
var $textList = $('.list_zi');
var normalizedMode = mode === 'text' ? 'text' : 'image';
if (normalizedMode === 'text') {
$imageList.hide();
$textList.show();
updateViewModeToggle($viewModeToggle, '卡片版', viewModeToggleIcons.card);
return;
}
$textList.hide();
$imageList.show();
updateViewModeToggle($viewModeToggle, '列表版', viewModeToggleIcons.list);
}
function loadSavedViewMode() {
try {
return window.localStorage.getItem(listViewModeStorageKey) || 'image';
} catch (error) {
return 'image';
}
}
function saveViewMode(mode) {
try {
window.localStorage.setItem(listViewModeStorageKey, mode);
} catch (error) {
return;
}
}
function syncMobileSearchHiddenInputs(url) {
var parsedUrl = new URL(url, window.location.origin);
var searchParams = parsedUrl.searchParams;
ajaxStateFieldNames.forEach(function (name) {
var $desktopInput = $desktopForm.find('input[type="hidden"][name="' + name + '"]');
if ($desktopInput.length) {
$desktopInput.val(searchParams.get(name) || '');
}
if (!$mobileSearchForm.length) {
return;
}
var $existingInput = $mobileSearchForm.find('input[type="hidden"][name="' + name + '"]');
var value = searchParams.get(name) || '';
if (value === '') {
$existingInput.remove();
return;
}
if ($existingInput.length) {
$existingInput.val(value);
return;
}
$('
', {
type: 'hidden',
name: name,
value: value
}).appendTo($mobileSearchForm);
});
}
function resolveListDigitCount(url) {
var parsedUrl = new URL(url, window.location.origin);
var digitCountValue = parsedUrl.searchParams.get('digit_count') || '';
if (['5', '6', '7', '8', '9', '10'].indexOf(digitCountValue) >= 0) {
return digitCountValue;
}
var pathMatch = parsedUrl.pathname.match(/\/([5-9]|10)wei\.html$/i);
if (pathMatch) {
return pathMatch[1];
}
return '';
}
function initMobileFilters() {
var mobileConfigs = [
{ trigger: '#wei', param: 'digit_count', data: ["全部", "5位", "6位", "7位", "8位", "9位", "10位"], values: ["", 5, 6, 7, 8, 9, 10] },
{ trigger: '#deng', param: 'level_range', data: ["全部", "1-16级", "16-32级", "32-48级", "48-64级", "64-128级", "128级以上"], values: ["", "1-16", "16-32", "32-48", "48-64", "64-128", "128+"] },
{ trigger: '#gui', param: 'number_rule_filter', data: ["全部", "AB", "AAA", "AAAA", "5A", "6A", "7A", "8A", "ABC", "ABCD", "ABCDE", "ABCDEF", "AABB", "ABAB", "AABBCC", "AAABBB", "AAAABBBB"], values: ["", "AB", "AAA", "AAAA", "5A", "6A", "7A", "8A", "ABC", "ABCD", "ABCDE", "ABCDEF", "AABB", "ABAB", "AABBCC", "AAABBB", "AAAABBBB"] },
{ trigger: '#price', param: 'price_range', data: ["全部", "0-200元", "200-500元", "500-1000元", "1000-2000元", "2000-5000元", "5000-1万元", "1万-3万元", "3万以上"], values: ["", "0-200", "200-500", "500-1000", "1000-2000", "2000-5000", "5000-10000", "10000-30000", "30000+"] },
{ trigger: '#lei', param: 'type_group', data: ["全部", "普号", "靓号"], values: ["", "普号", "靓号"] },
{ trigger: '#mi', param: 'password_protection', data: ["全部", "无密保", "手机号"], values: ["", "无密保", "手机号"] },
{ trigger: '#xin', param: 'can_bind_wechat', data: ["全部", "能绑", "不能绑"], values: ["", 1, 0] },
{ trigger: '#pai', param: 'exclude_digits', data: ["全部", "不含4", "不含7", "不含4 7"], values: ["", 4, 7, 47] },
{ trigger: '#num', param: 'digit_focus', data: ["全部", "0较多", "1较多", "2较多", "3较多", "4较多", "5较多", "6较多", "7较多", "8较多", "9较多"], values: ["", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9] },
{ trigger: '#te', param: 'feature', data: ["全部", "类型号", "黄金靓号", "黑金靓号", "客服号", "爱情号", "发财号", "皇冠号", "业务号"], values: ["", "类型号", "黄金靓号", "黑金靓号", "客服号", "爱情号", "发财号", "皇冠号", "业务号"] }
];
mobileConfigs.forEach(function (config) {
var trigger = document.querySelector(config.trigger);
if (!trigger || typeof MobileSelect === 'undefined' || trigger.dataset.mobileSelectInitialized === '1') {
return;
}
var currentValue = config.param === 'digit_count'
? resolveListDigitCount(window.location.href)
: (new URL(window.location.href).searchParams.get(config.param) || '');
var currentIndex = config.values.indexOf(currentValue);
trigger.dataset.mobileSelectInitialized = '1';
new MobileSelect({
trigger: trigger,
wheels: [{ data: config.data }],
position: [currentIndex >= 0 ? currentIndex : 0],
callback: function (indexArr) {
var url = new URL(window.location.href);
var value = config.values[indexArr[0]] || '';
url.searchParams.delete('page');
if (value === '') {
url.searchParams.delete(config.param);
} else {
url.searchParams.set(config.param, value);
}
loadListResults(url.toString());
}
});
});
}
function initListResultPanel() {
applyViewMode(loadSavedViewMode());
initMobileFilters();
initMobileInfiniteScroll();
}
function scrollTextListToFirstItem() {
var $firstNumber = $('.jieguo .list_zi li:first .num a');
var $fallbackTarget = $('.jieguo .list_zi .tit');
var $target = $firstNumber.length ? $firstNumber : $fallbackTarget;
if (!$target.length) {
return;
}
var targetTop = Math.max(0, ($target.offset() ? $target.offset().top : 0) - 120);
$('html, body').stop(true).animate({
scrollTop: targetTop
}, 220);
}
function syncListBreadcrumb(url) {
var normalizedDigitCount = resolveListDigitCount(url);
var breadcrumbText = normalizedDigitCount ? (normalizedDigitCount + '位QQ') : '商品筛选';
var $breadcrumbCurrent = $('.bread a.on').last();
if ($breadcrumbCurrent.length) {
$breadcrumbCurrent.text(breadcrumbText);
}
document.title = getListPageTitle(normalizedDigitCount);
}
function getListPageTitle(digitCount) {
var normalizedDigitCount = String(digitCount || '');
if (normalizedDigitCount && listSeoTitleMap[normalizedDigitCount]) {
return listSeoTitleMap[normalizedDigitCount];
}
return "99靓号网 - 商品筛选";
}
function syncListTopNav(url) {
var normalizedDigitCount = resolveListDigitCount(url);
var activeLabel = normalizedDigitCount ? (normalizedDigitCount + '位QQ') : '';
$('.pc_nav li').removeClass('on');
if (!activeLabel) {
return;
}
$('.pc_nav li').filter(function () {
return $.trim($(this).text()) === activeLabel;
}).addClass('on');
}
function buildPartialUrl(url) {
var partialUrl = new URL(url, window.location.origin);
partialUrl.searchParams.set('partial', '1');
return partialUrl.toString();
}
function isMobileViewport() {
return window.matchMedia('(max-width: 768px)').matches;
}
function disconnectMobileInfiniteScroll() {
if (mobileInfiniteObserver) {
mobileInfiniteObserver.disconnect();
mobileInfiniteObserver = null;
}
$(window).off('scroll.listMobileInfinite');
}
function updateMobileInfiniteTrigger(text, isEnd) {
var $trigger = $('.jieguo .mobile-infinite-trigger');
if (!$trigger.length) {
return;
}
$trigger.find('span').text(text);
$trigger.toggleClass('is-end', !!isEnd);
}
function appendMobileListResults(url) {
var $currentResults = $('.jieguo');
var nextUrl = url || $currentResults.attr('data-next-url') || '';
if (!isMobileViewport() || mobileInfiniteLoading || nextUrl === '' || !$currentResults.length) {
return;
}
if (mobileInfiniteRequest && mobileInfiniteRequest.readyState !== 4) {
return;
}
mobileInfiniteLoading = true;
$currentResults.addClass('is-mobile-loading');
updateMobileInfiniteTrigger('正在加载...', false);
mobileInfiniteRequest = $.ajax({
url: buildPartialUrl(nextUrl),
type: 'GET',
dataType: 'html'
}).done(function (html) {
var $newResults = $(html).filter('.jieguo').first();
if (!$newResults.length) {
$newResults = $(html).find('.jieguo').first();
}
if (!$newResults.length) {
return;
}
var $newImageItems = $newResults.find('.list_tu .jingpin ul').children();
var $newTextItems = $newResults.find('.list_zi ul').children();
var $imageList = $currentResults.find('.list_tu .jingpin ul');
var $textList = $currentResults.find('.list_zi ul');
if ($newImageItems.length && $imageList.length) {
$imageList.append($newImageItems);
}
if ($newTextItems.length && $textList.length) {
$textList.append($newTextItems);
}
$currentResults.attr('data-current-page', $newResults.attr('data-current-page') || $currentResults.attr('data-current-page') || '');
$currentResults.attr('data-total-pages', $newResults.attr('data-total-pages') || $currentResults.attr('data-total-pages') || '');
$currentResults.attr('data-next-url', $newResults.attr('data-next-url') || '');
var $newTrigger = $newResults.find('.mobile-infinite-trigger');
if ($newTrigger.length) {
updateMobileInfiniteTrigger($newTrigger.find('span').text() || '继续下滑加载更多', $newTrigger.hasClass('is-end'));
} else {
updateMobileInfiniteTrigger('已经到底了', true);
}
initMobileInfiniteScroll();
}).fail(function (xhr, status) {
if (status === 'abort') {
return;
}
updateMobileInfiniteTrigger('加载失败,继续下滑重试', false);
}).always(function () {
mobileInfiniteLoading = false;
$currentResults.removeClass('is-mobile-loading');
mobileInfiniteRequest = null;
});
}
function initMobileInfiniteScroll() {
disconnectMobileInfiniteScroll();
var $results = $('.jieguo');
var $trigger = $results.find('.mobile-infinite-trigger');
if (!isMobileViewport() || !$results.length || !$trigger.length || $results.hasClass('jieguo-empty')) {
return;
}
if (!$results.attr('data-next-url')) {
updateMobileInfiniteTrigger('已经到底了', true);
return;
}
if ('IntersectionObserver' in window) {
mobileInfiniteObserver = new window.IntersectionObserver(function (entries) {
entries.forEach(function (entry) {
if (entry.isIntersecting) {
appendMobileListResults();
}
});
}, {
rootMargin: '0px 0px 240px 0px'
});
mobileInfiniteObserver.observe($trigger.get(0));
return;
}
$(window).on('scroll.listMobileInfinite', function () {
var triggerTop = $trigger.offset() ? $trigger.offset().top : 0;
var viewportBottom = $(window).scrollTop() + $(window).height() + 240;
if (viewportBottom >= triggerTop) {
appendMobileListResults();
}
});
}
function loadListResults(url) {
var normalizedUrl = new URL(url, window.location.origin);
normalizedUrl.searchParams.delete('partial');
if (currentListRequest && currentListRequest.readyState !== 4) {
currentListRequest.abort();
}
$('.jieguo').addClass('is-loading');
currentListRequest = $.ajax({
url: buildPartialUrl(normalizedUrl.toString()),
type: 'GET',
dataType: 'html'
}).done(function (html) {
var $newResults = $(html);
$('.jieguo').replaceWith($newResults);
window.history.replaceState({}, '', normalizedUrl.toString());
syncMobileSearchHiddenInputs(normalizedUrl.toString());
syncListBreadcrumb(normalizedUrl.toString());
syncListTopNav(normalizedUrl.toString());
initListResultPanel();
if (pendingListScrollTarget === 'text-first-item') {
scrollTextListToFirstItem();
}
}).fail(function (xhr, status) {
if (status === 'abort') {
return;
}
window.location.href = normalizedUrl.toString();
}).always(function () {
currentListRequest = null;
pendingListScrollTarget = '';
$('.jieguo').removeClass('is-loading');
});
}
$desktopForm.find('.shaixuan_2 input[type="radio"]').on('change', function () {
if ($(this).attr('name') === 'price_range') {
$desktopForm.find('input[name="price_min"], input[name="price_max"]').val('');
}
$desktopForm.trigger('submit');
});
$desktopForm.on('submit', function (event) {
event.preventDefault();
var url = new URL($(this).attr('action') || 'list.php', window.location.origin);
$(this).serializeArray().forEach(function (item) {
if (item.value !== '') {
url.searchParams.append(item.name, item.value);
}
});
loadListResults(url.toString());
});
$mobileSearchForm.on('submit', function (event) {
event.preventDefault();
var url = new URL($(this).attr('action') || 'list.php', window.location.origin);
$(this).serializeArray().forEach(function (item) {
if (item.value !== '') {
url.searchParams.append(item.name, item.value);
}
});
loadListResults(url.toString());
});
$(document).on('click', '#viewModeToggle', function () {
var nextMode = $('.list_zi').is(':visible') ? 'image' : 'text';
applyViewMode(nextMode);
saveViewMode(nextMode);
});
$(document).on('click', '.jieguo .sort-toggle, .jieguo .pages a, .jieguo .list-reset-btn', function (event) {
event.preventDefault();
var href = $(this).attr('href');
pendingListScrollTarget = $(this).closest('.pages').length && $('.list_zi').is(':visible')
? 'text-first-item'
: '';
if (href) {
loadListResults(href);
}
});
$(document).on('submit', '.jieguo .page-jump', function (event) {
event.preventDefault();
pendingListScrollTarget = $('.list_zi').is(':visible') ? 'text-first-item' : '';
var url = new URL($(this).attr('action') || 'list.php', window.location.origin);
$(this).serializeArray().forEach(function (item) {
if (item.value !== '') {
url.searchParams.append(item.name, item.value);
}
});
loadListResults(url.toString());
});
$(window).off('resize.listMobileInfinite').on('resize.listMobileInfinite', function () {
initMobileInfiniteScroll();
});
initListResultPanel();
syncListBreadcrumb(window.location.href);
syncListTopNav(window.location.href);
});
-->