【问题标题】:Handsontable autosave - ajax not definedHandsontable 自动保存 - 未定义 ajax
【发布时间】:2018-05-04 15:21:54
【问题描述】:

我将代码从 Handsontable official documentation 复制到 JSFiddle。这是可操作的 0.34.5。

我在 chrome 控制台中遇到错误: “未定义 ajax”。

代码如下,预加载handsontable.full.min.js和handsontable.full.min.css

HTML:

<div class="ajax-container">
  <div class="controls">
    <button name="load" id="load" class="intext-btn">Load</button>
    <button name="save" id="save" class="intext-btn">Save</button>
    <label>
      <input type="checkbox" name="autosave" id="autosave" checked="checked" autocomplete="off">Autosave</label>
  </div>
  <pre id="example1console" class="console">Click "Load" to load data from server</pre>
  <div id="example1" class="hot handsontable"></div>
</div>

脚本:

var
  $$ = function(id) {
    return document.getElementById(id);
  },
  container = $$('example1'),
  exampleConsole = $$('example1console'),
  autosave = $$('autosave'),
  load = $$('load'),
  save = $$('save'),
  autosaveNotification,
  hot;

hot = new Handsontable(container, {
  startRows: 8,
  startCols: 6,
  rowHeaders: true,
  colHeaders: true,
  afterChange: function(change, source) {
    if (source === 'loadData') {
      return; //don't save this change
    }
    if (!autosave.checked) {
      return;
    }
    clearTimeout(autosaveNotification);
    ajax('scripts/json/save.json', 'GET', JSON.stringify({
      data: change
    }), function(data) {
      exampleConsole.innerText = 'Autosaved (' + change.length + ' ' + 'cell' + (change.length > 1 ? 's' : '') + ')';
      autosaveNotification = setTimeout(function() {
        exampleConsole.innerText = 'Changes will be autosaved';
      }, 1000);
    });
  }
});

Handsontable.dom.addEvent(load, 'click', function() {
  ajax('scripts/json/load.json', 'GET', '', function(res) {
    var data = JSON.parse(res.response);

    hot.loadData(data.data);
    exampleConsole.innerText = 'Data loaded';
  });
});

Handsontable.dom.addEvent(save, 'click', function() {
  // save all cell's data
  ajax('scripts/json/save.json', 'GET', JSON.stringify({
    data: hot.getData()
  }), function(res) {
    var response = JSON.parse(res.response);

    if (response.result === 'ok') {
      exampleConsole.innerText = 'Data saved';
    } else {
      exampleConsole.innerText = 'Save error';
    }
  });
});

Handsontable.dom.addEvent(autosave, 'click', function() {
  if (autosave.checked) {
    exampleConsole.innerText = 'Changes will be autosaved';
  } else {
    exampleConsole.innerText = 'Changes will not be autosaved';
  }
});

【问题讨论】:

  • “ajax 未定义” 您到底有什么不清楚的地方?也许它会有所帮助:您正在使用的ajax 函数未定义。您需要提供适当的 AJAX 请求实用程序。如果还是太难:google javascript make ajax request。或者更简单:打开 devtools 并为这个函数复制他们的 30 行代码。
  • @dfsq 你是说我需要加载一个额外的库吗?如果是这样,知道需要哪个特定的库吗?官方文档中没有说明需要任何东西。
  • 无需加载任何库,正如我所说,只需复制他们在网站上使用的内容,只需 30 行代码。但如果你愿意,你可以使用另一个库。

标签: javascript ajax handsontable


【解决方案1】:

他们使用的ajax函数的代码相当简单,只是对XMLHttpRequest的一个包装。

注意:我只是通过他们的文档页面上的 devtools 执行 ajax.toString() 得到它。它没有引用外部函数,因此它将按原样工作。

function ajax(url, method, params, callback) {
  var obj;

  try {
    obj = new XMLHttpRequest();
  } catch (e) {
    try {
      obj = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        obj = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        alert("Your browser does not support Ajax.");
        return false;
      }
    }
  }
  obj.onreadystatechange = function () {
    if (obj.readyState == 4) {
      callback(obj);
    }
  };
  obj.open(method, url, true);
  obj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  obj.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  obj.send(params);

  return obj;
}

【讨论】:

  • 对于任何试图进行简单的复制和粘贴并希望它能够正常工作的人来说,这是 最接近 的答案。但是,请注意,在此代码中,您使用 obj.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 请求,这将不起作用。将其更改为obj.setRequestHeader("Content-type", "application/json");,您将成为一个快乐的人。这是因为handsontable 的默认代码使用JSON.stringify()
猜你喜欢
  • 2013-08-11
  • 2018-07-30
  • 2013-09-02
  • 2020-12-14
  • 2016-09-20
  • 2014-01-01
  • 2011-05-29
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多