我正在尝试在JavaScript中创建名称空间,如下面的脚本:
var hlAdmin = hlAdmin || {};
hlAdmin.editCompany = function (src) {
// function script
}
然后我用HTML调用该函数:
onclick="hlAdmin.editCompany(123)"
我收到引用错误:找不到“editCompany”。
任何人都知道为什么?
答案 0 :(得分:1)
根据您的评论,我假设以下内容:
等效脚本(和范围界定):
<html><head>
</script>
var hlAdmin = hlAdmin || {};
hlAdmin.editCompany = function (src) {
// error in this script
}
</script>
</head></body>
<button onclick="hlAdmin.editCompany(123)">Caption</button>
</body></html>
在此示例中,hlAdmin
确实位于全局范围内(主机的根范围,在浏览器中称为window
)。
如果(在此示例中)您得到引用错误:Cannot find "editCompany"
,那么应该查看(浏览器的)错误日志中的其他错误消息,因为当函数中存在致命错误时hlAdmin.editCompany
,然后不会创建该函数(因此.editCompany
成为指向undefined
的属性,而不是指向函数的方法,或.editCompany
没有#{1}}。甚至存在(取决于引擎/错误))。
要调查您是否确实存在范围问题,可以通过以下方式对其进行测试:window['hlAdmin'] || (window['hlAdmin']={});
(或某些等效变体)。如果这使代码工作,那么你似乎有一些范围问题。
希望这些步骤可以帮助将来的人。
答案 1 :(得分:0)
通常认为混合内联javascript和非内联的不良形式。执行此操作的首选方法是使用事件处理程序将所有javascript保存在一个位置:
window.hlAdmin = window.hlAdmin || {};
window.hlAdmin.editCompany = function (src) {
// function script
}
document.getElementById('yourElementId').onclick = function() {
hlAdmin.editCompany(123);
};
更具体地解决问题:可能导致此问题的一件事是hlAdmin
对象未在全局范围内结束。您声明此声明位于JavaScript文件顶部&#34;但是如果它在任何类型的函数中(例如函数设置为{{1} ,或jQuery window.onload
)当它被声明为$(function() { ... });
时,它不会在全局范围内结束。使用var
声明的变量仅最终全局作用域,如果它在任何类型的函数之外的根作用域中。如果不是使用var
而是使用var hlAdmin
,这将确保即使您已经在文档就绪函数或类似内容中,您也可以创建window.hlAdmin
在全局上下文中,如果它实际上是范围问题,它将解决问题。
答案 2 :(得分:0)
我发现了问题。
浏览器(至少Aurora和Chrome)正在删除onclick属性中的命名空间。当您查看浏览器html时,命名空间刚刚从标记中消失。