为什么我可以在javascript中提醒变量但不在字符串中使用它

时间:2012-01-24 13:07:14

标签: javascript jquery variables

我正在为一个非常特定的目的编写诊断(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});

现在正按预期使用我已有的代码工作。

3 个答案:

答案 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
}