嵌套Ajax调用中.when()用法问题(jQuery/DataTables/WordPress)
问题分析与解决方案
你的核心问题是DataTables初始化(包括其内部的Ajax数据加载)是异步操作,但当前代码在调用loading_table后立刻执行tooltip初始化,此时表格还未渲染完成,tooltip绑定的元素尚不存在,导致初始化无效。你尝试用$.when但没效果,是因为loading_table没有返回可被识别的Promise对象。
步骤1:改造loading_table,返回Promise
修改loading_table函数,让它返回一个Promise,并在DataTables的initComplete回调中resolve这个Promise——initComplete会在表格完全加载数据、渲染完成后触发,这正是我们需要等待的时机。
function loading_table(typeTable) { // 返回Promise对象 return new Promise((resolve) => { switch(typeTable) { case 'clienti': var dt_basic_table_customer = $('.datatables-basic-customer'); if (dt_basic_table_customer.length) { dt_basic_table_customer.DataTable({ ajax:{ url: myAjax.ajax_url + '?action=tabella_clienti', cache: false, }, columns: [ // 你的列配置 ], columnDefs: [ // 你的列定义 ], // 表格完全初始化完成后resolve Promise initComplete: function() { resolve(); } }); } else { // 未找到表格元素时直接resolve resolve(); } break; default: // 其他表格类型同理,或直接resolve resolve(); } }); }
步骤2:等待所有表格加载完成后初始化tooltip
利用Promise.all等待所有表格的Promise执行完成,再统一初始化tooltip,确保tooltip绑定的元素已存在于DOM中。
修改refresh_content中的对应代码块:
if(table.length) { // 收集所有表格加载的Promise const tablePromises = []; $(table).each(function(index){ var typeTable = $(this).data('table'); tablePromises.push(loading_table(typeTable)); }); // 等待所有表格渲染完成 Promise.all(tablePromises).then(() => { console.log('所有表格加载完成'); // 先销毁旧tooltip实例(避免重复初始化冲突),再重新初始化 $('[data-bs-toggle="tooltip"]').tooltip('dispose').tooltip(); }); }
额外提示
检查你的代码是否已经将response.content正确插入到页面DOM中——当前代码仅做了$('<div/>').html(response.content).find('.datatable'),但未将新页面内容挂载到页面,这会导致后续表格和tooltip操作找不到目标元素。
内容的提问来源于stack exchange,提问作者Wolftrick
相关产品推荐
相关产品推荐

