在计时器之间传递对象并发布ajax请求(匿名函数)

时间:2016-11-29 20:16:28

标签: javascript ajax post settimeout anonymous-function

我已经在这个话题上挣扎了很长一段时间而且它只是不会点击!

我需要将对象传递给&.post(WordPress处理的AJAX)请求,但我无法弄清楚如何使用常规变量正确地执行此操作;相反,我被迫调用$(文档)并迭代它的DOM元素(非常丑陋和缓慢)。

如何更正此代码,以便我能够将标题变量一直传递到帖子数据,而不是使用$(document).find('#sections_title').val() request

请解释如何正确地做到这一点。

(function ($) {
    var title = $('#sections_title');
    var timeout = 2000;

    var delay = (function () {
        var timer = 0;

        return function (callback, ms) {
            clearTimeout(timer);
            timer = setTimeout(callback, ms);
        };
    })();

    title.keyup(function () {

        // i would like to have variable here, that grabs the $(this).val()
        // and use this variable to pass to the data
        // var value = .......

        delay(function () {
            $.post(
                ajaxurl,
                {
                    'action': 'add_foobar',
                    'data': $(document).find('#sections_title').val()
                    // instead I would like:
                    // 'data': value
                },
                function(response){
                    alert('The server responded: ' + response);
                }
            );

        }, timeout);
    })();
})(jQuery);

2 个答案:

答案 0 :(得分:1)

您可以在window object上明确设置。在浏览器中,全局对象与窗口对象相同,但node.js等特定环境除外。

(function($) {
    window.title = $('#sections_title');
    var timeout = 2000;

    var delay = (function() {
        var timer = 0;

        return function(callback, ms) {
            clearTimeout(timer);
            timer = setTimeout(callback, ms);
        };
    })();

    title.keyup(function() {    
        delay(function() {
            $.post(
                ajaxurl, {
                    'action': 'add_foobar',
                    'data':  window.title
                },
                function(response) {
                    alert('The server responded: ' + response);
                }
            );

        }, timeout);
    })();
})(jQuery);

答案 1 :(得分:1)

对于您的情况,这应该是最简单的方法。 绑定val作为回调对象。然后在需要使用时将其强制转换为字符串。

    delay(function () {
        $.post(
            ajaxurl,
            {
                'action': 'add_foobar',
                'data': String(this)
                // instead I would like:
                // 'data': value
            },
            function(response){
                alert('The server responded: ' + response);
            }
        );

    }.bind(Object($(this).val())), timeout);

或者这是完整的代码

(function ($) {
    var title = $('#sections_title');
    var timeout = 2000;

    var delay = (function () {
        var timer = 0;

        return function (callback, ms) {
            clearTimeout(timer);
            timer = setTimeout(callback, ms);
        };
    })();

    title.keyup(function () {

        // i would like to have variable here, that grabs the $(this).val()
        // and use this variable to pass to the data
        // var value = .......

        delay(function () {
            $.post(
                ajaxurl,
                {
                    'action': 'add_foobar',
                    'data': String(this)
                    // instead I would like:
                    // 'data': value
                },
                function(response){
                    alert('The server responded: ' + response);
                }
            );

        }.bind(Object($(this).val())), timeout);
    })();
})(jQuery);