質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

JavaScript 画像動画の切替 詳細の表示 イベントハンドラ

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,569

may88seiji

score 69

実現したいこと

1,画像をクリックすると埋め込まれた動画に切り替わる。
2,画像と動画にmouseover mouseoutすると詳細文が表示される。
3,管理がしやすい、きれいなcoding(記事の増減時など)

試したこと

function を以下三つ用意し、各イベントハンドラと対応させました。
show(詳細文を表示する)→onmouseover
hide(詳細文を非表示にする)→onmouseout
change(画像と動画を切替える)→onclick
切替え操作はcssをdisplay:none;⇄block;にて書き換えることによって行っています。
一応、1,2,の機能を実現できたのですが、思いついた機能を付け加えただけのcodingになっております。
それゆえ記事を増やす場合に必要な記述が多くなっているのが現状です。
皆様には、3の”管理がしやすい、きれいなcoding”についてアドバイスをいただければ幸いです。(添付したcodeと全く異なる構造でも嬉しいです)
どうぞよろしくお願いします。

該当のソースコード

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
        .item {
            width: 25%;
            float: left;
            padding-bottom: 5%;
        }

        .item-box {
            height: 200px;
            width: 200px;
            margin: auto;
            background-color: #11D8B3;
            border-radius: 5px;
        }

        #movie1,
        #movie2{
            display: none;
        }

        .articles > div {
            display: none;
            font-size: 40px;
            margin: auto;
            float: left;
        }
    </style>
</head>

<body>
    <!--画像と動画-->
    <div class="item">
        <div class="item-box">
            <div id="img1" onclick="change(1)"><img onmouseover="show(1)" onmouseout="hide(1)" src="img.jpeg" alt="img dog" width="200" height="200" alt=""></div>
            <iframe id="movie1" onmouseover="show(1)" onmouseout="hide(1)" width="200" height="200" src="https://www.youtube.com/embed/j5PLngd2WN0" allowfullscreen></iframe>
        </div>
    </div>

    <div class="item">
        <div class="item-box">
            <div id="img2" onclick="change(2)"><img onmouseover="show(2)" onmouseout="hide(2)" src="img.jpeg" alt="img cat" width="200" height="200" alt=""></div>
            <iframe id="movie2" onmouseover="show(2)" onmouseout="hide(2)" width="200" height="200" src="https://www.youtube.com/embed/obTj1qvotdc" allowfullscreen></iframe>
        </div>
    </div>

    <div class="articles">
        <!--ここから詳細文-->
        <div id="article1">The term "domestic dog" is generally used for both domesticated and feral varieties. The English word dog comes from Middle English dogge, from Old English docga, a "powerful dog breed".
        </div>
        <div id="article2">ネコ(猫)は、狭義にはネコ目(食肉目)- ネコ亜目- ネコ科- ネコ亜科- ネコ属- ヤマネコ種- イエネコ亜種に分類される小型哺乳類であるイエネコ(家猫、学名:Felis silvestris catus)の通称である。
        </div>
    </div>


    <script type="text/javascript">
        function show(num) {
            document.getElementById("article" + num).style.display = "block";
            return false;
        }

        function hide(num) {
            document.getElementById("article" + num).style.display = "none";
            return false;
        }

        function change(num) {
            document.getElementById("img" + num).style.display = "none";
            document.getElementById("movie" + num).style.display = "block";
            return false;
        };
    </script>
</body>

</html>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

「『class="item-box"』の要素以下は構成要素とその出現順が固定」というルールを決められれば各イベントをjavascriptで付け足していく、という方法がとれるかも。

function show(num) {
  return function(){
    document.getElementById("article" + num).style.display = "block";
    return false;
  };
}

function hide(num) {
  return function(){
    document.getElementById("article" + num).style.display = "none";
    return false;
  };
}

function change(num) {
  return function(){
    document.getElementById("img" + num).style.display = "none";
    document.getElementById("movie" + num).style.display = "block";
    return false;
  };
};

window.onload=function(){
  var itemboxes = document.getElementsByClassName('item-box');
  for(var i = 0; i < itemboxes.length; i++){
    var num = i + 1;
    var node;
    // div
    node = itemboxes[i].getElementsByTagName('div')[0];
    node.onclick=change(num);
    // img
    node = itemboxes[i].getElementsByTagName('img')[0];
    node.onmouseover=show(num);
    node.onmouseout=hide(num);
    // iframe
    node = itemboxes[i].getElementsByTagName('iframe')[0];
    node.onmouseover=show(num);
    node.onmouseout=hide(num);
  }
};


スクリプトをこんな具合にしておけばhtml部は

<!--画像と動画-->
<div class="item">
    <div class="item-box">
        <div id="img1"><img src="img.jpeg" alt="img dog" width="200" height="200" alt=""></div>
        <iframe id="movie1" width="200" height="200" src="https://www.youtube.com/embed/j5PLngd2WN0" allowfullscreen></iframe>
    </div>
</div>

<div class="item">
    <div class="item-box">
        <div id="img2"><img src="img.jpeg" alt="img cat" width="200" height="200" alt=""></div>
        <iframe id="movie2" width="200" height="200" src="https://www.youtube.com/embed/obTj1qvotdc" allowfullscreen></iframe>
    </div>
</div>

<div class="articles">
    <!--ここから詳細文-->
    <div id="article1">The term "domestic dog" is generally used for both domesticated and feral varieties. The English word dog comes from Middle English dogge, from Old English docga, a "powerful dog breed".
    </div>
    <div id="article2">ネコ(猫)は、狭義にはネコ目(食肉目)- ネコ亜目- ネコ科- ネコ亜科- ネコ属- ヤマネコ種- イエネコ亜種に分類される小型哺乳類であるイエネコ(家猫、学名:Felis silvestris catus)の通称である。
    </div>
</div>


という具合に「on~」の記述を大幅に削減できますね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/18 15:33

    おぉ、イベントハンドラの部分が削減できてますね。
    onloadとfor文の組み合わせ方、大変勉強になりました。
    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る