为什么不应该立即 运行 的 JavaScript 函数会造成一些延迟?
Why there is some delay caused by a JavaScript function that isn't supposed to run immediately?
我有两个函数,showhide
和 getSourceCode
。我希望 showhide
在提交后立即执行(隐藏对话框),但是 getSourceCode
很长所以我让它稍后执行。但是,在我单击提交和 showhide
生效之间仍然存在一些延迟。当我删除getSourceCode
时,对话框可以立即消失,但只要有getSourceCode
,它总是延迟,即使我setTimeout
它。
document.querySelector("[type=submit]").onclick = function (event) {
showhide('dialogBox');
if (options[0].checked) {
setTimeout(getSourceCode(),10000);
}
}
function getSourceCode() {
var htmlastext = ajax("something.aspx");
function HTML(text) {
this.fullCode = (new DOMParser()).parseFromString(text, "text/html");
this.scripts = this.fullCode.querySelectorAll("script[src]");
this.style = this.fullCode.querySelector("link[rel=stylesheet]");
this.images = this.fullCode.querySelectorAll("img");
this.replaceContent = function (content, element, tag) {
var newElement = this.fullCode.createElement(tag);
newElement.innerHTML = content;
element.parentNode.replaceChild(newElement, element);
}
this.modify = function () {
var externalContent;
var serverpath = window.location.origin;
for (var i = 0; i < this.scripts.length; i++) {
externalContent = ajax(this.scripts[i].src.slice(serverpath.length));
this.replaceContent(externalContent, this.scripts[i], "script");
}
externalContent = ajax(this.style.href.slice(serverpath.length));
this.replaceContent(externalContent, this.style, "style");
var removeTagList = [
this.fullCode.getElementById("logout"),
this.fullCode.getElementById("saveHTML"),
this.fullCode.getElementById("dialogOverlay"),
this.fullCode.querySelectorAll("script")[4],
this.fullCode.querySelector("link")
];
for (i=0; i<removeTagList.length; i++) {
removeTagList[i].parentNode.removeChild(removeTagList[i]);
}
}
}
var htmlDoc = new HTML(htmlastext);
var html = htmlDoc.fullCode;
htmlDoc.modify();
htmlastext = (new XMLSerializer()).serializeToString(html);
var txtarea = document.createElement("textarea");
txtarea.innerHTML = htmlastext;
htmlastext = txtarea.value;
document.getElementById("encodedSourceCode").value = btoa(htmlastext);
}
为什么showhide
会出现延迟? JavaScript 函数不是同步的吗? setTimeOut
不是可以让参数函数在超时前不执行吗?如何在提交后立即隐藏对话框,而不删除 getSourceCode
?
问题出在这一行:
setTimeout(getSourceCode(),10000);
因为 getSourceCode
函数 被立即调用 (因为它后面有 ()
),并且只有它的 return 值传递给 setTimeout
。
去掉你的函数后面的括号,然后,你的函数会被传递给setTimeout
,它会在内部调用它。
setTimeout(getSourceCode,10000);
我有两个函数,showhide
和 getSourceCode
。我希望 showhide
在提交后立即执行(隐藏对话框),但是 getSourceCode
很长所以我让它稍后执行。但是,在我单击提交和 showhide
生效之间仍然存在一些延迟。当我删除getSourceCode
时,对话框可以立即消失,但只要有getSourceCode
,它总是延迟,即使我setTimeout
它。
document.querySelector("[type=submit]").onclick = function (event) {
showhide('dialogBox');
if (options[0].checked) {
setTimeout(getSourceCode(),10000);
}
}
function getSourceCode() {
var htmlastext = ajax("something.aspx");
function HTML(text) {
this.fullCode = (new DOMParser()).parseFromString(text, "text/html");
this.scripts = this.fullCode.querySelectorAll("script[src]");
this.style = this.fullCode.querySelector("link[rel=stylesheet]");
this.images = this.fullCode.querySelectorAll("img");
this.replaceContent = function (content, element, tag) {
var newElement = this.fullCode.createElement(tag);
newElement.innerHTML = content;
element.parentNode.replaceChild(newElement, element);
}
this.modify = function () {
var externalContent;
var serverpath = window.location.origin;
for (var i = 0; i < this.scripts.length; i++) {
externalContent = ajax(this.scripts[i].src.slice(serverpath.length));
this.replaceContent(externalContent, this.scripts[i], "script");
}
externalContent = ajax(this.style.href.slice(serverpath.length));
this.replaceContent(externalContent, this.style, "style");
var removeTagList = [
this.fullCode.getElementById("logout"),
this.fullCode.getElementById("saveHTML"),
this.fullCode.getElementById("dialogOverlay"),
this.fullCode.querySelectorAll("script")[4],
this.fullCode.querySelector("link")
];
for (i=0; i<removeTagList.length; i++) {
removeTagList[i].parentNode.removeChild(removeTagList[i]);
}
}
}
var htmlDoc = new HTML(htmlastext);
var html = htmlDoc.fullCode;
htmlDoc.modify();
htmlastext = (new XMLSerializer()).serializeToString(html);
var txtarea = document.createElement("textarea");
txtarea.innerHTML = htmlastext;
htmlastext = txtarea.value;
document.getElementById("encodedSourceCode").value = btoa(htmlastext);
}
为什么showhide
会出现延迟? JavaScript 函数不是同步的吗? setTimeOut
不是可以让参数函数在超时前不执行吗?如何在提交后立即隐藏对话框,而不删除 getSourceCode
?
问题出在这一行:
setTimeout(getSourceCode(),10000);
因为 getSourceCode
函数 被立即调用 (因为它后面有 ()
),并且只有它的 return 值传递给 setTimeout
。
去掉你的函数后面的括号,然后,你的函数会被传递给setTimeout
,它会在内部调用它。
setTimeout(getSourceCode,10000);