javascript - CSS 不适用于第一次点击使用 jQuery.post 提交,然后不会在后续点击时更新

标签 javascript php jquery html css

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

我有一个网站,您可以在其中将故事 URL 提交到数据库。当您单击提交按钮时,设置了一个 jquery post 请求调用我的 php,然后返回一个 json 对象,里面有一个 bool 值来指示它是否成功。

然后根据 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 似乎卡住了,直到后续单击才激活。此外,如果我先发送有效数据,然后在第二次单击“有效”css 时触发。

但是,如果我随后发送了错误数据,“It works”css 会再次触发,然后“Error”数据会触发。在那之后,无论我做什么,它只会触发“错误”css,即使我可以在控制台日志中进行验证,chrome js 调试器也会进入“if(!data.success)” block 的其他条件,这意味着它应该触发 'applySubmitFeedback('btn-success3d');'但它仍然像错误一样触发。

感觉这里存在缓存问题,或者函数在 jquery 中无法正常工作,就像我认为的那样。请帮助我。

最佳答案

在我看来,您实际上并没有在第一次点击时添加任何类...只是添加了将在后续事件中添加类的点击事件。

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 值。

关于javascript - CSS 不适用于第一次点击使用 jQuery.post 提交,然后不会在后续点击时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28537598/

相关文章:

javascript - 下拉菜单选择的选项与其他字体不同

javascript - 如何将 PHP 数组作为 JSON 数组传递给 Javascript

jQuery Datepicker 验证类似于 onblur

php - imagepng : how to save the output in a variable and then display it using img tag

php - 如何在 URL 中获取一组未知的 $_GET 值?

javascript - 如何从 Blade 模板中的 Javascript 文件重定向 Laravel 路由

javascript - 低效的 jQuery 使用

javascript - JavaScript 中的 array.contains(array)

javascript - 断言错误: Target cannot be null or undefined

javascript - 输入意外结束(第 1 行)和未定义函数?