65.9K
CodeProject 正在变化。 阅读更多。
Home

jQuery 事件有助于编写干净的 JavaScript

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2012 年 3 月 7 日

CPOL

2分钟阅读

viewsIcon

13790

如何编写一些面向对象的 JavaScript。

正如标题所示,这篇博文是关于一些整洁的 JavaScript 代码示例。许多开发者不喜欢 JavaScript 是因为各种原因。我认为 JavaScript 是一种非常酷的语言。为了防止开发者不喜欢它,并鼓励他们展示 JavaScript 的强大之处,我们所有开发者都应该以一种整洁的方式编写 JavaScript。这样,更少的开发者会因此而感到沮丧,从而放弃使用它。

在这篇博文中,我将向您展示如何编写一些面向对象风格的 JavaScript,就像您在 C# 等语言中所知道的那样。我将使用 jQuery 来实现一些整洁的 JavaScript 代码。首先,我将解释我试图用这段代码实现的目标。我想创建两个模块,一个是包含用于发布一些产品的表单的 jQuery 对话框,另一个是显示产品的网格。对于第二个,您可以例如使用 jqGrid。我希望这两个模块能够完全独立地运行,同时又能相互通信。因此,我将使用 jQuery 事件机制。

所以首先,我将创建我的 JavaScript productDialog 模块。

var productDialog = function($){
    var self = null;
    var dialogForm = null;

    var init = function() {
        if (self === null) return;
        self = this;
        initDialog();
    };

    var initDialog = function() {
        dialogForm = $('#productDialogForm');
        dialogForm.dialog({
            autoOpen: false,
            height: 300,
            width: 350,
            buttons: {
                Create: function() {
                    var valid = true;
                    //Some form validation, left for brevity

                    if(valid) {
                        $.post('someserverurl', formData, postComplete, 'json');
                    }
                },
                Cancel: function() {
                    $(this).dialog('close');
                }
            },
            close: function() {
                //remove validation classes from form elements
                //left for brevity
            }
        });
        //Do some cool jquery stuff on your form to make it more interactive
        //Remove the original submit button because dialog contains one
    }

    var postComplete = function(data) {
        self.trigger('formPostComplete', data); //triggers event 
                         // with the response from the server
    };

    var show = function(modal) {
        if (modal) dialogForm.dialog({ modal: true; });
        else dialogForm.dialog({ modal: false; });
        dialogForm.dialog('open');
    };

    return {
        init: init,
        showModal: show(true),
        show: show
    };
}(jQuery);

其次,我需要初始化我的产品概览。

var productOverview = function($){
    var self = null;
    var grid = null;

    var init = function() {
        if (self === null) return;
        self = this;
        grid = $('#productsGrid');
        //init a jqGrid on some div id grid.jqGrid(....
        //or simply init some other things to 
        //show your products data by doing a $.get(....
        //left for brevity
    };

    var refreshData = function(data) {
        //simply call grid.reload() in case of jqGrid,
        //or update your products overview by using the data, 
        //(depends on what your server post returns)
        //or do a $.get request or something
    };

    return {
        init: init,
        refreshData: refreshData
    };
}(jQuery);

为了让它们在特定页面上相互通信,我实现了一个中介者,它将把一些逻辑链接在一起,用于特定页面。乍一看,这似乎有些过度设计,我猜您可能在想为什么不直接在页面本身进行处理。嗯,当您的模块有更多的事件和更多的逻辑需要链接时,这可能会发展成更大的代码。当页面上的模块数量增加时,您需要一个中心位置来链接所有逻辑。如果这能保持您的代码更整洁,您可以实现更多中介者。

var productMediator = function($) {
    var self = null;

    var init = function() {
        if (self === null) return;
        self = null;
        productDialog.init();

        productOverview.init();
        productDialog.bind('formPostComplete', productOverview.refreshData);

        $('#createNewProduct').click(productDialog.showModal); //binds buttonclick
    };

    return {
        init: init
    }
}(jQuery);

最后,您需要将这些脚本添加到您的页面中。

<!DOCTYPE html>
<html>
    <head>
        <title>Products</title>
        <!-- stylesheets jquery ui and ui dialog-->
        <!-- scripts jquery and jquery ui-->
        <script src="productDialog.js"></script>
        <script src="productOverview.js"></script>
        <script src="productMediator.js"></script>
        <script>
                        $(function() {
                productMediator.init();
                        });
        </script>
    </head>
    <body>
        <h1>Products<h1>
        <button id="createNewProduct">Create new product</button>
        <div id="productsGrid">
            <!-- Contains your products grid -->
        <div>
        <form id="productDialogForm">
            <label for="name">Name</label>
            <input id="name" name="name" />
            <label for="price">Price</label>
            <input id="price" name="price" />
            <label for="category">Category</label>
            <input id="category" name="category" />
            <button type="submit">Create</button>
        </form>
    </body>
</html>

结论

这段代码看起来并不令人沮丧,我希望对您来说也是如此。除了中介者之外,我在这里展示的模块可以彼此独立使用。您可以将它们与一些 MVC3 部分轻松组合,这些部分包括 HTML 例如。您可以控制在返回值中哪些方法是公开可见的。我希望我降低了您自己编写 JavaScript 应用程序的门槛。也许很快,您就会开始编写一些很酷的 Windows 8 JavaScript 应用程序

像往常一样,如果您喜欢这篇文章,请分享它!如果您不喜欢,也请分享它 :).

© . All rights reserved.