【发布时间】:2012-08-14 12:39:47
【问题描述】:
我不得不承认,我一直对“正确的”不显眼的 javascript 有点困惑。我知道您想将脚本从标记中移出,并且没有标记引用您的脚本(当然,原始脚本引用除外!)但我看不出这在实践中是如何工作的。
我知道如何让您的标记不引用代码,但我觉得脚本中 DOM ID 中的硬编码很脏。这是一个例子:
<script src="....awesome.js"></script>
<button id="primaryAction">Click me for something awesome!</button>
<labal id="resultText"></label>
//in awesome.js
awesome = function(){
init = function(){
//pretend we are doing something incredible here
//and then we hook the button up
$('#primaryAction').click(function(){
$('#resultText').val(result());
});
};
result = function(){
//here something awesome happens and we return the result
return "Joe";
};
return {
init: init
}
}();
这应该是非常有代表性的东西,对吧?所以我的困惑来自两个地方。
- 我应该从哪里调用 awesome.init()?
- 我觉得从 javascript 中引用控件 ID 是错误的,但在脚本中指定类并要求标记使用它们才能工作也感觉错误。应该怎么做?两者都让我觉得突兀。 init() 函数是否应该采用
{button:'#primaryAction', result:'#resultText'}之类的方法但又回到了 #1..应该从哪里调用 Init?
如果我在这方面做错了,请引导我走上这条路。
【问题讨论】:
-
你的所有变量在哪里声明?
-
不要对在 JS 代码中使用元素 ID 感到压力太大,在某种程度上 没有任何问题。关于在哪里调用
awesome.init(),因为它引用了一个DOM元素,你需要在元素被解析之后调用它,所以要么从文档就绪处理程序调用它,要么从一个脚本块调用它出现在元素之后 - 将脚本块放在正文末尾是标准做法(嗯,是几种相互竞争的标准做法之一)。 -
@nnnnnn 我会直接从标记中调用 awesome.init,还是应该将它放在脚本本身的底部 $(function(){awesome.init();});
-
如果它在底部的脚本中,您也不需要 document.ready,所以只需
awesome.init();即可。如果你已经在页面的其他地方有一个 document.ready 处理程序,你可以将它添加到那里,以将所有 onready 的东西放在一起。 -
@nnnnnn 你应该把所有这些都集中在一个答案上
标签: javascript html design-patterns