$ .post()有时需要2个提交才能发送数据

时间:2015-05-26 15:25:57

标签: javascript jquery forms

我已经研究了几天,但未能找到解决方法。问题在于:

我有一个表单,提交要处理/插入数据库的消息。表单使用$ .post()来提交消息。

有时它工作正常,但偶尔(完全随机,似乎) - 我将不得不按两次提交按钮以获取数据。我第一次按下提交按钮,它出现了#34;提交,因为表格像正常一样清除等 - 但数据没有发送。如果我再次单击提交按钮(不在输入中输入任何内容),它将发送我尝试提交一次的消息。我希望这是有道理的。

换句话说,大部分时间我都可以输入信息,点击提交1次,就可以了。但随机我将不得不点击提交多次以获取实际提交的数据。

有时,"故障"将连续发生一次以上。当发生这种情况时,我必须反复点击提交,直到所有消息都已发送。它几乎就像他们以某种方式排队?

以下是我用来提交数据的功能:

function postMsg() {
    $.post("index.php", {
        message: $("[name='message']").val()
    });
    document.m.message.focus();
    return false;
}

表格标签我使用:

<form class="form-inline"  id="m"  name="m" method="post" onSubmit="postMsg();clear_form();return false">

如果由于某种原因需要它,我使用的clear_form()函数:

function clear_form() {
    document.getElementById('message').value = '';
}

如果有人能帮助我指出正确的方向,那将是非常感激的。

更新以包含Crone提供的功能 - 它可以工作,但仍然存在需要在数据通过之前多次提交的问题:

    jQuery("#m").submit(function(e) {

e.preventDefault();

jQuery.post("index.php", {
    message: jQuery("[name='message']").val()
});

document.m.message.focus();

clear_form();
});

更新 - 添加了用于在显示中加载消息的功能。这称为onLoad,当提交新消息时,它将抓取并显示新数据。

function loadMainDisplay(){
    $( "#innercontrols" ).load( "includes/controls.php" );
scrollToBottom();
}

&#34; controls.php&#34;只是一个文件,它抓取来自mysql数据库的消息并以正确的格式回显它们。

在我的index.php(函数/表单所在的位置)的顶部,我检查是否已使用Input类提交任何输入,它看起来像这样:

if(Input::exists()){
    $message = Input::get('message');
... validate and insert into db if ok
}

如果您希望链接到实际页面以查看问题,请告诉我,我将发送包含该链接的私人消息。

1 个答案:

答案 0 :(得分:2)

jQuery("form").on('submit', function(e) {

e.preventDefault();

jQuery.post("index.php", {
    message: jQuery("[name='message']").val()
});

document.m.message.focus();

clear_form();
});

带“Enter”按钮支持的版本:

(CGSize)sizeForText:(NSAttributedString *)string maxWidth:(CGFloat)width
{
    CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedString((__bridge CFAttributedStringRef)string);

    CFIndex offset = 0, length;
    CGFloat y = 0, lineHeight;
    do {
        length = CTTypesetterSuggestLineBreak(typesetter, offset, width);
        CTLineRef line = CTTypesetterCreateLine(typesetter, CFRangeMake(offset, length));

        CGFloat ascent, descent, leading;
        CTLineGetTypographicBounds(line, &ascent, &descent, &leading);

        CFRelease(line);

        offset += length;

        ascent = roundf(ascent);
        descent = roundf(descent);
        leading = roundf(leading);

        lineHeight = ascent + descent + leading;
        lineHeight = lineHeight + ((leading > 0) ? 0 : roundf(0.2*lineHeight)); //add 20% space

        y += lineHeight;

    } while (offset < [string length]);

    CFRelease(typesetter);

    return CGSizeMake(width, y);
}