首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将数据发布到JsonP

将数据发布到JsonP
EN

Stack Overflow用户
提问于 2010-04-23 22:20:47
回答 3查看 96.1K关注 0票数 103

是否可以将数据发布到JsonP?或者所有数据都必须作为GET请求传递到querystring中?

我有很多数据需要发送到服务,跨域,而这些数据太大了,无法通过querystring发送

解决这个问题的选择是什么?

EN

回答 3

Stack Overflow用户

发布于 2014-06-05 17:39:51

我知道这是一种严肃的巫术,但我想我应该使用jQuery发布我的JSONP post实现,我正在成功地将它用于我的JS小部件(它用于客户注册和登录):

基本上,我使用的是IFrame方法,正如公认的答案所建议的那样。我所做的不同之处是,在发送请求之后,我会使用计时器观察表单是否可以在iframe中到达。当无法访问表单时,这意味着请求已返回。然后,我使用一个普通的JSONP请求来查询操作的状态。

我希望有人发现它是有用的。在>=IE8,Chrome,FireFox和Safari上测试过。

function JSONPPostForm(form, postUrl, queryStatusUrl, queryStatusSuccessFunc, queryStatusData)
{
    var tmpDiv = $('<div style="display: none;"></div>');
    form.parent().append(tmpDiv);
    var clonedForm = cloneForm(form);
    var iframe = createIFrameWithContent(tmpDiv, clonedForm);

    if (postUrl)
        clonedForm.attr('action', postUrl);

    var postToken = 'JSONPPOST_' + (new Date).getTime();
    clonedForm.attr('id', postToken);
    clonedForm.append('<input name="JSONPPOSTToken" value="'+postToken+'">');
    clonedForm.attr('id', postToken );
    clonedForm.submit();

    var timerId;
    var watchIFrameRedirectHelper = function()
    {
        if (watchIFrameRedirect(iframe, postToken ))
        {
            clearInterval(timerId);
            tmpDiv.remove();
            $.ajax({
                url:  queryStatusUrl,
                data: queryStatusData,
                dataType: "jsonp",
                type: "GET",
                success: queryStatusSuccessFunc
            });
        }
    }

    if (queryStatusUrl && queryStatusSuccessFunc)
        timerId = setInterval(watchIFrameRedirectHelper, 200);
}

function createIFrameWithContent(parent, content)
{
    var iframe = $('<iframe></iframe>');
    parent.append(iframe);

    if (!iframe.contents().find('body').length)
    {
        //For certain IE versions that do not create document content...
        var doc = iframe.contents().get()[0];
        doc.open();
        doc.close();
    }

    iframe.contents().find('body').append(content);
    return iframe;
}

function watchIFrameRedirect(iframe, formId)
{
    try
    {
        if (iframe.contents().find('form[id="' + formId + '"]').length)
            return false;
        else
            return true;
    }
    catch (err)
    {
        return true;
    }
    return false;
}

//This one clones only form, without other HTML markup
function cloneForm(form)
{
    var clonedForm = $('<form></form>');
    //Copy form attributes
    $.each(form.get()[0].attributes, function(i, attr)
    {
        clonedForm.attr(attr.name, attr.value);
    });
    form.find('input, select, textarea').each(function()
    {
        clonedForm.append($(this).clone());
    });

    return clonedForm;
}
票数 7
EN

Stack Overflow用户

发布于 2010-04-23 22:23:44

一般来说,JSONP是通过向调用文档添加一个<script>标记来实现的,这样JSONP服务的URL就是"src“。浏览器使用HTTP GET事务获取脚本源。

现在,如果您的JSONP服务与您的调用页面在同一个域中,那么您可能可以通过一个简单的$.ajax()调用来拼凑一些东西。如果它不在同一个域中,那么我不确定它是如何实现的。

票数 4
EN

Stack Overflow用户

发布于 2012-06-02 11:43:17

这是可能的,这是我的解决方案:

在你的javascript中:

jQuery.post("url.php",data).complete(function(data) {
    eval(data.responseText.trim()); 
});
function handleRequest(data){
    ....
}

在您的url.php中:

echo "handleRequest(".$responseData.")";
票数 -6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2699277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档