𝕷𝖎𝖑𝖏𝖆𝖈𝖐 发表于 2024-9-9 18:17:15

小白开发插件 又遇到问题了 前端无法获取后端的数据 New

小白开发插件 又遇到问题了 前端无法获取后端的数据

用DZ原生的浮动窗 无法获取后端的数据

用模态窗口可以正常获取




我知道答案 回答被采纳将会获得1 贡献 已有0人回答

Discuz智能体 发表于 2025-3-16 07:31:59

关于Discuz浮动窗口无法获取数据的问题,建议从以下六个技术维度进行排查和解决:

1. 异步加载机制优化
- 使用showWindow的complete回调函数确保DOM加载完成
- 示例代码:
showWindow('mywindow', 'plugin.php?id=myplugin:ajax', 'get', {
    complete: function(winObj){
      $.ajax({
            url: 'plugin.php?id=myplugin:data',
            dataType: 'json',
            success: function(response){
                $('#content_area', winObj.document).html(response.data);
            }
      });
    }
});

2. 作用域穿透方案
- 使用window.parent访问父级作用域
- 数据绑定优化方案:
showWindow('datawindow', 'plugin.php?id=myplugin:frame', 'get', {
    onload: function(iframe){
      iframe.contentWindow.postMessage({action:'loadData'}, '*');
    }
});

// 在浮动窗页面内
window.addEventListener('message', function(e){
    if(e.data.action === 'loadData'){
      fetchData().then(data => renderUI(data));
    }
});

3. 模板引擎强化方案
- 采用Discuz模板编译特性
- 服务端数据预渲染示例:
// 插件模块
function data_module(){
    $data = C::t('myplugin_table')->fetch_all();
    include template('myplugin:data_window');
}

// 模板文件
<!--{loop $data $row}-->
    <div class="data-item">{$row['content']}</div>
<!--{/loop}-->

4. 事件驱动解决方案
- 绑定窗口显示事件
- 增强型事件监听方案:
$(window).on('showwindow', function(event, winObj){
    if(winObj.id === 'dataWindow'){
      $.ajax({
            url: 'plugin.php?action=getdata',
            success: function(res){
                winObj.DOM.contentContainer.html(res.html);
            }
      });
    }
});

5. 动态加载增强方案
- 结合Discuz的scripta方法
- 动态脚本加载示例:
showWindow('dynamicWindow', 'plugin.php?id=myplugin:container', 'get', {
    afterShow: function(win){
      $.scripta({
            url: 'source/plugin/myplugin/loader.js',
            callback: function(){
                initDynamicContent(win);
            }
      });
    }
});

6. 混合渲染方案
- 结合服务端渲染与客户端渲染
- 实现代码示例:
// 后端处理
if($_GET['isajax']){
    $data = C::t('myplugin_data')->range(0, 20);
    exit(json_encode($data));
}

// 前端混合处理
showWindow('hybridWindow', 'plugin.php?id=myplugin:hybrid', 'get', {
    init: function(win){
      $.getJSON('plugin.php?id=myplugin:hybrid&isajax=1', function(data){
            var template = win.document.getElementById('hybrid-template').innerHTML;
            win.document.getElementById('content').innerHTML = parseTemplate(template, data);
      });
    }
});

补充建议:
1. 使用Discuz的XMLHTTP特性处理跨窗口通信
2. 在浮动窗URL后添加随机参数防止缓存:'plugin.php?id=myplugin:data&_t='+Date.now()
3. 使用MutationObserver监听DOM变化:
var observer = new MutationObserver(function(mutations) {
    if(document.getElementById('dynamicContent')){
      loadAjaxData();
      observer.disconnect();
    }
});
observer.observe(document.body, {childList: true, subtree: true});

请根据实际业务场景选择合适的解决方案,建议优先采用服务端渲染方案提升首屏加载性能,配合客户端渲染实现动态更新。注意保持代码与Discuz X3.5的最新开发规范相符,特别注意模板变量的安全过滤和SQL注入防护。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 小白开发插件 又遇到问题了 前端无法获取后端的数据 New