2

我有大约 30 个网页,都是 HTML 表单。每个页面都有两个或多个不同的表单元素 - 选择、输入文本、复选框、文本区域 - 以及各种 ui 元素、弹出窗口、表单验证等。我正在尝试重构页面中使用的 jquery 以使用 DRY 原则但是我不知道该怎么做。这里有一些使用的 jquery 示例:

示例代码块 A:

    $(".show-tool", _container).mouseover(function() {
        $(this).nextAll(":hidden").css('display','block');
    });

示例代码块 B:

$(".optional").blur(function(){
    if ($(this).val() == '') 
    { 
        $(this).addClass('optional'); 
        $(this).val('(Optional)');
    }
});

示例代码块 C:

$('.howtoremain').click(function() {
    $('.hiddendiv').slideToggle("10000");
    if($(this).hasClass('howtoremain')) {
        $(this).removeClass('howtoremain').addClass('howtoremain2');
    }
    else {
        $(this).removeClass('howtoremain2').addClass('howtoremain');
    }
});

所有这些都包含在 document.ready 中。上面的实际代码列表并不那么相关。我试图让每个 HTML 页面只包含相关的 jquery 代码。例如,第 1 页可能使用代码块 A 和 B。第 2 页可能使用 A、B、C、D、E 和 F。第 3 页可能使用代码块 C 和 G。而不是拥有一个巨大的文档。准备好每个代码块(如果一个代码块需要与同一表单元素的另一个代码块略有不同,这可能会在某些时候导致错误),你如何编码?每个代码块有一个 javascript 文件似乎也很糟糕,因为它会导致每页对服务器进行多次点击。我想我正在尝试获取一个大的 javascript 文件,但只在 document.ready 中初始化与每个页面相关的那些函数。

4

1 回答 1

1

在我的项目中,我已经开始使用每个模块的多个 JS 文件,并将它们连接到构建过程中的闭包中。这类似于 jQuery 在其构建过程中所做的(参见intro.jsoutro.js

这样,我可以在较小的文件中使用细粒度的 DRY 模块,然后将它们连接起来。对于示例 B,典型的单个模块文件可能如下所示:

( function($) {
    var subjects = $('.optional');
    if ( subjects.length === 0 ) {
        // this is a knockout criteria for this module, thus exit this enclosed function
        return;
    }

    subjects.blur(function(){
        if ($(this).val() == '') 
        { 
            $(this).addClass('optional'); 
            $(this).val('(Optional)');
        }
    });

    // now use whatever you need to initialise.
})($);

正如你所看到的,我使用外部函数不仅是为了保持我的范围干净,而且更重要的是,一旦我意识到能够取消模块的初始化,当前页面/事件/..不需要它。 . - 当然,您可能会找到几种更有效的方法来确定每个模块是否应自行初始化。

在某些项目中,我有一个构建脚本来在另一个闭包中连接这些模块,它可能看起来像这样:

( function( window ) {
    var $ = window.jQuery; //call me paranoid, but I like my vars clean
    $(document).ready( function() {
        // stuff the modules here, one after another, in any sensible order.
    });
}(window);

在其他项目中,我可以将$(document).ready()-Bit 移动到需要 document.ready 的模块中,并在其他项目中收听其他初始化事件,这对我来说感觉有点干净。

但无论如何 - 拥有

  • 一个构建过程,而不是大量的单个请求
  • 几个小的“一件事” - 进入构建的文件
  • 由于我改编自 jQuery 本身的 intro/outro-Concatenation-Style 导致的自我强制“顶级 lambda 函数”

显着改善了我的 DRY-ness 甚至我的 JS 代码风格。

于 2013-09-02T20:59:45.567 回答