XDomainRequest onLoad在IE8中无法正确触发

时间:2014-11-13 13:18:04

标签: ajax google-maps internet-explorer-8 xdomainrequest xdr

我向谷歌地理编码api发出请求以获取给定邮政编码的经度和纬度。这在IE8的所有浏览器中都能正常工作(震撼!)。

为了解决这个问题,我已经为IE实现了XDomainRequest。

  /*
      Convert postcode to lat/lng.
  */

  var convertPostcodeToLatLng = function(postcode) {
    var isPostcodeValid = false,
      postcodeRegex = /[A-Z]{1,2}[0-9][0-9A-Z]?\s?[0-9][A-Z]{2}/gi,
      lat,
      lng;

    if (window.XDomainRequest) {
      // Use Microsoft XDR
      var xdr = new XDomainRequest();

      xdr.onload = function() {

        response = JSON.parse(xdr.responseText);

        if (postcode.match(postcodeRegex) && response.status === 'OK') {
          lat = response.results[0].geometry.location.lat;
          lng = response.results[0].geometry.location.lng;

          isPostcodeValid = true;
        }
      }

    } else {

      $.ajax({
        url: '//maps.googleapis.com/maps/api/geocode/json?address=' + postcode + ',+UK&sensor=false',
        type: 'get',
        dataType: 'json',
        cache: false,
        async: false,
        success: function(response) {

          window.console && console.log(response);

          if (postcode.match(postcodeRegex) && response.status === 'OK') {
            lat = response.results[0].geometry.location.lat;
            lng = response.results[0].geometry.location.lng;

            isPostcodeValid = true;
          }

        },
        error: function(response) {
          // error
        }
      });

    }

    if (!isPostcodeValid) return ['error', 'Please enter a valid postcode'];

    return [lat, lng];
  }

以及我如何称呼它

applicantPostcode = fm.find('input[name=postcode]').val(),
applicantPostcodeCoords = convertPostcodeToLatLng(applicantPostcode);

我还会在继续之前检查错误

if (applicantPostcodeCoords[0] === 'error') {
      $('#sb-player #postcode').after('<label class="invalid-postcode">' + applicantPostcodeCoords[1] + '</label>');

  return;
}

现在我说它不起作用,这是谎言,它确实有效,它不会立即起作用,因此错误会在它失败时被解雇。< / p>

我已尝试在IE8中进行调试,这似乎就是这样做的

  • 从表单元素
  • 获取邮政编码
  • 使用邮政编码跳转到功能
  • 创建新的XDomainRequuest
  • 跳过xdr.onload
  • 创建新的XDomainRequest
  • 跳出条件并向下跳转到isPostcodeValid并返回错误

现在请求确实有效,我已经对它进行了测试,问题是它不能立即工作,因此会跳入错误。

任何人都知道为什么它跳过onload而不是跳过它?

谢谢!

1 个答案:

答案 0 :(得分:0)

一旦你的功能加载它就进入第一个条件并且失败了

   if (postcode.match(postcodeRegex) && response.status === 'OK') {
        lat = response.results[0].geometry.location.lat;
        lng = response.results[0].geometry.location.lng;

        isPostcodeValid = true;
      }

因为还没有回复,因为此时您还没有发送请求?

所以当你在第一次运行该功能时点击它     if (!isPostcodeValid) return ['error', 'Please enter a valid postcode'];