Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 如何进行同步JSONP跨域调用_Jquery_Cross Domain - Fatal编程技术网

Jquery 如何进行同步JSONP跨域调用

Jquery 如何进行同步JSONP跨域调用,jquery,cross-domain,Jquery,Cross Domain,我被同步跨域调用卡住了 之前在我的应用程序中,我们进行了域调用,所以没有问题 我之前调用的javascript代码如下所示: function EKXMLProvider(oDropdown, sDefault, sXML, sFilterUrl, fireRequestOnce) { var oXMLHTTP, i, length, oData, sValue, sDisplay, sName, sMatch, oRegExp; if (!oDropdown)

我被同步跨域调用卡住了

之前在我的应用程序中,我们进行了域调用,所以没有问题

我之前调用的javascript代码如下所示:

function EKXMLProvider(oDropdown, sDefault, sXML, sFilterUrl, fireRequestOnce)
{
    var oXMLHTTP, i, length, oData, sValue, sDisplay, sName, sMatch, oRegExp;

    if (!oDropdown)
        return;

    // XMLHTTP Object to retrieve the xml document
    oXMLHTTP = this.createXMLHttpRequest();
    this.FilterUrl = sFilterUrl;
    if (sFilterUrl != previousFilterUrl){
        oXMLHTTP.open("GET", sFilterUrl, false);
        oXMLHTTP.send(null);
        sFilterData = oXMLHTTP.responseText
        previousFilterUrl = sFilterUrl;
    }
    if(!fireRequestOnce ||(fireRequestOnce && retrievedData == null))
    {
        this.documentUrl = sXML;
        oXMLHTTP.open("GET", this.documentUrl, false);
        oXMLHTTP.send(null);

        oData = oXMLHTTP.responseXML.documentElement.childNodes;

        if(fireRequestOnce)
            retrievedData = oData;
    }
    else if(retrievedData != null)
    {
        oData = retrievedData;
    }
    this.suggestData = new Array();

    // Filter out all 2 and 3 letter codes (airport, city, country)
    oRegExp = new RegExp("\\s+\\(\\w{2,3}\\)", "gi");
    var iCount = 0    
    for (i = 0, length = oData.length; i < length; i++)
    {
        sValue = oData[i].attributes.getNamedItem("v").value;
        sDisplay = oData[i].attributes.getNamedItem("d").value;
        sName = oData[i].attributes.getNamedItem("n").value;
        //sMatch = oData[i].attributes.getNamedItem("m").value;
        sMatch = oData[i].attributes.getNamedItem("e").value;

        if (sFilterData.search(sValue) != -1){
            this.suggestData[iCount] = new EKSuggestData(sName + " (" + sValue + ")", sDisplay, sValue, sMatch, sMatch.replace(oRegExp, ""));
            iCount++;
        }
    }

    // Call the inherited class
    EKSuggestProvider.call(this, oDropdown, sDefault);
}
function EKXMLProvider(oDropdown, sDefault, sXML, sFilterUrl, fireRequestOnce)
{
    var oXMLHTTP, i, length, oData, sValue, sDisplay, sName, sMatch, oRegExp;
    var qr = "&jsonpcall=true";
    if (!oDropdown)
        return;

    // XMLHTTP Object to retrieve the xml document
    oXMLHTTP = this.createXMLHttpRequest();

    this.FilterUrl = sFilterUrl;

    if (sFilterUrl != previousFilterUrl){
    //alert(sFilterUrl);
        //oXMLHTTP.open("GET", sFilterUrl, false);
        //oXMLHTTP.send(null);
        //sFilterData = oXMLHTTP.responseText

        // queue up an ajax request
        $.ajax({
        url: sFilterUrl + qr,
        type: "GET",
        cache: true,
        async:false,
        contentType: "application/javascript; charset=utf-8",
        dataType: "jsonp",
        jsonpCallback: "airport", 
        success: function(data, textStatus, jqXHR) 
        {               
            if (data.airport[0] != '')
            {
                    sFilterData = data.airport[0];
            } 
        }
        });

        previousFilterUrl = sFilterUrl;        
    }

    if(!fireRequestOnce ||(fireRequestOnce && retrievedData == null))
    {
        //alert(sXML);
        this.documentUrl = sXML;
        //oXMLHTTP.open("GET", this.documentUrl, false);
        //oXMLHTTP.send(null);

        // queue up an ajax request
          $.ajax({
            url: sXML + qr,
            type: "GET",
            async:false,
            cache: true,
            contentType: "application/javascript; charset=utf-8",
            dataType: "jsonp",
            jsonpCallback: "airportxml", 
            success: function(data, textStatus, jqXHR) 
            {                 
                  var xmlDoc = $.parseXML(data.myresult);
                oData = xmlDoc.documentElement.childNodes; 
                alert(oData);
            }
            });

        //oData = oXMLHTTP.responseXML.documentElement.childNodes;

         if(fireRequestOnce)
             retrievedData = oData;
    }
    else if(retrievedData != null)
    {
        oData = retrievedData;
    }
    this.suggestData = new Array();

      // Filter out all 2 and 3 letter codes (airport, city, country)
      oRegExp = new RegExp("\\s+\\(\\w{2,3}\\)", "gi");
      var iCount = 0    
    for (i = 0, length = oData.length; i < length; i++)
    {
        sValue = oData[i].attributes.getNamedItem("v").value;
        sDisplay = oData[i].attributes.getNamedItem("d").value;
        sName = oData[i].attributes.getNamedItem("n").value;
        //sMatch = oData[i].attributes.getNamedItem("m").value;
        sMatch = oData[i].attributes.getNamedItem("e").value;

          if (sFilterData.search(sValue) != -1){
            this.suggestData[iCount] = new EKSuggestData(sName + " (" + sValue + ")", sDisplay, sValue, sMatch, sMatch.replace(oRegExp, ""));
            iCount++;
        }
    }

    // Call the inherited class
    EKSuggestProvider.call(this, oDropdown, sDefault);
}
函数EKXMLProvider(oDropdown、sDefault、sXML、sFilterUrl、fireRequestOnce)
{
var oXMLHTTP、i、length、oData、sValue、sDisplay、sName、sMatch、oRegExp;
如果(!oDropdown)
返回;
//用于检索xml文档的XMLHTTP对象
oXMLHTTP=this.createXMLHttpRequest();
this.FilterUrl=sfilterrurl;
if(sFilterUrl!=previousFilterUrl){
open(“GET”,sFilterUrl,false);
oXMLHTTP.send(空);
sFilterData=oXMLHTTP.responseText
先前的FilterUrl=sFilterUrl;
}
如果(!fireRequestOnce | |(fireRequestOnce&&retrievedData==null))
{
this.documentUrl=sXML;
open(“GET”,this.documentUrl,false);
oXMLHTTP.send(空);
oData=oXMLHTTP.responseXML.documentElement.childNodes;
如果(一次)
检索数据=oData;
}
else if(retrievedData!=null)
{
oData=检索到的数据;
}
this.suggestData=新数组();
//过滤掉所有2个和3个字母代码(机场、城市、国家)
oRegExp=newregexp(\\s+\\(\\w{2,3}\\),“gi”);
var iCount=0
对于(i=0,length=oData.length;i
现在,当我们将调用移动到不同的域时,我们需要进行跨域调用,我将上面的跨域代码更改如下:

function EKXMLProvider(oDropdown, sDefault, sXML, sFilterUrl, fireRequestOnce)
{
    var oXMLHTTP, i, length, oData, sValue, sDisplay, sName, sMatch, oRegExp;

    if (!oDropdown)
        return;

    // XMLHTTP Object to retrieve the xml document
    oXMLHTTP = this.createXMLHttpRequest();
    this.FilterUrl = sFilterUrl;
    if (sFilterUrl != previousFilterUrl){
        oXMLHTTP.open("GET", sFilterUrl, false);
        oXMLHTTP.send(null);
        sFilterData = oXMLHTTP.responseText
        previousFilterUrl = sFilterUrl;
    }
    if(!fireRequestOnce ||(fireRequestOnce && retrievedData == null))
    {
        this.documentUrl = sXML;
        oXMLHTTP.open("GET", this.documentUrl, false);
        oXMLHTTP.send(null);

        oData = oXMLHTTP.responseXML.documentElement.childNodes;

        if(fireRequestOnce)
            retrievedData = oData;
    }
    else if(retrievedData != null)
    {
        oData = retrievedData;
    }
    this.suggestData = new Array();

    // Filter out all 2 and 3 letter codes (airport, city, country)
    oRegExp = new RegExp("\\s+\\(\\w{2,3}\\)", "gi");
    var iCount = 0    
    for (i = 0, length = oData.length; i < length; i++)
    {
        sValue = oData[i].attributes.getNamedItem("v").value;
        sDisplay = oData[i].attributes.getNamedItem("d").value;
        sName = oData[i].attributes.getNamedItem("n").value;
        //sMatch = oData[i].attributes.getNamedItem("m").value;
        sMatch = oData[i].attributes.getNamedItem("e").value;

        if (sFilterData.search(sValue) != -1){
            this.suggestData[iCount] = new EKSuggestData(sName + " (" + sValue + ")", sDisplay, sValue, sMatch, sMatch.replace(oRegExp, ""));
            iCount++;
        }
    }

    // Call the inherited class
    EKSuggestProvider.call(this, oDropdown, sDefault);
}
function EKXMLProvider(oDropdown, sDefault, sXML, sFilterUrl, fireRequestOnce)
{
    var oXMLHTTP, i, length, oData, sValue, sDisplay, sName, sMatch, oRegExp;
    var qr = "&jsonpcall=true";
    if (!oDropdown)
        return;

    // XMLHTTP Object to retrieve the xml document
    oXMLHTTP = this.createXMLHttpRequest();

    this.FilterUrl = sFilterUrl;

    if (sFilterUrl != previousFilterUrl){
    //alert(sFilterUrl);
        //oXMLHTTP.open("GET", sFilterUrl, false);
        //oXMLHTTP.send(null);
        //sFilterData = oXMLHTTP.responseText

        // queue up an ajax request
        $.ajax({
        url: sFilterUrl + qr,
        type: "GET",
        cache: true,
        async:false,
        contentType: "application/javascript; charset=utf-8",
        dataType: "jsonp",
        jsonpCallback: "airport", 
        success: function(data, textStatus, jqXHR) 
        {               
            if (data.airport[0] != '')
            {
                    sFilterData = data.airport[0];
            } 
        }
        });

        previousFilterUrl = sFilterUrl;        
    }

    if(!fireRequestOnce ||(fireRequestOnce && retrievedData == null))
    {
        //alert(sXML);
        this.documentUrl = sXML;
        //oXMLHTTP.open("GET", this.documentUrl, false);
        //oXMLHTTP.send(null);

        // queue up an ajax request
          $.ajax({
            url: sXML + qr,
            type: "GET",
            async:false,
            cache: true,
            contentType: "application/javascript; charset=utf-8",
            dataType: "jsonp",
            jsonpCallback: "airportxml", 
            success: function(data, textStatus, jqXHR) 
            {                 
                  var xmlDoc = $.parseXML(data.myresult);
                oData = xmlDoc.documentElement.childNodes; 
                alert(oData);
            }
            });

        //oData = oXMLHTTP.responseXML.documentElement.childNodes;

         if(fireRequestOnce)
             retrievedData = oData;
    }
    else if(retrievedData != null)
    {
        oData = retrievedData;
    }
    this.suggestData = new Array();

      // Filter out all 2 and 3 letter codes (airport, city, country)
      oRegExp = new RegExp("\\s+\\(\\w{2,3}\\)", "gi");
      var iCount = 0    
    for (i = 0, length = oData.length; i < length; i++)
    {
        sValue = oData[i].attributes.getNamedItem("v").value;
        sDisplay = oData[i].attributes.getNamedItem("d").value;
        sName = oData[i].attributes.getNamedItem("n").value;
        //sMatch = oData[i].attributes.getNamedItem("m").value;
        sMatch = oData[i].attributes.getNamedItem("e").value;

          if (sFilterData.search(sValue) != -1){
            this.suggestData[iCount] = new EKSuggestData(sName + " (" + sValue + ")", sDisplay, sValue, sMatch, sMatch.replace(oRegExp, ""));
            iCount++;
        }
    }

    // Call the inherited class
    EKSuggestProvider.call(this, oDropdown, sDefault);
}
函数EKXMLProvider(oDropdown、sDefault、sXML、sFilterUrl、fireRequestOnce)
{
var oXMLHTTP、i、length、oData、sValue、sDisplay、sName、sMatch、oRegExp;
var qr=“&jsonpcall=true”;
如果(!oDropdown)
返回;
//用于检索xml文档的XMLHTTP对象
oXMLHTTP=this.createXMLHttpRequest();
this.FilterUrl=sfilterrurl;
if(sFilterUrl!=previousFilterUrl){
//警报(sFilterUrl);
//open(“GET”,sFilterUrl,false);
//oXMLHTTP.send(空);
//sFilterData=oXMLHTTP.responseText
//将ajax请求排队
$.ajax({
url:sFilterUrl+qr,
键入:“获取”,
是的,
async:false,
contentType:“应用程序/javascript;字符集=utf-8”,
数据类型:“jsonp”,
jsonpCallback:“机场”,
成功:函数(数据、文本状态、jqXHR)
{               
如果(机场数据[0]!='')
{
sFilterData=data.airport[0];
} 
}
});
先前的FilterUrl=sFilterUrl;
}
如果(!fireRequestOnce | |(fireRequestOnce&&retrievedData==null))
{
//警报(sXML);
this.documentUrl=sXML;
//open(“GET”,this.documentUrl,false);
//oXMLHTTP.send(空);
//将ajax请求排队
$.ajax({
url:sXML+qr,
键入:“获取”,
async:false,
是的,
contentType:“应用程序/javascript;字符集=utf-8”,
数据类型:“jsonp”,
jsonpCallback:“airportxml”,
成功:函数(数据、文本状态、jqXHR)
{                 
var xmlDoc=$.parseXML(data.myresult);
oData=xmlDoc.documentElement.childNodes;
警报(oData);
}
});
//oData=oXMLHTTP.responseXML.documentElement.childNodes;
如果(一次)
检索数据=oData;
}
else if(retrievedData!=null)
{
oData=检索到的数据;
}
this.suggestData=新数组();
//过滤掉所有2个和3个字母代码(机场、城市、国家)
oRegExp=newregexp(\\s+\\(\\w{2,3}\\),“gi”);
var iCount=0
对于(i=0,length=oData.length;i
当我在调用中添加“async:false”时,上面的Jquery更改工作正常,但是据我所知,我们不能在跨域中进行同步调用,如果我更改为“async:true”,则调用开始在
行上出错(对于(I=0,length=oData.length;I
,因为oData需要在第二个“airportxml”上填充这两个呼叫似乎都是相互依赖的,所以无论何时发送第一个呼叫,它都会同时发送下一个呼叫

我也使用了ajaxQueue,但是运气不好


请建议我需要做哪些更改。

使用JSONP时,请求不是通过XHR完成的,而是通过向DOM添加实际的
标记来完成的。这就是为什么不能使它同步。这根本不可能。

正如zi42和t所解释的那样