Tengo la siguiente función de JavaScript que se utiliza para evitar que los usuarios inunden nuestro servidor con solicitudes de Ajax:

var validateZip = function () {

    var lastSuccessful = parseInt(jQuery('#mailingZip').val(), 10);

    return {
        validate: function(zip) {
            var is5DigitNumber = /^\d{5}$/;
            if (is5DigitNumber.test(zip) && lastSuccessful !== zip) {
                lastSuccessful = zip;
                return true;
            } else {
                return false;
            }
        }
}();

Esta página se vuelve a cargar si los usuarios ingresan un código postal incorrecto u otros errores aparecen en el formulario. Sin embargo, dado que el dom no se ha cargado todavía, siempre saco NaN de ese campo.

Colocarlo en el documento listo para jQuery significa que no puedo llamar a la función directamente.

¿Cómo puedo modificar mi alcance de modo que lastSuccessful permanezca "privado" y obtenga el valor una vez que el dom esté listo?

0
Scott 13 nov. 2009 a las 18:52

3 respuestas

La mejor respuesta

No sé por qué no pensé / hice esto antes. Creé un getter / setter en mi función de devolución, luego en el documento listo simplemente llamé al setter con ese valor.

Var validateZip = function () {

// Track the last sent in zip code -- treat this as private data
var lastSuccessful = "";

return {
    validate : function(zip) {
        var is5DigitNumber = /^\d{5}$/;
        if (is5DigitNumber.test(zip) && lastSuccessful !== zip) {
            lastSuccessful = zip;
            return true;
        } else {
            return false;
        }
    },

    setLastSuccessful : function(zip) {
        lastSuccessful = zip;
    },

    getLastSuccessful : function() {
        return lastSuccessful;
    }
}

} ();

JQuery (documento) .ready (function () {validateZip.setLastSuccessful (jQuery ('# mailingZip'). val ());});

0
Scott 16 nov. 2009 a las 14:03

¿Por qué no puedes llamarlo en evento listo? Por supuesto que puede incluirlo en otra función:

$(functon(){

    var validateZip = function () {

        var lastSuccessful = parseInt(jQuery('#mailingZip').val(), 10);

        return {
            validate: function(zip) {
                var is5DigitNumber = /^\d{5}$/;
                if (is5DigitNumber.test(zip) && lastSuccessful !== zip) {
                    lastSuccessful = zip;
                    return true;
                } else {
                    return false;
                }
            }
    }();

});

La pregunta es si necesita mantener la función validateZip como se define globalmente. Si solo lo ejecuta en este punto, simplemente omita su declaración y simplemente escriba:

$(functon(){

    (function () {

        var lastSuccessful = parseInt(jQuery('#mailingZip').val(), 10);

        return {
            validate: function(zip) {
                var is5DigitNumber = /^\d{5}$/;
                if (is5DigitNumber.test(zip) && lastSuccessful !== zip) {
                    lastSuccessful = zip;
                    return true;
                } else {
                    return false;
                }
            }
    })();

});
0
Robert Koritnik 13 nov. 2009 a las 16:05
function validateZip() { // use function declaration, not function expression

    var lastSuccessful = parseInt(jQuery('#mailingZip').val(), 10);

    return {
        validate: function(zip) {
            var is5DigitNumber = /^\d{5}$/;
            if (is5DigitNumber.test(zip) && lastSuccessful !== zip) {
                lastSuccessful = zip;
                return true;
            } else {
                return false;
            }
        }
}; // removed premature invocation of function

jQuery(validateZip); // call it on document ready instead
1
NickFitz 13 nov. 2009 a las 16:03