我必须承认,我一直对“正确”不引人注目的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
}
}();
这应该是一个非常具有代表性的东西,对吧?所以我的困惑来自两个地方。
{button:'#primaryAction', result:'#resultText'}
的东西但是它再次来到#1 ..应该从哪个Init调用?如果我从根本上做错了,请引导我走上正轨。
答案 0 :(得分:0)
答案 1 :(得分:0)
在您的元素上放置id(或类)属性并在脚本中引用这些相同的元素确实是正确的JQuery方法,但是有一些方法可以减少硬编码,您应该使用它们。
您可以使用jQuery遍历获取所需的元素。这将大大减少您需要的ID数量(理想情况下,每单位功能只需一个)http://learn.jquery.com/using-jquery-core/traversing/
例如
<form class="edit">
<button>Hello</button>
<label>Hi there</label>
</form>
$(function() {
var $form = $('form.edit');
var $button = $form.find('button');
var $label = $form.find('label');
// your code here
});
至于放置init函数的位置,如果你在HTML底部调用init应该可以工作。或者,如果你将它传递给$,它将运行onDomReady,即当DOM准备渲染时,如下所示:
$(function() {
init();
// anything else you need to do
});
或只是:
$(init)
JQuery插件是一个已添加到jQuery原型的函数。您应该将大多数功能都写为通用jQuery插件。使用遍历可以尽可能地从插件中消除硬编码的ID。
然后,您只需将一些应用程序特定的接线代码连接在一起。
http://learn.jquery.com/plugins/basic-plugin-creation/
//plugin
(function($) {
$.fn.editForm = function() {
$form = this;
var $button = $form.find('button');
var $label = $form.find('label');
}
})(jQuery)
// app code
$(function() {
$('form.edit').editForm()
});
您也可以采用不同的方法并考虑使用框架。
Angular 正在引起人们的极大关注。 Angular将您的HTML视为代码,并实际编译它以生成最终页面。你的代码和模板之间的联系非常紧密,这是一种完全相反的思考方式,但却具有显着的优势。