CSS在第一次点击jQuery.post提交时没有应用,然后在随后的点击中没有更新


CSS not applying on first click of submit with jQuery.post and then not updating on subsequent clicks

我在这里不知所措,伙计们,我需要你们的帮助。

我有一个网站,你可以在那里提交故事网址到数据库。当你点击提交按钮时,一个jquery post请求被设置为调用我的php,然后返回一个json对象,里面有一个布尔值来指示它是否成功。

然后,根据php的成功,提交按钮使用一些花哨的css转换来向用户指示提交的状态。

我会做一个jfiddle给你们看,但我不知道如何模拟php发送回请求,因为这个网站只在我的本地机器上。

这是jquery:

function applySubmitFeedback(activatedClass) {
    $('#submit').click(function() {
        var self = this;
        $(this).addClass(activatedClass);
        setTimeout(function() {
            $(self).removeClass(activatedClass);
        }, 1000);
    });
}
$(document).ready(function() {
    $('form').submit(function(event) {
        event.preventDefault();
        var $form = $(this), 
            term = $form.find("input[name='url']").val(),
            url = $form.attr("action");
        $.post( url, { story_url:term }, function(data) {
            if (!data.success) {
                console.log("failed");
                if (typeof data.message == 'json' && data.message.hasOwnProperty("url"))
                    console.log(data.message.url);
                else
                    console.log(data.message)
                applySubmitFeedback('btn-error3d');
            else {
                console.log("success");
                applySubmitFeedback('btn-success3d');
            }
            console.log(data);
        }, "json");
    });
});

这是一个奇特的css:

.btn-8g {
    background: #fff;
    color: #999;
}
.btn-8g:active {
    background: #fff;
}
.btn-8g:after,
.btn-8g:before {
    text-transform: uppercase;
    width: 100%;
    height: 100%;
    position: absolute;
    left: 0;
    line-height: 70px;
}
.btn-8g:after {
    top: -98%; /* should be -100% but there's a gap in Chrome Version 34.0.1847.131 */
    background: #7aca7c;
    color: #358337;
    content: 'It worked!';
    -webkit-transform-origin: 0% 100%;
    -webkit-transform: rotateX(90deg);
    -moz-transform-origin: 0% 100%;
    -moz-transform: rotateX(90deg);
    -ms-transform-origin: 0% 100%;
    -ms-transform: rotateX(90deg);
    transform-origin: 0% 100%;
    transform: rotateX(90deg);
}
.btn-8g:before {
    top: 100%;
    background: #e96a6a;
    color: #a33a3a;
    content: 'Error!';
    font-weight: 700;
    font-family: 'Lato', Calibri, Arial, sans-serif;
    -webkit-transform-origin: 0% 0%;
    -webkit-transform: rotateX(-90deg);
    -moz-transform-origin: 0% 0%;
    -moz-transform: rotateX(-90deg);
    -ms-transform-origin: 0% 0%;
    -ms-transform: rotateX(-90deg);
    transform-origin: 0% 0%;
    transform: rotateX(-90deg);
}
.btn-8g.btn-success3d {
    background: #aaa;
    -webkit-transform-origin: 50% 100%;
    -webkit-transform: rotateX(-90deg) translateY(100%);
    -moz-transform-origin: 50% 100%;
    -moz-transform: rotateX(-90deg) translateY(100%);
    -ms-transform-origin: 50% 100%;
    -ms-transform: rotateX(-90deg) translateY(100%);
    transform-origin: 50% 100%;
    transform: rotateX(-90deg) translateY(100%);
}
.btn-8g.btn-error3d  {
    background: #aaa;
    -webkit-transform-origin: 50% 0%;
    -webkit-transform: rotateX(90deg) translateY(-100%);
    -moz-transform-origin: 50% 0%;
    -moz-transform: rotateX(90deg) translateY(-100%);
    -ms-transform-origin: 50% 0%;
    -ms-transform: rotateX(90deg) translateY(-100%);
    transform-origin: 50% 0%;
    transform: rotateX(90deg) translateY(-100%);
}

我的问题是,当我第一次点击提交按钮时,css似乎被卡住了,直到随后的点击才激活。此外,如果我先发送有效数据,然后在第二次单击"It works"css激发。

然而,如果我发送了错误的数据,"It works"css会再次触发,然后"Error"数据会触发。之后,无论我做什么,它都只会触发"Error"css,即使我可以在控制台日志中验证它是否进入了"if(!data.success)"块的else条件,这意味着它应该触发"applySubmitFeedback('btn-success3d');"但它仍然像一个错误一样开火。

感觉这里有一个缓存问题,或者函数在jquery中不能像我想象的那样工作。请帮帮我。

在我看来,您实际上并没有在第一次单击时添加任何类。。。只需添加click事件,即可在后续事件中添加类。

function applySubmitFeedback(activatedClass) {
    $('#submit').click(function() { // <--- this click event isn't bound until you click submit at least once
        var self = this;
        $(this).addClass(activatedClass); 
        setTimeout(function() {
            $(self).removeClass(activatedClass);
        }, 1000);
    });
}

我认为问题是:在$.post()完成之前,您从哪里获得"activatedClass"变量?当你完成ajax时,你的脚本告诉按钮在下一次有人点击它时执行特定的功能。只有运行ajax,你才能知道激活的类。解决方案可能是(1)从单击事件中删除activatedClass参数,或者(2)创建默认的activatedClass值。