Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

iframeใจ่ฆชใƒšใƒผใ‚ธ้–“ใงpostMessageใ‚’ๅˆฉ็”จใ—ใฆใƒ‡ใƒผใ‚ฟ้€ๅ—ไฟกใ‚’่กŒใ†

14
Posted at

ใฏใ˜ใ‚ใซ

iframe่กจ็คบ้ƒจๅˆ†ใฎใ‚ฏใƒชใƒƒใ‚ฏใ‚คใƒ™ใƒณใƒˆใ‚’ๅ–ๅพ—ใ™ใ‚‹ใจใ„ใ†่จ˜ไบ‹ใงใ€iframeๅ†…ใฎใ‚คใƒ™ใƒณใƒˆใ‚’iframeใฎcontentWindowใซๅฏพใ—addEventlistenerใ‚’็™ป้Œฒใ—ใฆ่ฆชใƒšใƒผใ‚ธใงๅ–ๅพ—ใ™ใ‚‹ๆ–นๆณ•ใ‚’็ดนไป‹ใ—ใพใ—ใŸใ€‚

ใ“ใฎ่จ˜ไบ‹ใงใฏpostMessageใ‚’ๅˆฉ็”จใ—ใฆiframeใจ่ฆชใƒšใƒผใ‚ธ้–“ใงใ‚„ใ‚Šๅ–ใ‚Šใ™ใ‚‹ๆ–นๆณ•ใ‚’็ดนไป‹ใ—ใพใ™ใ€‚

ใ“ใฎ่จ˜ไบ‹ใฎๅฏพ่ฑก่€…

  • ใƒšใƒผใ‚ธใซๅŸ‹ใ‚่พผใ‚“ใ iframe่ฆ็ด ใ‹ใ‚‰ๆƒ…ๅ ฑใ‚’ๅ–ๅพ—ใ—ใŸใ„
  • ใƒšใƒผใ‚ธใซๅŸ‹ใ‚่พผใ‚“ใ iframe่ฆ็ด ใจ่ฆชใƒšใƒผใ‚ธ้–“ใง็›ธไบ’้–“ใฎใƒ‡ใƒผใ‚ฟ้€ๅ—ไฟกใ‚’่กŒใ„ใŸใ„
  • ใƒšใƒผใ‚ธใซiframeๅŸ‹ใ‚่พผใฟใ‚’ใ™ใ‚‹ๅ‰ๆใฎใƒšใƒผใ‚ธใ‚’ไฝœๆˆใ—ใฆใ€ใ‚คใƒ™ใƒณใƒˆ็™บ็”Ÿๆ™‚ใซ่ฆชใƒšใƒผใ‚ธใซๆƒ…ๅ ฑใ‚’ๆธกใ—ใŸใ„

iframeใจ่ฆชใƒšใƒผใ‚ธ้–“ใฎใƒ‡ใƒผใ‚ฟ้€ๅ—ไฟก

postMessageใ‚’ๅˆฉ็”จใ—ใŸ้€ๅ—ไฟกใฎๆ–นๆณ•

ๅญใƒšใƒผใ‚ธ

ใƒ‡ใƒผใ‚ฟใ‚’่ฆชใƒšใƒผใ‚ธใซ้€ไฟกใ™ใ‚‹ๅ ดๅˆ

window.parent.postMessage(message, targetOrigin);

// ไพ‹
window.parent.postMessage("sample.jpใงใ—ใ‹ๅ—ไฟกๅ‡บๆฅใชใ„ใƒกใƒƒใ‚ปใƒผใ‚ธใงใ™", "https://sample.jp");

window.parent.postMessage({
    type: "sample",
    data: {
        message: "่ชฐใงใ‚‚ๅ—ไฟกใงใใ‚‹ใƒกใƒƒใ‚ปใƒผใ‚ธใงใ™",
    },
}, "*");

const example = {
    type: "example",
    data: {
        message: "JSONใงๆธกใ™ใƒกใƒƒใ‚ปใƒผใ‚ธใงใ™",
    }
}

window.parent.postMessage(JSON.stringfy(example), "*");
ๅผ•ๆ•ฐใฎ่ชฌๆ˜Ž
  • message

