Javascript $(文档).on';行不通

Javascript $(文档).on';行不通,javascript,jquery,Javascript,Jquery,我正在尝试重构我的旧JavaScript+jQuery代码。所以我将它们分成小块,以便于维护 在我以前的“过程”代码中,(document).on()方法对每个元素都有效。但现在它只对第一个元素起作用 Dnianas.Post = { init: function() { this.cache(); this.bindEvents(); }, cache: function() { this.postForm = $

我正在尝试重构我的旧JavaScript+jQuery代码。所以我将它们分成小块,以便于维护

在我以前的“过程”代码中,
(document).on()
方法对每个元素都有效。但现在它只对第一个元素起作用

Dnianas.Post = {



    init: function() {
        this.cache();
        this.bindEvents();
    },

    cache: function() {
        this.postForm = $('#postForm');
        this.likeButton = $('#likePost');
    },

    bindEvents: function() {
        $(document).on('submit', this.postForm, this.createPost);
    },

    createPost: function(event) {
        var request = $.ajax(
        {
            url: '/posts/create',
            data: $(this).serialize(),
            beforeSend: function() {
                $loading.show();
            },
            complete: function() {
                $loading.hide();
            }
        });

        request.done(function(data) {
            self.renderCreatedPost(data);
        });

        event.preventDefault();
    },
这是我向数据库发送文本的代码。当我发送请求时,没有数据会传递到服务器。没什么

这是我的旧代码,有效

$body.on('submit', '#postForm', function (event) {
    $.ajax({
        url: '/posts/create',
        type: 'POST',
        dataType: 'JSON',
        data: $(this).serialize(),
        beforeSend: function() {
            $loading.show();
        },
        complete: function() {
            $loading.hide();
        }
    })
    .done(function (data) {
        if (data.success == 'false') {
            // Render some error
        } else {
            // Post it
            }
        });

    event.preventDefault();
});
我不知道为什么,有人能解释一下吗


正如我在旧代码中所说,它工作得非常完美

我认为从来没有一个版本的jQuery支持您在新代码中所做的工作

您的代码正在调用
cache
,然后调用
bindEvents
。您在
缓存中有以下内容:

this.postForm = $('#postForm');
bindEvents
中:

$(document).on('submit', this.postForm, this.createPost);
这意味着您正在对
调用
,并向其传递事件名称、jQuery对象和函数

请看,
上没有允许jQuery对象作为第二个参数的签名

我看到您现在已经发布了旧代码,它在那里使用了选择器字符串,它确实通过事件委派工作:

$(document).on('submit', '#postForm', this.createPost);
如果您希望在不使用委托的情况下处理元素本身的提交,那么它当然是:

this.postForm.on('submit', this.createPost);

您必须发布一个完整的示例,包括如何调用这些函数。另外,如果有错误,请说明您在浏览器的错误控制台中看到的错误。我只是在页脚中调用
Dnianas.Post.init()
。一切都是自我解释的。我的控制台中没有任何错误。数据未传递,仅此而已。您可能需要a)删除此示例中与
文档没有直接关系的所有代码。在()
,b)发布调用此代码的代码,可能还有任何重要的HTML,以及c)查看
文档是否在(“提交”
没有捕捉到提交事件,或者一旦捕捉到事件就做了错误的事情。谢谢!我很困惑。