在Safari

时间:2016-09-22 15:35:29

标签: javascript angularjs safari xmlhttprequest cors

我创建了一个简单的angularjs网站。我的后端是谷歌表,不理想,但它是免费的。我已将以下脚本部署为webapp以从我的google工作表中获取JSON :(这不是我的代码btw)

  function doGet(request) {
    var output = ContentService.createTextOutput();
    var data = {};
    var id = request.parameters.id;
    var sheet = request.parameters.sheet;
    var cell = request.parameters.cell;
    var ss = SpreadsheetApp.openById(id);
    if (sheet) {
      if (cell) {
        data = ss.getSheetByName(sheet).getRange(cell).getValue();
      } else {
        data[sheet] = readData_(ss, sheet);
      }
    } else {
      // Grab all sheets except those with a name
      // that starts with an underscore
      ss.getSheets().forEach(function(oSheet, iIndex) {
        var sName = oSheet.getName();
        if (! sName.match(/^_/)) {
          data[sName] = readData_(ss, sName);
        }
      })
    }
    var result = cell ? data : JSON.stringify(data);
    var callback = request.parameters.callback;
    if (callback == undefined) {
      output.setContent(result);
      output.setMimeType(cell ? ContentService.MimeType.TEXT : ContentService.MimeType.JSON);
    }
    else {
      output.setContent(callback + "(" + result + ")");
      output.setMimeType(ContentService.MimeType.JAVASCRIPT);
    }
    return output;
  }


  function readData_(ss, sheetname, properties) {

    if (typeof properties == "undefined") {
      properties = getHeaderRow_(ss, sheetname);
      properties = properties.map(function(p) { return p.replace(/\s+/g, '_'); });
    }

    var rows = getDataRows_(ss, sheetname);
    var data = [];
    for (var r = 0, l = rows.length; r < l; r++) {
      var row = rows[r];
      var record = {};
      for (var p in properties) {
        record[properties[p]] = convert_(row[p]);
      }
      data.push(record);
    }
    return data;
  }


  function convert_(value) {
    if (value === "true") return true;
    if (value === "false") return false;
    return value;
  }


  function getDataRows_(ss, sheetname) {

    var sh = ss.getSheetByName(sheetname);
    return sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastColumn()).getValues();

  }


  function getHeaderRow_(ss, sheetname) {

    var sh = ss.getSheetByName(sheetname);
    return sh.getRange(1, 1, 1, sh.getLastColumn()).getValues()[0];

  }

在我的角度应用中,我有一个简单的服务,使用角度http来访问webapp及其网址和电子表格的ID:

app.service('GoogleSheets', function($http) {
  return {
    getSheet: function(url, id) {
      return $http({
        url: url,
        method: 'GET',
        params: {id: id}
      }).then(function(data) {
        return data.data;
      });
    }
  };
});

这适用于Chrome,Opera,Firefox和Microsoft Edge。但是,当我尝试在Safari上使用它时,我收到以下错误:

XMLHttpRequest cannot load http://<MYSERVERADDRESS>/WebMethods.asmx/Method. Cannot make any requests from null

经过一番研究后,我发现这是因为safari处理CORS的方式。我读了一个问题,提到改变涉及Allow-Access-Control-Origin的标题,但我不知道如何做到这一点。这种事情只是Safari不支持的东西还是我可以做的事情?我知道可以将我的电子表格页面划分为单独的文件,并使用简单的get请求访问它们然后解析html,但这更笨重,我希望避免这种情况。

0 个答案:

没有答案