【问题标题】:How do I put tag attributes onload & onerror in the javascript?如何在 javascript 中放置标签属性 onload 和 onerror?
【发布时间】:2016-12-17 03:50:32
【问题描述】:

旧脚本(1):

document.write('<scr'+'ipt src="http://example.com/script.js?'+Math.random()+'" type="text/javascript" onerror="checkScriptLoaded2();" onload="scriptLoaded2=true;"></scr'+'ipt>');

脚本新(2):

var sNew = document.createElement("script");
sNew.async = true;
sNew.src = "http://example.com/script.js?"+Math.random();
var s0 = document.getElementsByTagName('script')[0];
s0.parentNode.insertBefore(sNew, s0);

如何把这个标签放到脚本2中才能正常工作。

onerror="checkScriptLoaded2();" onload="scriptLoaded2=true;"

【问题讨论】:

    标签: javascript dom dom-events


    【解决方案1】:

    这边。

    创建属性并将其添加到脚本元素。

    createAttribute() 方法创建一个具有指定名称的属性,并将该属性作为 Attr 对象返回。

    attribute.value 属性用于设置属性的值。

    element.setAttributeNode() 方法用于将新创建的属性添加到元素。

    function checkScriptLoaded2()
    {
      alert("Error in loading.")
    }
    
    var sNew = document.createElement("script");
    sNew.async = true;
    sNew.src = "https://example.com/script.js?"+Math.random();
    
    
    sNew.setAttribute('onerror', 'checkScriptLoaded2();') // Shorthand as suggested by Felix
    
    var att = document.createAttribute("onload"); // Elaborated way 
    att.value = "scriptLoaded2=true;"
    sNew.setAttributeNode(att)
    
    
    
    
    var s0 = document.getElementsByTagName('script')[0];
    s0.parentNode.insertBefore(sNew, s0);
    &lt;div&gt;hello&lt;/div&gt;

    【讨论】:

    • 当您可以使用 DOM 属性时为什么还要使用 HTML 属性(尤其是因为您使用了 asyncsrc DOM 属性)?
    • @FelixKling 这是实现的方法之一,但是如果您能提供您的答案的工作样本会很高兴。
    • 当然是一种方式,但不是很常见。也许你至少可以解释更多关于createAttributesetAttributeNode 的信息。另一种(更简洁)的方法是使用setAttribute('onerror', '...') btw。
    • @FelixKling Aye Aye Captain
    【解决方案2】:

    像这样:

    sNew.onerror = checkScriptLoaded2;
    sNew.onload = function() {
      scriptLoaded2 = true;
    };
    

    您可以learn more about this type of event handling on quirksmode.org。基本上,对于元素支持的大多数事件,它是一个 on&lt;eventname&gt; 属性,您可以为其分配一个函数来处理它。

    查看 MDN 上的 HTMLScriptElement documentation(尽管它没有列出事件处理程序)。


    还要注意

    var s0 = document.getElementsByTagName('script')[0];
    s0.parentNode.insertBefore(sNew, s0);
    

    只有在已经存在另一个 &lt;script&gt; 元素时才有效。如果脚本不必出现在任何特定的地方,那么按照 MDN 的建议进行操作会更安全:

    document.head.appendChild(sNew);
    

    【讨论】:

    • 非常感谢您的建议反馈。我会投票,但不幸的是我没有足够的声誉。
    • 没关系。我只能告诉你,你不应该使用setAttribute* 方法。那是倒退了一步。如果您有 DOM 元素,请使用 DOM 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2011-02-17
    • 2023-03-28
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多