/** * NewSearchproduct.js - Enhanced product search functionality * * This script handles the product search and specification management * for the country price management interface. */ // Make sure jQuery is available before initializing (function($) { // Run when document is ready $(document).ready(function() { // Initialize the product specification search functionality initProductSearch(); // Ensure search input is enabled on page load $('#specificationSearch').prop('disabled', false); // Add form validation for price fields $('form[name="form1"]').on('submit', function(e) { var hasError = false; var firstErrorField = null; // Check country name and area code fields var $countryName = $('#countryName'); var $countryCode = $('#countryCode'); // Validate country name if ($countryName.val().trim() === '') { hasError = true; $countryName.css('border-color', 'red'); if (!firstErrorField) { firstErrorField = $countryName; } // Show inline error if ($countryName.next('.field-error').length === 0) { $countryName.after('
国家名称不能为空
'); } } else { $countryName.css('border-color', ''); $countryName.next('.field-error').remove(); } // Validate area code if ($countryCode.val().trim() === '') { hasError = true; $countryCode.css('border-color', 'red'); if (!firstErrorField) { firstErrorField = $countryCode; } // Show inline error if ($countryCode.next('.field-error').length === 0) { $countryCode.after('
区号不能为空
'); } } else { $countryCode.css('border-color', ''); $countryCode.next('.field-error').remove(); } // Check all price fields $('input[name="spec_price[]"]').each(function() { var price = $(this).val().trim(); if (price === '' || price === '0' || parseFloat(price) <= 0) { hasError = true; $(this).css('border-color', 'red'); // Store reference to first error field for scrolling if (!firstErrorField) { firstErrorField = $(this); } // Find product and spec name for error message var $specItem = $(this).closest('.specitem'); var productName = $specItem.prevAll('.product-header').first().text().trim(); var specName = $specItem.find('.spec-name').text().trim(); // Show inline error under the field var $errorMsg = $('
售价不能为0或空白
'); $specItem.find('.price-error').remove(); $(this).after($errorMsg); } else { $(this).css('border-color', ''); $(this).next('.price-error').remove(); } }); if (hasError) { e.preventDefault(); // Create appropriate error message var errorMessage = '错误:'; if ($countryName.val().trim() === '' || $countryCode.val().trim() === '') { errorMessage += '国家名称和区号不能为空!'; } // Check if there are price errors var hasPriceErrors = false; $('input[name="spec_price[]"]').each(function() { var price = $(this).val().trim(); if (price === '' || price === '0' || parseFloat(price) <= 0) { hasPriceErrors = true; return false; // Break the loop } }); if (hasPriceErrors) { if (errorMessage !== '错误:') { errorMessage += '\n\n'; } errorMessage += '部分产品规格的售价为0或空白,请检查并填写所有售价!'; } alert(errorMessage); // Scroll to first error field if (firstErrorField) { $('html, body').animate({ scrollTop: firstErrorField.offset().top - 100 }, 500); } return false; } return true; }); }); /** * Initialize the product search functionality */ function initProductSearch() { var $searchInput = $('#specificationSearch'); var $resultsList = $('#specificationlist'); var searchTimeout; // Product search input keyup event with debounce $searchInput.on('keyup', function() { var keyword = $(this).val().trim(); // Clear previous timeout to implement debounce clearTimeout(searchTimeout); // Hide results and return if search term is too short if (keyword.length < 2) { $resultsList.find('ul').empty(); $resultsList.hide(); return; } // Set a timeout to prevent too many requests searchTimeout = setTimeout(function() { // Show loading indicator $resultsList.find('ul').html('
  • 正在搜索产品...
  • '); $resultsList.show(); // Make AJAX request to search products $.ajax({ url: 'ajax_search_products_for_spec.php', type: 'POST', data: {keyword: keyword}, dataType: 'html', success: function(data) { // Check for session errors in the response if (data.indexOf('session') !== -1 && data.indexOf('Notice') !== -1) { console.warn("Session notice detected in response. This may be harmless."); } $resultsList.find('ul').html(data); // Show or hide results based on content if ($resultsList.find('ul li').length > 0) { $resultsList.show(); } else { $resultsList.hide(); } }, error: function(xhr, status, error) { console.error("Search error:", error); $resultsList.find('ul').html('
  • 搜索失败,请重试
  • '); } }); }, 300); // 300ms debounce }); // Show search results when input is focused (if results exist and search term is valid) $searchInput.on('focus', function() { var keyword = $(this).val().trim(); if (keyword.length >= 2 && $resultsList.find('ul li').length > 0) { $resultsList.show(); } }); // Handle product selection from search results $(document).on('click', '#specificationlist ul li', function() { if ($(this).hasClass('search-loading') || $(this).hasClass('search-error')) { return; // Don't process clicks on loading or error messages } var $this = $(this); var productId = $this.data('product-id'); // Skip if no product ID was found if (!productId) { console.error("No product ID found"); return; } var productName = $this.data('product-name'); var categoryName = $this.data('category-name'); var productUnit = $this.data('unit'); // Check if product is already added if ($('.specifications .product-header:contains("' + productName + '")').length > 0) { alert('该产品已添加!'); return; } // Hide results and show loading state $resultsList.hide(); $searchInput.val('正在加载产品规格...').prop('disabled', true); // Fetch product specifications $.ajax({ url: 'ajax_get_product_specifications.php', type: 'POST', data: {product_id: productId}, dataType: 'html', success: function(data) { // Check for session errors in the response if (data.indexOf('session') !== -1 && data.indexOf('Notice') !== -1) { console.warn("Session notice detected in response. This may be harmless."); // Try to extract the actual content after the notice data = data.substring(data.indexOf('

    ') + 4); } // Check if we received an error message about no specifications if (data.indexOf('没有规格信息') !== -1) { alert('该产品没有规格信息,请先在产品管理中添加规格'); $searchInput.val('').prop('disabled', false); return; } // Create product header var categoryDisplay = categoryName ? ' (' + categoryName + ')' : ''; var productHeader = $('
    ' + productName + categoryDisplay + '
    '); // Append product header and specifications $('.specifications').append(productHeader); $('.specifications').append(data); // Make sure price fields are empty and don't have placeholders var $lastHeader = $('.specifications .product-header:last'); $lastHeader.nextUntil('.product-header', '.specitem').find('input[name="spec_price[]"]').attr('placeholder', '').val(''); // Reset search input $searchInput.val('').prop('disabled', false); }, error: function(xhr, status, error) { console.error("Error loading specifications:", error); alert('加载产品规格失败,请重试'); $searchInput.val('').prop('disabled', false); }, complete: function() { // Always make sure search input is re-enabled setTimeout(function() { $searchInput.prop('disabled', false); }, 500); } }); }); // Delete specification when delete button is clicked $(document).on('click', '.specdelete', function() { // if (!confirm('确定要删除此规格吗?')) { // return; // } var $specItem = $(this).closest('.specitem'); var $productHeader = $specItem.prevAll('.product-header').first(); // Remove specification item $specItem.fadeOut(200, function() { $(this).remove(); // Check if there are any specifications left for this product var hasSpecs = false; $productHeader.nextUntil('.product-header', '.specitem').each(function() { hasSpecs = true; return false; // Break the loop }); // If no specifications left, remove product header if (!hasSpecs) { $productHeader.fadeOut(200, function() { $(this).remove(); }); } }); }); // Hide search results when clicking outside $(document).on('click', function(e) { if (!$(e.target).closest('#specificationSearch, #specificationlist').length) { $resultsList.hide(); } }); } })(jQuery);