如何用动态内容生成实现不引人注目的JavaScript?
我编写了许多动态生成的内容(在PHP下开发),并且使用jQuery为我的项目添加了额外的灵活性和功能。
事实是,以不引人注目的方式添加JavaScript相当困难。这是一个例子:
我们必须生成随机数量的div
元素,每个元素具有触发onClick
的不同功能。我可以在我的div
元素上使用onclick
属性来调用带有参数的JS函数,但这只是一个不好的解决方案。同样,我可以在PHPfor
循环中与每个div一起生成一些jQuery代码,但是同样,这也不是完全不引人注意。
那么在这种情况下有什么解决方案呢?
解决方案
我们需要向div添加一些内容,以定义它们具有哪种类型的行为,然后使用jQuery选择这些div并添加行为。一种选择是使用class属性,尽管可以说应该将其用于表示而不是行为。一个替代方法是rel属性,但是我通常会发现我们还希望为每种行为指定不同的CSS,因此在这种情况下,类可能还可以
因此,例如,假设我们想要奇数和偶数行为:
<div class="odd">...</div> <div class="even">...</div> <div class="odd">...</div> <div class="even">...</div>
然后在jQuery中:
$(document).load(function() { $('.odd').click(function(el) { // do stuff }); $('.even').click(function(el) { // dostuff }); });
jQuery有一个非常强大的选择器引擎,它可以基于任何基于CSS的选择器进行查找,并且还支持某些XPath及其自己的选择器。了解他们! http://docs.jquery.com/Selectors
从问题很难说出来,但是也许我们可以使用不同的jQuery选择器来设置不同的点击行为?例如,假设我们具有以下条件:
<div class="section-1"> <div></div> </div> <div class="section-2"> <div></div> </div>
也许我们可以在jQuery中执行以下操作:
$('.section-1 div').onclick(...one set of functionality...); $('.section-2 div').onclick(...another set of functionality...);
基本上,根据上下文决定需要发生什么。我们还可以选择所有的div并测试一些父元素或者子元素,以确定它们获得什么功能。
我需要更多地了解我们所处情况的细节,以便提供更有针对性的建议,但这也许可以入门。
我建议不要理会W3C标准,并在需要添加处理程序的元素上写出HTML属性:
注意:这不会破坏页面的渲染!
<ul> <li handler="doAlertOne"></li> <li handler="doAlertTwo"></li> <li handler="doAlertThree"></li> </ul>
声明一些功能:
function doAlertOne() { } function doAlertTwo() { } function doAlertThree() { }
然后像这样使用jQuery:
$("ul li").each(function () { switch($(this).attr("handler")) { case "doAlertOne": doAlertOne(); break; case ... etc. } });
务实。
我并不是真的不太了解JQuery,但是我确实知道DOJO工具包确实使高度兼容的Javascript成为可能。
在这里看看示例:http://dojocampus.org/explorer/#Dojo_Query_Adding%20Events
该演示程序基于类将事件动态添加到纯html表中。
另一个例子是行为特征,在这里描述:http://dojocampus.org/content/2008/03/26/cleaning-your-markup-with-dojobehavior/
我建议我们使用称为"事件委托"的东西。这就是它的工作方式。
因此,如果我们要更新区域(例如div),并且想要毫不干扰地处理事件,则可以将事件处理程序添加到div本身。使用我们喜欢的任何框架来执行此操作。无论是否更新了div,事件附件都可以随时发生。
添加到此div的事件处理程序将接收事件对象作为其参数之一。然后,使用该事件对象,我们可以确定哪个元素触发了该事件。我们可以多次更新div:div的子级生成的事件将冒泡到div,我们可以在其中捕获和处理它们。
如果我们正在考虑将多个处理程序添加到div中的许多元素,那么这也将是巨大的性能优化。