ไป–ใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใซ้€ใ‚‰ใ‚Œใ‚‹ใƒ‡ใƒผใ‚ฟใงใ™ใ€‚
ๆฑบใ‚ใ‚‰ใ‚ŒใŸๅž‹ใฏ็„กใ„ใงใ™ใŒใ€ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใงๆธกใ™ใ“ใจใงtypeใ‚„dataใชใฉ่ฆชใƒšใƒผใ‚ธใงๆ‰ฑใ„ใ‚„ใ™ใ„ๅ†…ๅฎนใงๆธกใ™ใ“ใจใŒๅ‡บๆฅใพใ™ใ€‚

  • targetOrigin

ใƒ‡ใƒผใ‚ฟใ‚’้€ไฟกใ—ใŸ้š›ใฎๅ—ใ‘ๅ–ใ‚Šๅดใฎใ‚ชใƒชใ‚ธใƒณใ‚’้™ๅฎšใ™ใ‚‹ใ“ใจใŒๅ‡บๆฅใพใ™ใ€‚
ไพ‹ใˆใฐhttps://sample.jpใจใ—ใŸๅ ดๅˆใฏใ€ใ‚ชใƒชใ‚ธใƒณใŒhttps://sample.jpใฎใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใงใ—ใ‹ใƒ‡ใƒผใ‚ฟใฏๅ—ไฟกๅ‡บๆฅใพใ›ใ‚“ใ€‚
postMessageใฎ้€ไฟกๅ…ˆใŒๆฑบใพใฃใฆใ„ใ‚‹ๅ ดๅˆใฏใ‚ชใƒชใ‚ธใƒณๆŒ‡ๅฎšใ‚’ใ—ใพใ—ใ‚‡ใ†ใ€‚

ใƒ‡ใƒผใ‚ฟใ‚’่ฆชใƒšใƒผใ‚ธใ‹ใ‚‰ๅ—ไฟกใ™ใ‚‹ๅ ดๅˆ

window.addEventListener("message", (response) => {
    // ๅ–ๅพ—ใ—ใŸๅ†…ๅฎนใ‚’ๅˆฉ็”จใ—ใŸๅ‡ฆ็†
}) 

postMessageใง้€ไฟกใ•ใ‚ŒใŸใƒ‡ใƒผใ‚ฟใ‚’ๅ—ใ‘ๅ–ใ‚‹ใซใฏใ€addEventListenerใง็™ป้Œฒใ—ใŸmessageใ‚คใƒ™ใƒณใƒˆใ‚’ๆคœ็Ÿฅใ™ใ‚‹ใ“ใจใงๅ–ๅพ—ใ™ใ‚‹ใ“ใจใŒๅ‡บๆฅใพใ™ใ€‚

่ฆชใƒšใƒผใ‚ธ

ใƒ‡ใƒผใ‚ฟใ‚’iframeใงๅŸ‹ใ‚่พผใ‚“ใ ๅญใƒšใƒผใ‚ธใซ้€ไฟกใ™ใ‚‹ๅ ดๅˆ

const iframeElement = document.querySelector("iframe");
iframeElement.contentWindow.postMessage(message, targetOrigin);

iframeใฎWindowใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใซใ‚ขใ‚ฏใ‚ปใ‚นใ—ใฆใ€ๅ…ˆใปใฉใจๅŒใ˜ใ‚ˆใ†ใซpostMessageใ‚’ๅฎŸ่กŒใ—ใฆใ„ใพใ™ใ€‚

ใƒ‡ใƒผใ‚ฟใ‚’ๅญใƒšใƒผใ‚ธใ‹ใ‚‰ๅ—ไฟกใ™ใ‚‹ๅ ดๅˆ

window.addEventListener("message", (response) => {
    // ๅ–ๅพ—ใ—ใŸๅ†…ๅฎนใ‚’ๅˆฉ็”จใ—ใŸๅ‡ฆ็†
}) 

ใ“ใกใ‚‰ใฏๅญใƒšใƒผใ‚ธใงๅ—ไฟกใ™ใ‚‹ๅ ดๅˆใจ้•ใ„ใ‚ใ‚Šใพใ›ใ‚“ใ€‚


ไปฅไธŠใŒiframeใจ่ฆชใƒšใƒผใ‚ธ้–“ใงpostMessageใ‚’ๅˆฉ็”จใ—ใฆใƒ‡ใƒผใ‚ฟ้€ๅ—ไฟกใ‚’่กŒใ†ๆ–นๆณ•ใซใชใ‚Šใพใ™ใ€‚

