Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
83
rated 0 times [  89] [ 6]  / answers: 1 / hits: 43895  / 8 Years ago, thu, september 29, 2016, 12:00:00

In isomorphic rendered page image can be downloaded before main script.js file. So image can be already loaded before react register onLoad event - never trigger this event.



script.js



constructor(props) {
super(props);
this.handleImageLoaded = this.handleImageLoaded.bind(this);
}

handleImageLoaded() {
console.log('image loaded');
}

render() {
return (
<img src='image.jpg' onLoad={this.handleImageLoaded} />
);
}





Scenario 1 - image.jpg is bigger than script.js



image.jpg



In this scenario everything is working fine. Event is registered before image is finally loaded so in console is image loaded message.






Scenario 2 - image.jpg is smaller than script.js



image.jpg



This scenario you can see problem described at the beginning of post. onLoad event is not triggered.






Question



What can I do in order to trigger onLoad event in scenario 2?






EDIT: Soviut answer implementation



To detect if image is ready on render you should check complete property on pure javascript img object:



constructor(props) {
super(props);
this.state = { loaded: false };
this.handleImageLoaded = this.handleImageLoaded.bind(this);
this.image = React.createRef();
}

componentDidMount() {
const img = this.image.current;
if (img && img.complete) {
this.handleImageLoaded();
}
}

handleImageLoaded() {
if (!this.state.loaded) {
console.log('image loaded');
this.setState({ loaded: true });
}
}

render() {
return (
<img src='image.jpg' ref={this.image} onLoad={this.handleImageLoaded} />
);
}

More From » reactjs

 Answers
23

You could check the complete property on the image before applying the onload event.



if (!img.complete) {
// add onload listener here
}

[#60552] Tuesday, September 27, 2016, 8 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
anabellejaynav

Total Points: 176
Total Questions: 105
Total Answers: 105

Location: Croatia
Member since Fri, Sep 11, 2020
4 Years ago
;