我正在写一个小流星应用程序。表单中有一个文本区域,如下所示:

<form name="comments-form">
    <label for="textarea">Comment:</label><br>
    <textarea cols="40" rows="10" name="comment_textarea" class="comment_textarea">Write your comment here.</textarea><br>
    <button class="btn btn-success js-add-comment">add comment</button>
</form>


在我的client.js中,我有以下代码用于访问textarea的值:

EVENT_HANDLED = false;

Template.website_item_details.events({
    "click .js-add-comment": function(event) {
        var comment_text = event.target.comment_textarea.value;

        if(Meteor.user()) {
            Comments.insert({
                created_by: Meteor.user()._id,
                text: comment_text,
                website_id: this._id
            });
        }

        return EVENT_HANDLED;
    }
});


但是,当我单击按钮添加评论时,将获得以下控制台输出:

TypeError: event.target.comment_textarea is undefined
["click .js-add-comment"]()
 client.js:103
Template.prototype.events/eventMap2[k]</</<()
 blaze.js:3697
Template._withTemplateInstanceFunc()
 blaze.js:3671
Template.prototype.events/eventMap2[k]</<()
 blaze.js:3696
attached_eventMaps/</</</<()
 blaze.js:2557
Blaze._withCurrentView()
 blaze.js:2211
attached_eventMaps/</</<()
 blaze.js:2556
HandlerRec/this.delegatedHandler</<()
 blaze.js:833
jQuery.event.dispatch()
 jquery.js:4690
jQuery.event.add/elemData.handle()


这似乎是基本的表单处理,但是不知何故我无法将textarea中的文本转换为我的javascript代码中的变量。我已经尝试了多种访问它的方法:

document.getElementsByClass()[0].value
$('.comment_textarea').get(0).val()  // there should only be one such text area anyway
event.target.comment_textarea.value;


但是这些都不对我有用,我总是会遇到这个错误。几乎就像textarea不是我的html的一部分,或者Meteor中有一个bug,这使我无法访问textareas。

我还检查了是否还有其他名称为comment_textarea的东西,可以对我所有项目的客户端文件进行全文搜索,但是没有其他东西。

我只是盲目而忽略了什么吗?我如何获得该文本?

更重要的是,尽管我返回了false,但浏览器仍会重新加载页面。可能与之前发生的错误有关吗?

最佳答案

您正在使用按钮的click事件,并且在该事件上,textarea不可用。您需要将事件更改为submit form。首先,将ID放入表单中,将按钮更改为submit类型,然后将代码更改为

"submit #your-form-id": function(event) {
    event.preventDefault();
    var comment_text = event.target.comment_textarea.value;
    .....

}

09-13 10:10