Django中Ajax加载子模板后复用jQuery Editable Select脚本的优化方案咨询
Django中Ajax加载子模板后复用jQuery Editable Select脚本的优化方案咨询
嘿,我刚好碰到过一模一样的问题,给你整理一套落地性很强的解决方案,完美解决每次Ajax加载都重新拉脚本导致的慢和随机失效问题:
第一步:提前在父模板加载脚本并封装通用初始化函数
别再每次Ajax都远程拉取脚本了,先把jQuery Editable Select的脚本和样式文件下载到你的Django项目静态文件目录里(比如static/js和static/css),然后在父模板的页面底部(推荐放在</body>标签前,不阻塞页面渲染)一次性引入:
{% load static %} <!-- 先引入组件样式 --> <link rel="stylesheet" href="{% static 'css/jquery-editable-select.min.css' %}"> <!-- 再引入组件脚本,注意要在jQuery之后加载(组件依赖jQuery) --> <script src="{% static 'js/jquery-editable-select.min.js' %}"></script>
接下来在父模板里写一个通用初始化函数,专门处理所有需要变成可搜索下拉框的元素:
// 封装初始化逻辑,方便父模板和子模板复用 function initEditableSelects() { // 给所有带.editable-select类的下拉框初始化组件 $('.editable-select').editableSelect({ // 这里可以加你的自定义配置,比如搜索延迟、动画效果等 // 示例:searchDelay: 200, effects: 'fade' }); } // 父模板页面加载完成后,先初始化自身的下拉框 $(document).ready(function() { initEditableSelects(); });
第二步:修改Ajax请求,渲染子模板后调用初始化函数
把你原来Ajax里的getScript代码删掉,只需要在Ajax成功拿到子模板HTML并插入页面后,调用上面的initEditableSelects()函数就行。你的Ajax代码可以改成这样:
$.ajaxSetup({ data: { select_update_record_project_id: sales_documents_id, csrfmiddlewaretoken: '{{ csrf_token }}' }, }); $.ajax({ type: "GET", url: "/my_url/", cache: true, success: function(response) { // 假设你把返回的子模板内容插入到#target-container容器里 $('#target-container').html(response); // 子模板渲染完成后,立即初始化里面的下拉框 initEditableSelects(); }, error: function(xhr, status, error) { console.error('子模板加载失败:', error); } });
几个关键注意点
- 子模板里所有需要变成可搜索下拉框的
<select>标签,都要加上统一的类名editable-select,这样初始化函数才能准确选中它们 - 之前你遇到的“随机失效”问题,本质是
getScript的异步特性——有时候子模板已经渲染完了,脚本还没加载好,导致初始化没触发。现在脚本提前加载完毕,渲染后立即调用初始化,时机完全可控 - 如果后续要多次Ajax加载子模板,这个方法依然适用,每次渲染完成后调用初始化函数就行
这样改完之后,不仅不会再重复拉取远程脚本,速度会快很多,而且初始化逻辑统一,父模板和所有子模板的下拉框都能完美复用这个组件~
备注:内容来源于stack exchange,提问作者Nico44044
相关产品推荐
相关产品推荐

