2017-11-21 12 views
2

코드를 Handsontable official documentation에서 JSFiddle으로 복사했습니다. 이것은 손댈 수 없다 0.34.5.Handsontable 자동 저장 - 아약스가 정의되지 않았습니다.

크롬 콘솔에 오류가 발생했습니다. "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'; 
    } 
}); 
+0

* "아약스가 정의되지 않았습니다."* 분명하지 않은 점은 무엇입니까? 아마도 도움이 될 것입니다 : 당신이 사용하고있는'ajax' 함수는 * 정의되지 않았습니다 *. 적절한 AJAX 요청 유틸리티를 제공해야합니다. 너무 어려운 경우 : 구글 자바 스크립트 만들기 아약스 요청하십시오. 또는 더 간단하게 : devtools를 열고이 함수에 대한 30 줄의 코드를 복사하십시오. – dfsq

+0

@dfsq 내가 추가 라이브러리를로드해야한다고 말하고 있습니까? 그렇다면 어떤 특정 도서관이 필요합니까? 공식 문서에는 아무 것도 필요 없다고 명시되어 있지 않습니다. –

+0

라이브러리를로드 할 필요가 없습니다. 단지 웹 사이트에서 사용하는 내용을 복사하기 만하면 30 줄의 코드 일뿐입니다. 원한다면 다른 라이브러리를 사용할 수 있습니다. – dfsq

답변

0

그들이 사용하고있는 ajax 함수의 코드는 다소 단순합니다. XMLHttpRequest 주위의 래퍼입니다.

참고 : docs 페이지에서 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; 
} 
+0

간단한 복사 및 붙여 넣기를 시도하고 작동 할 것으로 예상되는 사람에게 가장 가까운 * 대답입니다. 그러나이 코드에서,'obj.setRequestHeader ("Content-type", "application/x-www-form-urlencoded");로 요청하면 작동하지 않을 것입니다. 그것을'obj.setRequestHeader ("Content-type", "application/json");으로 변경하면 행복한 사람이 될 것입니다. 이것은 handsontable의 기본 코드가'JSON.stringify()'를 사용하기 때문입니다. –