var empowerInstance = null;
function onClick_btnSendMessage() {
var childIFrame = window.document.getElementById("editorFrame");
if (!empowerInstance) {
empowerInstance = EditorAPI.getInstance(childIFrame.contentWindow, window.location.origin);
}
empowerInstance.document.hasChanged(hasChangedCallback);
}
function hasChangedCallback(returnValue) {
console.log("empowerInstance.document.hasChanged = " + returnValue.isDirty);
if (returnValue.success === true && returnValue.isDirty === true) {
empowerInstance.document.save(saveCallback);
}
}
function saveCallback(returnValue) {
console.log("empowerInstance.document.save = " + returnValue.success);
if (returnValue.success === false) {
console.log(returnValue.message);
}
}
window.addEventListener("DOMContentLoaded", function (event) {
console.log("DOM fully loaded and parsed");
if (typeof location.origin === "undefined")
window.location.origin = window.location.protocol + "//" + window.location.host;
document.getElementById("btnSendMessage").addEventListener("click", onClick_btnSendMessage);
});
下面的代碼片段取而代之接線扣的,我想從一個引導標籤事件的激活火的代碼。
$('a[data-toggle="tab"]').on("shown.bs.tab", function (e) {
onClick_btnSendMessage(); // Naive way, as this does not wait
var target = $(e.target).attr("data-EditorUrl"); // activated tab
var childIFrame = $("#editorFrame");
childIFrame.attr("src", target);
});
所以我的問題是「如何在更改childIFrame源之前等待此功能完成?」。
empowerInstance.document.hasChanged(hasChangedCallback);
我概念瞭解使用承諾和回調的,但是寫一個功能正常是一個不同的故事。
更新
此版本重構,以消除該按鈕的處理程序,從而提高可讀性。
用法也很重要。當頁面第一次加載時,它位於選項卡上。此選項卡與託管在iFrame中的文檔相關聯。如果用戶編輯此文檔,然後嘗試更改制表符,我想調用檢查髒/保存,然後一旦保存,移動到下一個標籤/文檔。還有一種情況是,標籤/文檔之間的切換不會導致保存,因爲文檔不髒。
var empowerInstance = null;
function hasChangedCallback(returnValue) {
console.log("empowerInstance.document.hasChanged = " + returnValue.isDirty);
if (returnValue.success === true && returnValue.isDirty === true) {
empowerInstance.document.save(saveCallback);
}
}
function saveCallback(returnValue) {
console.log("empowerInstance.document.save = " + returnValue.success);
if (returnValue.success === false) {
console.log(returnValue.message);
}
}
$(function() {
if (typeof location.origin === "undefined") {
window.location.origin = window.location.protocol + "//" + window.location.host;
}
$('a[data-toggle="tab"]').on("shown.bs.tab", function (e) {
var childIFrame = $("#editorFrame");
if (!empowerInstance) {
empowerInstance = EditorAPI.getInstance(childIFrame[0].contentWindow, window.location.origin);
}
empowerInstance.document.hasChanged(hasChangedCallback);// Need to wait for completion
var target = $(e.target).attr("data-EditorUrl"); // activated tab
childIFrame.attr("src", target);
});
});
謝謝 斯蒂芬
我不完全理解你的代碼還沒有,但回答你的問題一般是「用一個回調函數」。 – 4castle
您可以使用回調函數或承諾。所有瀏覽器都不支持Promise,因此您可以使用webpack或babel來完成此操作。 –