2012-02-29 96 views
1

我正在使用jQuery将图像添加到另一个DOM元素。现在我不想淡出添加的图像,但它不会很好,我猜是因为图像是在文档加载后添加的!?刚刚添加的jQuery访问DOM

这里是我的代码

$('#t' + u).html('<img style="top: 100px;" src="'+data[dataRnd].img+'"/>').find('img').fadeOut(5000); 

回答

2

而不是使用html()的,首先创建img作为一个jQuery DOM对象。之后,您可以将其附加到容器并淡出。

var $img = $('<img style="top: 100px;" src="'+data[dataRnd].img+'"/>'); 
var $container = $('#t' + u).empty(); 

$img.appendTo($container).fadeOut(5000); 

问题的 “清洗” 作用会因为动画可能在图像加载之前启动。正如@adaneo正确建议的那样,.load()方法可用于在加载图像时添加事件处理程序,并启动动画。这仍然有一些cross-browser issues (see Caveats),但如果load事件没有触发,您可以在几秒钟内开始动画。

$img.on('load', function() { 
    $(this).fadeOut(5000); 
}).appendTo($container); 

setTimeout(function() { 
    $img.trigger('load'); 
}, 2000); 

jsFiddle Demo

+0

什么是错的他在干什么? [FIDDLE](http://jsfiddle.net/DQyC6/1/) – adeneo 2012-02-29 10:43:52

+0

如果图像加载时间较长,它可能会创建竞争条件。即你可以在没有任何动画的情况下淡出它,因为图像还没有被显示 – jammypeach 2012-02-29 10:46:52

+0

@ adeneo嗯,它可以工作。但是,当您创建元素并将其添加到DOM时,“添加到DOM然后读取DOM”并不高雅。 – kapa 2012-02-29 10:52:15

0

bazmegakapa的答案是相当不错的,我用的是自己去了,但这里是另一种方式:

一旦文档已被加载(并连接到该事件的脚本有之前添加的任何HTML都不提供给脚本。

那么还有其他两种方式我所知道的选择尚不存在的元素:

你可以使用.on()到处理程序绑定到不存在的元素。这不是我知道有很多关于但是这可能帮助: http://api.jquery.com/on/

另一种方式是等待,直到你的处理程序绑定到它之前添加HTML - 例如:

$(function(){ 
    //i run when the doc loads 
    $.get('someurl', function(data){ 
     $('body').append('<img src="'+data+'" id='myNewElem'/>'); 
     //I run after the element is added to the DOM, so I can select it here 
     $('img#myNewElem').fadeOut(); 
    }); 
}); 

再次我会去与以前的答案个人,这些只是你可以完成同样的事情的其他方式。

编辑:

第三种选择就是有点更适合您的是一个负载()事件附加到您添加到页面的图像,并淡出出来,一旦图像完成加载。

例子:

$('#elem').html('<img src="someSrc" id="myImage">'); 
$('#myImage').load(function(){ 
    $(this).fadeOut(); 
}); 

这将防止褪色发生之前的图像是在网页上可见。

希望这有助于

+0

'live()'已被弃用,如您所链接的页面所述。请不要建议它。 – kapa 2012-02-29 10:49:37

+0

啊,我的错。见编辑后。 – jammypeach 2012-02-29 10:50:57

1

你做它应该工作得很好的方式,但应该有图片的加载检查,是这样的:

$('#t' + u) 
    .html('<img style="top: 100px;" src="'+data[dataRnd].img+'"/>') 
    .children().load(function() { 
     $(this).fadeOut(5000); 
    }); 

FIDDLE

+0

用于'.load()'的+1,格式化为可读性。我仍然说,写入时就不应该写/读DOM。请注意'.load()'仍然存在严重的跨浏览器问题:[docs - 请参阅警告部分](http://api.jquery.com/load-event/#load1)。 – kapa 2012-02-29 10:57:34

相关问题