JSONP回调中的PreventDefault

时间:2012-01-06 17:17:27

标签: javascript jsonp

我想在jsonp的回调中使用事件的preventDefault方法。我必须使用纯JavaScript。我已经有一个模拟jsonp请求的函数。这是我正在做的事情:

var evt_temp = null;

function onContextMenu(event)
{    
    evt_temp = event;
    jsonp
    ({
        url: "someurl",
        params: "someparams",
        callback: "cb"
    });
}

function cb(response)
{
    if (something == true)
    {
        evt_temp.preventDefault();
        evt_temp = null;
    }
}

我的解决方案有效,但我觉得这不是一个好主意,将事件存储在var上。有人知道更好的方法吗?

3 个答案:

答案 0 :(得分:2)

它没有反对它,但在你的情况下它似乎有点无用。当您使用异步回调时,将在默认浏览器行为发生后调用preventDefault()。只有在事件的回调函数中直接使用它才有意义。

答案 1 :(得分:1)

function onContextMenu(event) {    
    evt_temp = event;
    good_jsonp({
        url: "someurl",
        params: "someparams",
        callback: function (response) {
            if (something === true) {
                event.preventDefault();
            }
        }
    });
}

var good_jsonp = (function () {
    var uuid = 0;
    return good_jsonp;

    function good_jsonp(obj) {
        var id = "good_jsonp" + ++uuid;
        window[id] = obj.callback;
        obj.callback = id;
        jsonp(obj);
    }
}());

答案 2 :(得分:0)

嗯,这就是我如何制作它,如果有人需要某一天:

var MyAPI =
{
    jsonp: function(args)
    {
        var script = document.createElement("script");
        var url = args.url + "?";
        var generatedFunction = "jsonpCallback" + Math.round(Math.random() * 1000001);

        window[generatedFunction] = function(response)
        {
            args.callback(eval("(" + response + ")"));
            delete window[generatedFunction];
            document.body.removeChild(document.getElementById(generatedFunction));
        };

        if (args.params)
        {
            url += "_r={";

            for (var prop in args.params)
            {
                url += "\"" + prop + "\":\"" + args.params[prop] + "\",";
            }

            url = url.substr(0, url.length - 1);
            url += "}&"
        }

        url += "_cb=" + generatedFunction;

        script.src = url;
        script.type = "text/javascript";
        script.id = generatedFunction;

        document.body.appendChild(script);
    }
};

致电:

MyAPI.jsonp
({
    url: "someurl",
    params: { param1: "param1", param2: "param2" },
    callback: function(response)
    {
        alert(response);
    }
});