如何用动态内容生成实现不引人注目的JavaScript?

时间:2020-03-06 14:39:11  来源:igfitidea点击:

我编写了许多动态生成的内容(在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中的许多元素,那么这也将是巨大的性能优化。