ไฝฟ็”จไพ‹

ไปฅไธ‹postMessageใฎไฝฟ็”จไพ‹ใงใ™ใ€‚iframeใจ่ฆชใƒšใƒผใ‚ธใง้€ฃๆบใ—ใฆ็›ธไบ’้–“ใฎใƒ‡ใƒผใ‚ฟๅ—ใ‘ๆธกใ—ใ‚’ใ™ใ‚‹ไพ‹ใ‚’็ดนไป‹ใ—ใพใ™ใ€‚

็ขบ่ช็’ฐๅขƒ
ใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰

Videotogif (5).gif

iframeใงใƒœใ‚ฟใƒณใ‚ฏใƒชใƒƒใ‚ฏใ•ใ‚ŒใŸๅ›žๆ•ฐใ‚’่ฆชใƒšใƒผใ‚ธใซๆธกใ™

iframe

let leftCount = 0;
const leftClick = () => {
    const message = {
        type: "click",
        data: {
            name: "left",
            count: leftCount,
        }
    }
    window.parent.postMessage(message, "*");
    leftCount++;
}

let rightCount = 0;
const rightClick = () => {
    const message = {
        type: "click",
        data: {
            name: "right",
            count: rightCount,
        }
    }
    window.parent.postMessage(message, "*");
    rightCount++;
}

// ใ‚ชใƒชใ‚ธใƒณใŒ็•ฐใชใ‚‹ใฎใง่ฆชใƒšใƒผใ‚ธใงใฏๅ—ไฟกๅ‡บๆฅใชใ„
const originRestricted = () => {
    const message = {
        type: "click",
        data: {
            name: "restricted",
        }
    }
    window.parent.postMessage(message, "https://sample.jp");
}

่ฆชใƒšใƒผใ‚ธ

window.addEventListener("message", (response) => {
    if (response.data.type === "click") {
        const data = response.data.data;
        if (data.name === "left") {
            const leftNumberElement = document.querySelector("#left-number");
            leftNumberElement.innerHTML = data.count;
        } else if (data.name === "right") {
            const rightNumberElement = document.querySelector("#right-number");
            rightNumberElement.innerHTML = data.count;
        }
    }
})

่ฆชใƒšใƒผใ‚ธใง้ธๆŠžใ•ใ‚ŒใŸ่‰ฒใ‚’iframeใง่กจ็คบใ™ใ‚‹

่ฆชใƒšใƒผใ‚ธ

const postColor = (color) => {
    const iframeElement = document.querySelector("iframe");
    const message = {
        type: "color",
        data: {
            color: color,
        }
    }
    iframeElement.contentWindow.postMessage(message, "*");
}

iframe

window.addEventListener("message", (response) => {
    if (response.data.type === "color") {
        const messageAreaElement = document.querySelector(".message-area");
        const createDivElement = document.createElement("div");
        const color = response.data.data.color;
        if (color === "red") {
            createDivElement.className = "red";
        } else if (color === "blue") {
            createDivElement.className = "blue";
        } else if (color === "yellow") {
            createDivElement.className = "yellow";
        }
        messageAreaElement.appendChild(createDivElement);
    }
})
14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

@manzoku_bukuro's pickup articles

manzoku_bukuro

@manzoku_bukuro(ๆบ€่ถณ ่ข‹)

ใƒ•ใƒญใƒณใƒˆใ‚จใƒณใƒ‰ใ‚จใƒณใ‚ธใƒ‹ใ‚ข ใจใซใ‹ใใ‚ขใ‚ฆใƒˆใƒ—ใƒƒใƒˆ ๆ—ฅใ€…ใฎๆฅญๅ‹™ใงๅพ—ใŸ็Ÿฅ่ฆ‹ใฏๅณ่จ˜ไบ‹ใซๆฎ‹ใ—ใฆใ„ใใพใ™

Today's trending articles

n-isd

่ชญใฟๆ–นใ‚’้–“้•ใˆใŒใกใชใ‚จใƒณใ‚ธใƒ‹ใ‚ข็”จ่ชž้›† ~ ไผš่ญฐใงๆฅใšใ‹ใ—ใ„ๆ€ใ„ใ‚’ใ—ใชใ„ใŸใ‚ใซ ~

Linked from these articles

Comments

No comments

Let's comment your feelings that are more than good

Being held Article posting campaign

14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address