Tôi muốn biết khi một hình ảnh đã tải xong. Có cách nào để làm điều đó với một cuộc gọi lại?
Nếu không, có cách nào để làm điều đó không?
Tôi muốn biết khi một hình ảnh đã tải xong. Có cách nào để làm điều đó với một cuộc gọi lại?
Nếu không, có cách nào để làm điều đó không?
Câu trả lời:
.complete
+ gọi lại
Đây là một phương pháp tuân thủ tiêu chuẩn mà không phụ thuộc thêm và chờ đợi không quá cần thiết:
var img = document.querySelector('img')
function loaded() {
alert('loaded')
}
if (img.complete) {
loaded()
} else {
img.addEventListener('load', loaded)
img.addEventListener('error', function() {
alert('error')
})
}
img.complete
cuộc gọi và addEventListener
cuộc gọi?
load
người nghe sự kiện phải ở trong một else
mệnh đề, như img.complete
có thể trở thành sự thật trước khi load
sự kiện được kích hoạt, do đó nếu bạn không có khả năng đã loaded
gọi hai lần (lưu ý điều này tương đối có khả năng thay đổi img.complete
chỉ trở thành sự thật khi sự kiện hỏa hoạn).
Image.onload () thường sẽ hoạt động.
Để sử dụng nó, bạn cần chắc chắn ràng buộc trình xử lý sự kiện trước khi bạn đặt thuộc tính src.
Liên kết liên quan:
Cách sử dụng ví dụ:
window.onload = function () {
var logo = document.getElementById('sologo');
logo.onload = function () {
alert ("The image has loaded!");
};
setTimeout(function(){
logo.src = 'https://edmullen.net/test/rc.jpg';
}, 5000);
};
<html>
<head>
<title>Image onload()</title>
</head>
<body>
<img src="#" alt="This image is going to load" id="sologo"/>
<script type="text/javascript">
</script>
</body>
</html>
load
sự kiện này không hợp lệ? html.spec.whatwg.org/multipage/webappapis.html#handler-onload là định nghĩa của onload
trình xử lý sự kiện.
Bạn có thể sử dụng thuộc tính .complete của lớp hình ảnh Javascript.
Tôi có một ứng dụng nơi tôi lưu trữ một số đối tượng Hình ảnh trong một mảng, nó sẽ được thêm động vào màn hình và khi chúng đang tải, tôi viết các bản cập nhật cho một div khác trên trang. Đây là một đoạn mã:
var gAllImages = [];
function makeThumbDivs(thumbnailsBegin, thumbnailsEnd)
{
gAllImages = [];
for (var i = thumbnailsBegin; i < thumbnailsEnd; i++)
{
var theImage = new Image();
theImage.src = "thumbs/" + getFilename(globals.gAllPageGUIDs[i]);
gAllImages.push(theImage);
setTimeout('checkForAllImagesLoaded()', 5);
window.status="Creating thumbnail "+(i+1)+" of " + thumbnailsEnd;
// make a new div containing that image
makeASingleThumbDiv(globals.gAllPageGUIDs[i]);
}
}
function checkForAllImagesLoaded()
{
for (var i = 0; i < gAllImages.length; i++) {
if (!gAllImages[i].complete) {
var percentage = i * 100.0 / (gAllImages.length);
percentage = percentage.toFixed(0).toString() + ' %';
userMessagesController.setMessage("loading... " + percentage);
setTimeout('checkForAllImagesLoaded()', 20);
return;
}
}
userMessagesController.setMessage(globals.defaultTitle);
}
Bạn có thể sử dụng sự kiện load () - trong jQuery nhưng nó sẽ không kích hoạt nếu hình ảnh được tải từ bộ đệm của trình duyệt. Plugin này https://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js có thể được sử dụng để khắc phục vấn đề đó.
Cuộc sống quá ngắn cho jquery.
function waitForImageToLoad(imageElement){
return new Promise(resolve=>{imageElement.onload = resolve})
}
var myImage = document.getElementById('myImage');
var newImageSrc = "https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620"
myImage.src = newImageSrc;
waitForImageToLoad(myImage).then(()=>{
// Image have loaded.
console.log('Loaded lol')
});
<img id="myImage" src="">
src
với JS.
myImage.src = https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620
không lừa
Đây là jQuery tương đương:
var $img = $('img');
if ($img.length > 0 && !$img.get(0).complete) {
$img.on('load', triggerAction);
}
function triggerAction() {
alert('img has been loaded');
}
Không phù hợp cho năm 2008 khi câu hỏi được hỏi, nhưng những ngày này nó hoạt động tốt với tôi:
async function newImageSrc(src) {
// Get a reference to the image in whatever way suits.
let image = document.getElementById('image-id');
// Update the source.
img.src = src;
// Wait for it to load.
await new Promise((resolve) => { image.onload = resolve; });
// Done!
console.log('image loaded! do something...');
}
các chức năng này sẽ giải quyết vấn đề, bạn cần thực hiện DrawThumbnails
chức năng và có một biến toàn cục để lưu trữ hình ảnh. Tôi thích có được điều này để làm việc với một đối tượng lớp có ThumbnailImageArray
biến thành viên, nhưng đang gặp khó khăn!
gọi như trong addThumbnailImages(10);
var ThumbnailImageArray = [];
function addThumbnailImages(MaxNumberOfImages)
{
var imgs = [];
for (var i=1; i<MaxNumberOfImages; i++)
{
imgs.push(i+".jpeg");
}
preloadimages(imgs).done(function (images){
var c=0;
for(var i=0; i<images.length; i++)
{
if(images[i].width >0)
{
if(c != i)
images[c] = images[i];
c++;
}
}
images.length = c;
DrawThumbnails();
});
}
function preloadimages(arr)
{
var loadedimages=0
var postaction=function(){}
var arr=(typeof arr!="object")? [arr] : arr
function imageloadpost()
{
loadedimages++;
if (loadedimages==arr.length)
{
postaction(ThumbnailImageArray); //call postaction and pass in newimages array as parameter
}
};
for (var i=0; i<arr.length; i++)
{
ThumbnailImageArray[i]=new Image();
ThumbnailImageArray[i].src=arr[i];
ThumbnailImageArray[i].onload=function(){ imageloadpost();};
ThumbnailImageArray[i].onerror=function(){ imageloadpost();};
}
//return blank object with done() method
//remember user defined callback functions to be called when images load
return { done:function(f){ postaction=f || postaction } };
}
addThumbnailImages
chức năng của bạn . Cắt nó xuống mã liên quan và tôi sẽ xóa -1.
Nếu mục tiêu là tạo kiểu cho img sau khi trình duyệt hiển thị hình ảnh, bạn nên:
const img = new Image();
img.src = 'path/to/img.jpg';
img.decode().then(() => {
/* set styles */
/* add img to DOM */
});
bởi vì trình duyệt đầu tiên loads the compressed version of image
, sau đó decodes it
, cuối cùng paints
nó vì không có sự kiện nào cho paint
bạn nên chạy logic của bạn sau khi trình duyệt có decoded
thẻ img.
Nếu bạn đang sử dụng React.js, bạn có thể làm điều này:
render() {
// ...
<img
onLoad={() => this.onImgLoad({ item })}
onError={() => this.onImgLoad({ item })}
src={item.src} key={item.key}
ref={item.key} />
// ...}
Ở đâu: