2015-04-26 149 views
2

我想把JS的背景图像放在div上,并在鼠标上点击更改这些图像。我试图这样做:用JS更改div背景图像

window.onload; { 
    var replies = document.getElementsByClassName("reply-wrapper"); 
    var retweets = document.getElementsByClassName("retweet-wrapper"); 
    var favs = document.getElementsByClassName("fav-wrapper"); 

    for (var i = 0; i < replies.length; i++) { 
     replies[i].style.backgroundImage = "url(images/reply.png);"; 
    } 
    for (var i = 0; i < retweets.length; i++) { 
     retweets[i].style.backgroundImage = "url(images/retweet.png);"; 
    } 
    for (var i = 0; i < favs.length; i++) { 
     favs[i].style.backgroundImage = "url(images/favorite.png);"; 
    } 
} 

但由于某种原因,它将无法正常工作。适当的div有正确的类,并将它们添加到收集工作正常,但放置图像本身不起作用。我究竟做错了什么? P.S.想用纯JS编写它,不要使用jQuery。 P.P.S出于某种原因,使用innerHTML放置图像效果很好。为什么?

回答

2

这里有两个问题:

  1. 像杰米·狄克逊提到它需要window.onload = function(){}
  2. favs[i].style.backgroundImage = "url(images/favorite.png);";应该是favs[i].style.backgroundImage = "url(images/favorite.png)";额外;将导致您的链接不工作。因此,从其他链接中删除多余的分号。

更新并提供了解释:

#room1 { 
    background-image: url('image/example.png'); 
} 

在你上面的例子会发现分号。就像在任何编程语言中一样,这就是说这是命令的结尾。有时候分号是可选的(就像在js中发现的某些情况一样)。

JS不是CSS。即使您将风格应用于您的html元素,您使用的是JS而不是CSS。这就是为什么你不需要引号内的;

+0

谢谢,它工作得很好。也许,你可以解释一下,为什么这样做;打破链接? AFAIK,它应该在CSS属性声明后... ...也许,你可以帮我解决另一个问题 - 我想添加这样的代码,但它不会工作:回复[i] .onMouseOver = function(){ 回复[i] .style.backgroundImage =“url('images/reply_hover.png)”; }我又在做什么错了? –

+0

@TristanTzara在你的函数中,你应该将它改为** this.style.backgroundImage **,而不是**回复[i] .style.backgroundImage ** – rottenoats

3

将代码分配给window.onload事件时,看起来你犯了一个小错误。

您的代码需要分配给onload事件的功能。

window.onload = function() { /* Your Code */ };

代替:

window.onload; { /* Your Code /* }

0

我没有看到一个函数名称的代码。 它不完整?
这可能是错误。

window.onLoad; 

试试这个:

function fn_load(){ 
// Your statements 
} 

,并在体内做到这一点:

0

我应该是:

window.onload = function() { 
var replies = document.getElementsByClassName("reply-wrapper"); 
var retweets = document.getElementsByClassName("retweet-wrapper"); 
var favs = document.getElementsByClassName("fav-wrapper"); 

for (var i = 0; i < replies.length; i++) { 
    replies[i].style.backgroundImage = "url(images/reply.png);"; 
} 
for (var i = 0; i < retweets.length; i++) { 
    retweets[i].style.backgroundImage = "url(images/retweet.png);"; 
} 
for (var i = 0; i < favs.length; i++) { 
    favs[i].style.backgroundImage = "url(images/favorite.png);"; 
} 
} 

你DOM呼吁甚至在窗口拿到负荷。

2

事件处理程序window.onload需要分配一个函数来调用。因此,您只需在代码块前添加关键字'function',然后将其分配给window.onload。另外,如果你想和页面上的其他代码一起玩,你可以获取任何现有的onload处理器的引用,然后在你的onload函数中调用。

var oldOnLoad = window.onload; 
 

 
window.onload = function() { 
 
    if (typeof oldOnLoad === 'function') { 
 
    oldOnLoad(); 
 
    } 
 
    var replies = document.getElementsByClassName("reply-wrapper"); 
 
    var retweets = document.getElementsByClassName("retweet-wrapper"); 
 
    var favs = document.getElementsByClassName("fav-wrapper"); 
 

 
    for (var i = 0; i < replies.length; i++) { 
 
    replies[i].style.backgroundImage = "url(images/reply.png)"; 
 
    } 
 
    for (var i = 0; i < retweets.length; i++) { 
 
    retweets[i].style.backgroundImage = "url(images/retweet.png)"; 
 
    } 
 
    for (var i = 0; i < favs.length; i++) { 
 
    favs[i].style.backgroundImage = "url(images/favorite.png)"; 
 
    } 
 
};

注:它可能是值得一提的是,加载在onload事件处理程序的背景图像可能会导致自己的网页显示加载缓慢,因为它会等待页面上的所有其他内容完成加载。你可能想这样做,而不是:

<div id="reply-wrapper" style="display: block; width: 250px; height: 250px;"></div> 
 
<script> 
 
(function() { 
 
    document.getElementById('reply-wrapper').style.backgroundImage = "url(//dummyimage.com/250x250/000/fff)"; 
 
})(); 
 
</script>

+0

通过将背景图像添加到头部的CSS类,然后将这些类名称分配给悬停时的元素或单击?我在想这种方法会立即开始下载所有的背景,而不是等待文档正文呈现。只是好奇。 – Roberto

+0

我跑了一个性能测试来比较1)创建一个CSS类,它定义了一个背景图像并将其应用于div与2.)直接使用JavaScript语句将背景图像应用于div,并将其分配给'style'没有看到性能的差异。使用CSS类设置背景图片:http://www.webpagetest.org/result/150426_CP_TY7/并使用JS风格http://www.webpagetest.org/result/150426_PJ_TY9/ - 您可以预先获取通过调用新的Image()并设置src = image url来标记脚本标记中的头像,但这可能会影响感知的性能 – Chad