Odoo13模板script标签中JS字典取值返回undefined问题如何解决
问题原因
- 核心原因是代码中的
hidden_page_number回调函数未被触发:只有页面中存在class="hidden_page_number"的DOM元素时,才会执行回调给vars['hiddenNumber']赋值,若没有匹配元素,该变量自然为undefined。你观察到elt.style.visibility = "hidden"生效,是测试时单独执行的结果,实际运行中该行代码从未被调用。 window未定义是wkhtmltopdf 0.12.5的运行环境特性:该版本基于QtWebKit内核,没有完全暴露浏览器标准的window全局对象,无法直接通过window挂载全局变量。
解决方案
- 首先确保你的Odoo报告模板中存在带
class="hidden_page_number"的元素,可手动插入一个隐藏的占位元素:
<span class="hidden_page_number" style="display:none"></span>
- 给
vars对象的相关字段设置默认兜底值,避免未赋值时报错,同时补全代码的边界判断逻辑。
修改后的完整代码
<script> function subst() { var vars = { // 新增默认值兜底,避免未赋值时返回undefined hiddenNumber: '0', sitepages: '0' }; var x = document.location.search.substring(1).split('&'); for (var i in x) { var z = x[i].split('=', 2); vars[z[0]] = unescape(z[1]); } // 新增非空判断,避免vars['webpage']不存在时报错 var index = vars['webpage'] ? vars['webpage'].split('.', 4)[3] : ''; var operations = { // other operations 'hidden_page_number': function (elt) { elt.style.visibility = "hidden"; // 新增非空判断,避免innerHTML为空 vars['hiddenNumber'] = elt.innerHTML || '0'; }, }; for (var klass in operations) { var y = document.getElementsByClassName(klass); for (var j=0; j<y.length; ++j) { operations[klass](y[j]); } } var fromPage = document.getElementsByClassName('page'); for(var j = 0; j<fromPage.length; j++) { fromPage[j].textContent = vars['hiddenNumber']; } var toPage = document.getElementsByClassName('topage'); for(var j = 0; j<toPage.length; j++) { toPage[j].textContent = vars.sitepages; } } </script>
调试排查可在Odoo调用wkhtmltopdf的参数中添加
--debug-javascript,查看JS运行日志确认回调是否被正常触发。
内容的提问来源于stack exchange,提问作者Karolis
相关产品推荐
相关产品推荐

