javascript 注入(inject)没有正常工作

标签 javascript jquery html code-injection

我将外部文件作为 src 注入(inject)脚本标签,然后调用回调函数来注入(inject) HTML。但是当我调试时它是这样的:

  1. 注入(inject) jquery。
  2. 注入(inject)HTML(回调函数)
  3. 注入(inject)其余的脚本标签。

有人可以向我解释如何解决这个问题吗?:

  1. 注入(inject)所有脚本。
  2. 注入(inject) HTML。

Injection.js 文件:

injectJavaScripts([
    "lib/jquery/dist/jquery.js",
    "lib/angular/angular.js",
    "lib/angular-route/angular-route.js",
    "lib/ui-router/release/angular-ui-router.js",
    "src/app.js",
    "src/LoginController.js",
    "src/LogoutController.js",
    "src/MainController.js"
], function() {
    injectHTML();
});

function injectJavaScripts(urls, callback) {
    var elements = [];
    urls.forEach(function (url) {
        var s = document.createElement('script');
        s.src = chrome.extension.getURL(url);
        elements.push(s);
    });

    var target = document.body || document.documentElement;
    var i = 0;
    var patchNext = function () {
        if (i >= elements.length) return;
        else if (i > 0) {
            elements[i - 1].onload = null;
        }

        elements[i].onload = patchNext;
        target.appendChild(elements[i]);

        i += 1;
    };
    patchNext();
    callback();
};

function injectHTML() {
    var logged = false;
    var cheapWatcherDiv = document.createElement('div');
    cheapWatcherDiv.setAttribute('class', 'cheap-watcher');
    document.body.appendChild(cheapWatcherDiv);

    if (logged == false) {
        $(".cheap-watcher").load(chrome.extension.getURL('views/main.html'));
        $('head').append('<link rel="stylesheet" href="' + chrome.extension.getURL('sass/main.css') + '" type="text/css" />');
    } else {
        $(".cheap-watcher").load(chrome.extension.getURL('views/logoutTemplate.html'));
    }
};

最佳答案

您在错误的位置调用了 callback(),该位置本应在注入(inject)所有脚本后调用。但是,您是在第一次调用 patchNext 之后调用的。

修改您的 injectJavaScripts 以在注入(inject)所有脚本时调用 callback()

function injectJavaScripts(urls, callback) {
    var elements = [];
    urls.forEach(function (url) {
        var s = document.createElement('script');
        s.src = chrome.extension.getURL(url);
        elements.push(s);
    });

    var target = document.body || document.documentElement;
    var i = 0;
    var patchNext = function () {
        if (i >= elements.length) {
            // All scripts are injected now
            // ok to invoke callback() here
            callback();
            return;
        }
        else if (i > 0) {
            elements[i - 1].onload = null;
        }

        elements[i].onload = patchNext;
        target.appendChild(elements[i]);

        i += 1;
    };
    patchNext();
    // callback(); don't call here
};

关于javascript 注入(inject)没有正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36305051/

相关文章:

javascript - 如何正确访问像这样的javascript "dictionary"

javascript - 在无状态组件中 react contenteditable

javascript - Cycle2 计算幻灯片中的错误边距

jquery - 使用 jQuery 将鼠标悬停在同一组中的一个 div 上时,如何隐藏所有其他 div?

javascript - jQuery(formElement).val(null) : inconsistent results in different browsers

html - CSS 高度和宽度问题

javascript - jQuery 样式问题

php - 在我的 ajax 民意调查中,.empty() 无法在 PHP 中使用 js

html - 如何在跨度中的每个换行符上添加 padding-left 和 right

jquery - 如何使用 jquery 删除元素的 z-index : 1000 ! important ?