犬と猫の画像を表示する[Visualforce]

概要

Visualforceで犬と猫の画像を表示します。
犬の画像はDog APIから、猫の画像はThe Cat APIから取得します。

ソースコード

DogCatPic.vfp

<apex:page docType="html-5.0" LightningStylesheets="true">
    <html lang="ja">
        <head>
            <meta charset="UTF-8" />
            <meta name="viewport" content="width=device-width, initial-scale=1.0" />
            <title>お犬様とお猫様</title>
            <apex:slds />
        </head>
        <body>
            <div class="slds-align_absolute-center">
                <div class="slds-size_2-of-3">
                    <apex:pageBlock >
                    <div class="slds-grid slds-einstein-header slds-card__header">
                        <header class="slds-media slds-media_center slds-has-flexi-truncate">
                            <div class="slds-grid slds-grid_vertical-align-center slds-size_3-of-4 slds-medium-size_2-of-3">
                                <h1 class="slds-truncate" title="お犬様とお猫様">
                                    <span class="slds-text-heading_large">お犬様とお猫様</span>
                                </h1>
                            </div>
                            <div class="slds-einstein-header__figure slds-size_1-of-4 slds-medium-size_1-of-3"></div>
                        </header>
                    </div>
                    <div class="slds-align_absolute-center">
                        <div class="slds-m-top_large">
                        <header class="slds-align_absolute-center">
                            <div class="slds-button-group" role="group">
  								<button id="dog" class="slds-button slds-button_neutral slds-text-heading_medium slds-p-around_small">今日のお犬様</button>
  								<button id="cat" class="slds-button slds-button_neutral slds-text-heading_medium slds-p-around_small">今日のお猫様</button>
							</div>
                        </header>
                        <main class="slds-m-top_large">
                            <section class="pic-container">
                            </section>
                        </main>
                        </div>
                    </div>
                    </apex:pageBlock>
                </div>
            </div>
            <apex:include pageName="DogCatPicJs"/>
        </body>
    </html>
</apex:page>

DogCatPicJs.vfp

<apex:page >
    <script>
    const dogUrl = 'https://dog.ceo/api/breeds/image/random'; // Dog API
    const catUrl = 'https://api.thecatapi.com/v1/images/search?format=json'; // The Cat API
    
    const petSearchButton = document.querySelectorAll('.slds-button'),
          container = document.querySelector('.pic-container');
    
    let petInfo;
    
    // APIからペットの情報を取得する
    function requestPetInfo(baseUrl) {        
        fetch(baseUrl).then(response => response.json())
        .then(data => {
            this.petInfo = data;
        })
        .catch(err => console.log(err));
    }
            
    petSearchButton.forEach(function (button) {
    	button.addEventListener('click', event => {
            event.preventDefault();
            if(event.currentTarget.id === 'dog') { 
	        // Dog APIから犬の情報を取得する
    	    	requestPetInfo(dogUrl);           
        	// 取得した犬の画像を追加する
        	setTimeout(function () {
            	container.innerHTML = `<img src="${this.petInfo.message}"/>`;
 	    	container.classList.add('slds-box');
    	        container.classList.add('slds-m-bottom_medium');
        	}, 1000);
            } else {
                // The Cat APIから猫の情報を取得する
       		requestPetInfo(catUrl);
        	// 取得した猫の画像を追加する
        	setTimeout(function () {
            	container.innerHTML = `<img src="${this.petInfo[0].url}"/>`;
	        container.classList.add('slds-box');
   		container.classList.add('slds-m-bottom_medium');
        	}, 1000);
            }
        })
    })
    </script>
</apex:page>