jQuery and “Organized Code”

后端 未结 8 1775
星月不相逢
星月不相逢 2020-12-12 11:52

I\'ve been struggling lately with understanding the best way to organize jQuery code. I asked another question earlier and I don\'t think I was specific enough (found in thi

相关标签:
8条回答
  • 2020-12-12 12:07

    Somebody wrote a post on the similar topic.

    jQuery Code Does not have to be Ugly

    For instance, the author, Steve Wellens, suggests to not use anonymous functions, as it makes code harder to read. Instead, push the function reference into the jQuery methods, like so:

    $(document).ready(DocReady);
    
    function DocReady()
    {       
        AssignClickToToggleButtons();
        ColorCodeTextBoxes();
    }
    

    Another takeaway from the article is to assign a jQuery object to a concrete variable, which makes the code look cleaner, less dependent on the actual jQuery object, and easier to tell what a certain line of code is doing:

    function ColorCodeTextBoxes()
    {
        var TextBoxes = $(":text.DataEntry");
    
        TextBoxes.each(function()
        {
            if (this.value == "")
                this.style.backgroundColor = "yellow";
            else
                this.style.backgroundColor = "White";
        });
    }
    
    0 讨论(0)
  • 2020-12-12 12:08

    Well, for one, having a good IDE that understands javascript can help tremendously, even if just to identify matching demarcations (braces, parens, etc).

    If your code starts to really get that complex, consider making your own static object to organize the mess - you don't have to work so hard to keep everything anonymous.

    var aCustomObject = {
        container: $("#inputContainer"),
        initialize: function()
        {
            for(var i=0; i < 5; i++)
            {
                $("<input/>").changed( aCustomObject.changeHandler );
            }
        },
        changeHandler: function( event )
        {
            $.ajax( {success: aCustomObject.ajaxSuccessHandler} );
        },
        ajaxSuccessHandler: function( data )
        {
            $.each( aCustomObject.container.children(), aCustomObject.updateBindings )
        },
        updateBindings: function( j, w )
        {
            $(w).unbind().changed( function(){} );
        }
    }
    aCustomObject.initialize();
    
    0 讨论(0)
  • 2020-12-12 12:11

    In my opinion the method described by BaileyP is what I use to start off with then I normally abstract everything into more re-usable chunks, especially when some functionality expands to the point where it's easier to abstract it into a plugin then have it specific to one site.

    As long as you keep the large blocks of code in a seperate file and coded nicely you can then end up with some really clean syntax.

    // Page specific code
    jQuery(function() {
        for(var i = 0; i < 5; i++) {
             $("<input/>").bindWithServer("#inputContainer");
        }
    });
    
    // Nicely abstracted code
    jQuery.fn.bindWithServer = function(container) {
         this.change(function() {
                 jQuery.ajax({
                     url: 'http://example.com/',
                     success: function() { jQuery(container).unbindChildren(); }
                 });
         });
    }
    jQuery.fn.unbindChildren = function() {
        this.children().each(function() {
            jQuery(this).unbind().change(function() {});
        });
    }
    
    0 讨论(0)
  • 2020-12-12 12:19

    Stick some of the anon functions into global scope functions (or your own "namespace" object), especially the re-used functions, and it begins to look less like what you posted. Kind of like what you linked to.

    0 讨论(0)
  • 2020-12-12 12:25

    So far, I do it like this:

    // initial description of this code block
    $(function() {        
        var container = $("#inputContainer");
    
        for(var i=0; i < 5; i++) {
            $("<input/>").changed(inputChanged).appendTo(container);
        }; 
    
        function inputChanged() {
            $.ajax({
                success: inputChanged_onSuccess
            });
         } 
    
         function inputChanged_onSuccess(data) {
            $.each(container.children(), function(j,w) {
              $(w).unbind().changed(function() {
                 //replace the insanity with another refactored function
              });
            });
          }
    });
    

    In JavaScript, functions are first-class objects and can thus be used as variables.

    0 讨论(0)
  • 2020-12-12 12:25

    I described my approach in your other post. Short form:

    • do not mix javascript and HTML
    • use classes (basically start to see your application as a collection of widgets)
    • only have a single $(document).ready(...) block
    • send jQuery instances into your classes (instead of using plugins)
    0 讨论(0)
提交回复
热议问题