我正在为一个非常特定的目的编写诊断(greasemonkey)脚本,所以我理解它可能看起来很奇怪。我想要实现的是在页面上的弹出窗口中显示js和css信息,以便显示我可以用来对“我们的”产品进行故障排除/诊断的详细信息。
以下函数是该脚本的一部分,它构建一个字符串(msg),一旦诊断出所有文件,它将显示在弹出窗口中。这很好。
我无法理解的是,在代码结束时,我可以“警告”该值(在这种情况下,包含“Version”的行),但我无法将相同的值添加到msg字符串将在稍后输出(并将显示,包括结束)。
// get linked stylesheets
links = document.getElementsByTagName('link');
msg += '<h2>External Stylesheets</h2>';
for (var j in links) {
if (links[j].rel == "stylesheet") {
msg += "<div class='css" + [j] + "'>Stylesheet: " + "<a href=" + links[j].href + ">" + links[j].href + "</a>";
var styleSheet = links[j].href;
jQuery.get(links[j].href, function(data) {
lines = data.split("\n");
for (var k in lines) {
if ((lines[k]).search(/Version/) != -1) {
alert (lines[k]);
msg += " - " + lines[k];
break;
}
}
});
msg += "</div>";
}
}
我希望我明确表示自己,我有一个编码背景,但是Javascript / jQuery的错综复杂(我添加到混音中)相当新。
已修改:已添加解决方案。
异步Ajax注释引导我找到解决方案(通过jQuery.ajaxSetup的jQuery文档),感谢大家的贡献,我学到了很多。
首先我尝试了:
jQuery.ajax({
url: links[j].href,
success: function(data) {
lines = data.split("\n");
for (var k in lines) {
if ((lines[k]).search(/Version/) != -1) {
msg += " - " + lines[k];
break;
}
}
},
asynch: false
});
由于某种原因也不起作用,所以我恢复到我的初始代码(使用jQuery.get),但在脚本的开头添加了以下行:
jQuery.ajaxSetup({async:false});
现在正按预期使用我已有的代码工作。
答案 0 :(得分:1)
alert (lines[k]);
msg += " - " + this.lines[k];
lines[k]
和this.lines[k]
并不意味着同样的事情。
此外,您知道jQuery.get
是异步的,回调将在稍后发生,对吧?看起来您要在调用回调之前将</div>
添加到msg
。
答案 1 :(得分:0)
可能无法解决您的问题,但更好的做法 - 使用普通循环。
将循环更改为
for (var j = 0; j < links.length; j++) {
和
for (var k = 0; k < lines.length; k++) {
JavaScript中的for each
循环适用于复杂对象,当在普通数组上使用时,它会产生一些可能导致奇怪行为的副作用。
答案 2 :(得分:0)
由于msg变量是异步调用的结果。你应该试试这个。
// get linked stylesheets
links = document.getElementsByTagName('link');
msg += '<h2>External Stylesheets</h2>';
for (var j in links) {
if (links[j].rel == "stylesheet") {
msg += "<div class='css" + [j] + "'>Stylesheet: " + "<a href=" + links[j].href + ">" + links[j].href + "</a>";
var styleSheet = links[j].href;
jQuery.get(links[j].href, function(data) {
lines = data.split("\n");
for (var k in lines) {
if ((lines[k]).search(/Version/) != -1) {
alert (lines[k]);
msg += " - " + lines[k];
doYourPopupMessage(msg );
break;
}
}
});
}
}
function doYourPopupMessage(msg )
{
//do someting with msg
}