You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP电商页分页与过滤冲突:TypeError非法调用及AJAX参数异常

问题分析

你遇到的TypeError: Illegal invocation本质是非分页触发事件时,浏览器自动将事件对象作为第一个参数传入filterChange函数,覆盖了默认的limit = null。比如搜索框的input事件、复选框的change事件触发时,会把InputEvent/ChangeEvent对象传给filterChange,导致data.limit变成了事件对象(而非预期的null/数字),AJAX无法序列化这个对象,从而抛出错误。

解决方案

方案1:修正事件绑定,显式传入null

给过滤器元素绑定事件时,用匿名函数包裹调用,确保传入null作为limit参数:

  • 搜索框:
    $('#search').on('input', () => filterChange(null))
    
  • 子分类复选框:
    document.querySelectorAll("input[type='checkbox']").forEach(cb => {
        cb.addEventListener('change', () => filterChange(null))
    })
    
  • 排序下拉框:
    $('#sort').on('change', () => filterChange(null))
    
  • 分类下拉框(如果之前绑定了事件):
    $('#category').on('change', () => filterChange(null))
    

方案2:在函数内部校验参数,强制修正limit类型

如果不想修改所有事件绑定,可在filterChange开头添加参数校验逻辑,把非数字的参数重置为null:

function filterChange(limit = null){
    // 新增:校验limit类型,非法值重置为null
    if (typeof limit !== 'number' && limit !== null) {
        limit = null;
    }
    
    // 原逻辑保留
    let limitPaginacije = limit != null ? limit : 0;
    
    let search = document.querySelector("#search").value;
    let category_id = $('#category option:selected').attr('data-category-id');
    
    let subcategory_ids = [];
    document.querySelectorAll("input[type='checkbox']").forEach((cb)=>{
        if(cb.checked)
        {
            subcategory_ids.push(cb.getAttribute("data-type-id"));
        }
    })
    
    let sort = $("#sort").val();

    let data = {
        search: search,
        category_id : category_id,
        subcategory_ids : subcategory_ids,
        sort : sort,
        limit: limit
    }

    console.log(data);
    $.ajax({
        url:"/php_sajt/pages/logic/filters.php",
        method: "post",
        data: data,
        success: (data) =>{
            $("#product-container").html(data);
            paginationButtonsEventAdd();
        },
        error: (xhr) => {
            ajaxError(xhr);
        }
    })
}

额外优化:分页按钮事件绑定

确保分页按钮的事件绑定正确获取数字类型的limit:

function paginationButtonsEventAdd(){
    $('.pgn').off('click').on('click', function(e){
        e.preventDefault(); // 阻止默认跳转行为
        const limit = parseInt($(this).data('limit'), 10); // 转为数字类型
        filterChange(limit);
    });
}
验证效果

修改后,触发任何过滤器时data.limit都会是null,点击分页按钮时是数字类型,AJAX请求可正常序列化参数,不会再出现Illegal invocation错误。

内容的提问来源于stack exchange,提问作者popara03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:53:12