【问题标题】:How to get a list of loaded scripts, including the ones dynamically loaded如何获取已加载脚本的列表,包括动态加载的脚本
【发布时间】:2021-01-21 17:37:43
【问题描述】:

我正在尝试将某个脚本与页面上当前加载的脚本进行匹配:

if($('script[src="' + sn + '"]').length == 0)
  $('head').append('<scr' + 'ipt src="' + sn +'"></scr' + 'ipt>');  

这有效,但仅适用于正常加载的脚本。

对于使用 javascript 注入的脚本,例如我的情况,它不起作用:(

显然,以这种方式加载的脚本在 DOM 中是不可见的,即使它们运行。

【问题讨论】:

  • 脚本是如何动态加载的?
  • 就像我上面写的那样,用 append('...

标签: javascript jquery html dom


【解决方案1】:
var isThere = false;
$("script").each(function() {
    if ($(this).attr("src") == sn) {
        isThere = true;  
        // this works also with injected scripts!!
    }
});
if (isThere === false) {
    $('head').append('<scr' + 'ipt src="' + sn +'"></scr' + 'ipt>');
}

【讨论】:

  • 这可能与其他 script 标签一样频繁地包含“sn”脚本,即多次。
  • 这会为不匹配的每个其他脚本多次附加新脚本。
  • 不,它没有。 sn 将运行,但在您附加它后它不会在 DOM 中可见。稍后再尝试运行该条件,您将看到对该文件的两个请求...
  • Alex,我的意思是,如果文件中有多个脚本标签,您的 if 语句中的条件将多次为真,从而触发您执行 @987654324 的代码@多次。
  • 假设第三个脚本匹配sn。您将在前两个(不匹配的)之前执行两次附加,然后您会找到一个匹配的。我认为这不是 OP 想要做的。
【解决方案2】:

不可能可靠地知道加载了哪些脚本元素,因为一旦加载并执行了脚本元素,它就可以在对文档零影响的情况下被删除。此外,使用 innerHTML 属性插入的脚本元素不会被执行,因此它们的存在是没有意义的(或多或少)。

您所能做的就是获取文档中当前脚本元素的列表,您无法可靠地知道哪些已加载甚至执行。

【讨论】:

    【解决方案3】:

    为什么不测试脚本中是否存在某些内容(例如全局变量名、全局对象或函数名)。

    if (!window.functionName) {
        // script holding functionName must not be present so load it dynamically
    }
    

    【讨论】:

    • 唯一的问题是我不知道页面上会有什么脚本:)
    • 您确实知道要包含的脚本(如果它不存在的话),对吧?您可以直接查看其中的内容,然后选择一些指标进行测试。
    【解决方案4】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多