Почему я могу предупредить переменную в JavaScript, но не использовать ее в строке - PullRequest
1 голос
/ 24 января 2012

Я пишу диагностический (greasemonkey) скрипт для очень конкретной цели, поэтому я понимаю, что он может выглядеть странно.Чего я хочу добиться, так это отображать информацию js и css во всплывающем окне на странице, чтобы на ней отображались детали, которые я затем могу использовать для устранения неполадок / диагностики «наших» продуктов.

Следующая функция является частьюэтот сценарий, и он создает строку (msg), которая будет отображаться во всплывающем окне после диагностики всех файлов.Это работает нормально.

Что я не понимаю, так это то, что ближе к концу кода я могу «предупредить» значение (в данном случае строку, содержащую «Version»), но я не могудобавьте то же значение в строку сообщения, которое будет выводиться позже (и будет отображаться, включая закрытие).

// 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 для jQuery.ajaxSetup ), спасибо всем за ваш вклад, я многому научился.

Сначала я попробовал:

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});

и теперь он работает, как и ожидалось, с кодом Iуже было.

Ответы [ 3 ]

1 голос
/ 24 января 2012
alert (lines[k]);
msg += " - " + this.lines[k];

lines[k] и this.lines[k] не означают одно и то же.

Кроме того, вы знаете, что jQuery.get является асинхронным и обратный вызов произойдет позже, верно?Похоже, вы добавляете </div> к msg перед вызовом обратного вызова.

0 голосов
/ 24 января 2012

Поскольку переменная 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
}
0 голосов
/ 24 января 2012

Может не решить вашу проблему, но лучше практиковаться - использовать простые петли.

Измените петли на

for (var j = 0; j < links.length; j++) {

И:

for (var k = 0; k < lines.length; k++) {

for each цикл в JavaScript предназначен для сложных объектов, и при использовании в простых массивах он имеет некоторые побочные эффекты, которые могут вызвать странное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...