两个javascript脚本的非独立性

时间:2016-04-08 12:18:19

标签: javascript

He Guys,

我有两个单独运行的脚本。一个用于加载图像,一个用于加载Youtube iframe嵌入。

然而,它们似乎并不合作。你能帮忙吗?

<iframe width="560" height="315" frameborder="0" data-src="https://www.youtube.com/embed/fKnbOJ4NAvS" src=""></iframe>

<a rel="nofollow" target="_blank" href="https://plus.google.com/share?url=https%3A%2F%2Fwww.domain.com"><img src="data:image/png;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" data-src="googleplus.png"></a>

<script>
function init() {
var imgDefer = document.getElementsByTagName('img');
for (var i=0; i<imgDefer.length; i++) {
if(imgDefer[i].getAttribute('data-src')) {
imgDefer[i].setAttribute('src',imgDefer[i].getAttribute('data-src'));
} } }
window.onload = init;
</script>

<script>
function init() {
var vidDefer = document.getElementsByTagName('iframe');
for (var i=0; i<vidDefer.length; i++) {
if(vidDefer[i].getAttribute('data-src')) {
vidDefer[i].setAttribute('src',vidDefer[i].getAttribute('data-src'));
} } }
window.onload = init;
</script>

1 个答案:

答案 0 :(得分:0)

你做了几个无效的假设。

首先,所有脚本占用相同的全局名称空间。因此,多个<script>...</script>代码不是独立的

<script>
//script 1
</script> 
<script>
//script 2
</script>

相当于:

<script>
//script 1
//script 2
</script>

其次,对window.onload 重复分配的功能不是累积的。如果window.onload = init后跟第二个window.onload = init,则第二个分配将覆盖第一个分配。

现在你应该明白你的第二个脚本会使第一个脚本无效。

要修复,您可以为这两个函数指定唯一的名称,并从单个(匿名)window.onload处理程序中调用它们:

<script>
function init_1() {
    var imgElements = document.getElementsByTagName('img');
    for (var i=0; i<imgElements.length; i++) {
        if(imgElements[i].getAttribute('data-src')) {
            imgElements[i].setAttribute('src', imgElements[i].getAttribute('data-src'));
        }
    }
}
function init_2() {
    var vidElements = document.getElementsByTagName('iframe');
    for (var i=0; i<vidElements.length; i++) {
        if(vidElements[i].getAttribute('data-src')) {
            vidElements[i].setAttribute('src', vidElements[i].getAttribute('data-src'));
        }
    }
}
window.onload = function() {
    init_1();
    init_2();
};
</script>

您可以省略init_1()init_2(),并在匿名window.onload处理程序中直接写入所有内容:

<script>
window.onload = function() {
    var imgElements = document.getElementsByTagName('img');
    var vidElements = document.getElementsByTagName('iframe');
    var i;

    for (i=0; i<imgElements.length; i++) {
        if(imgElements[i].getAttribute('data-src')) {
            imgElements[i].setAttribute('src', imgElements[i].getAttribute('data-src'));
        }
    }

    for (i=0; i<vidElements.length; i++) {
        if(vidElements[i].getAttribute('data-src')) {
            vidElements[i].setAttribute('src', vidElements[i].getAttribute('data-src'));
        }
    }
};
</script>

以这种方式重用变量i是完全可以的。

您会注意到我重命名了变量以避免使用“Defer”,这在JavaScript中具有非常特殊的含义。