1

フォーム検証関数を作成しており、次のコードがあります

(function ( $ ) {
    $.fn.validate_thing = function (success_call_back) {
        var call_back = true;
        debugger;
        if (!this.is('form')) {
            return false;
        }

        $('input.empty').each(function() {
            if(!$(this).text()) {
                alert($(this).attr('name'));
                call_back = false;
            }
        });
    }
})(jQuery);

問題は、ページが読み込まれると、(jQuery) 行に「オブジェクトは関数ではありません」という JavaScript エラーが表示されることです。デバッガーでこれを実行すると、この問題は発生しません。これをドキュメント対応関数に入れた場合、この問題は発生しません。このスクリプトの実行でjQueryがロードされていないことと何か関係があるのではないかと考えていますが、クロージャーでこれを行わない場合は言うまでもなく、このコードを含むライブラリの前にjQueryライブラリを含めます。つまり、これを行う

$.fn.validate_thing = function (success_call_back) {
    var call_back = true;
    debugger;
    if (!this.is('form')) {
        return false;
    }

    $('input.empty').each(function() {
        if(!$(this).text()) {
            alert($(this).attr('name'));
            call_back = false;
        }
    });
}

できます。

したがって、この問題にはいくつかの回避策がありますが、なぜこれが起こっているのか知りたいです。前もって感謝します。

これは、JavaScriptページの前にあるものです

engine = new function() {
this.request = function ( params ) {
    var data = params.data ? params.data : '';

    if (params.url) {
        var url = params.url;
        var page = document.URL.split('/').pop();
        var page = page.split('.')[0];
        data += 'content_page='+page+'.tpl';
    }
    else {
        var url = document.URL;
    }

    debugger;
    if (params.action) {
        data += data ? '&action='+params.action : "action="+params.action;
    }

    $.ajax({
        url : url,
        type : 'POST',
        data : data,
        dataType: 'json',
        success : function(data) {
            debugger;
            if (data && data.partials) {
                for (var key in data.partials) {
                    var element = data.partials[key];
                    $('#'+element.partial_name).replaceWith(element.partial_content);
                }
            }
        },
        error : function (jqXHR, textStatus, errorThrown) {
            debugger;

            alert('ajax error: '+errorThrown);
        }
    }).success(params.success);
}
}
4

1 に答える 1

0

最後の行でエラーが発生した場合、JavaScriptは括弧( function() { ... } )をコードの前にあるものの関数呼び出しとして解釈する可能性があります。これは、前の行のセミコロンを忘れた場合に発生する可能性があります。

このことを考慮:

var foo = {};
var bar = foo
(function() {

}());

後にセミコロンがないfooため、JavaScriptはコードをとして解釈しfoo(...)、エラーをスローすることに注意してください

オブジェクトは関数ではありません

于 2012-07-24T09:10:12.237 に答える