アプリ版:「スタンプのみでお礼する」機能のリリースについて

このプログラムは晴れという文字が表示された場合晴れのアイコンを表示し、雨という文章が表示された場合雨のアイコンを表示するものなのですが二つ目以降の文章に画像が表示されません(下画像参照)

どのように改善したら2つ目以降もアイコンが表示されるのでしょうか。



<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script>
window.addEventListener('load', function() {
var text = document.getElementById('text').textContent;
var imgWindow = document.getElementById('image_window');
var textList = ['晴れ', '雨'];
var imgList = ['Hare.png', 'Ame.png'];
var index = textList.findIndex(function(element) {
var reg = new RegExp(element);
return text.search(reg) != -1;
});
if (index != -1) {
var image = document.createElement('img');
image.src = imgList[index];
imgWindow.appendChild(image);
}
},false);
</script>
</head>
<body>
<p id="text">今日の天気は晴れです。<span id="image_window"></span></p><br>
<p id="text">明日の天気は雨です。<span id="image_window"></span></p><br>
<p id="text">明後日の天気は晴れです。<span id="image_window"></span></p><br>
</body>
</html>



このあとidをnameに変更してみたのですが逆に一行目にも画像が表示されなくなりました

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script>
window.addEventListener('load', function() {
var text = document.getElementByName('text').textContent;
var imgWindow = document.getElementByName('image_window');
var textList = ['晴れ', '雨',];
var imgList = ['Hare.png', 'Ame.png'];
var index = textList.findIndex(function(element) {
var reg = new RegExp(element);
return text.search(reg) != -1;
});
if (index != -1) {
var image = document.createElement('img');
image.src = imgList[index];
imgWindow.appendChild(image);
}
},false);
</script>
</head>
<body>
<p name="text">天気は晴れです<span name="image_window"></span></p><br>

<p name="text">天気は雨です<span name="image_window"></span></p><br>

<p name="text">天気は雨です<span name="image_window"></span></p><br>
</body>
</html>
 
こうゆうことですか?
こうすると一行目も画像が表示されないのですが

「ジャバスプリクトの質問」の質問画像

A 回答 (2件)

こんばんは



そもそもですが、要素のIDは文書内で固有であることが原則です。
ですので、ご提示の最初の文書はHTMLの文法違反になっています。
一方、getElementByIdはIDを利用して要素を取得するメソッドですが、(当然ながら)ひとつの要素を返します。
従って、
>二つ目以降の文章に画像が表示されません
となります。
https://developer.mozilla.org/ja/docs/Web/API/Do …

>こうすると一行目も画像が表示されないのですが
getElementByNameというメソッドは存在しないので、エラーとなって停止しているものと思われます。
使うなら、getElementsByNameですが、こちらは複数の要素を返すので、(仮に要素がひとつしかなくても)NodeListと言われる配列に似たオブジェクトを返します。
https://developer.mozilla.org/ja/docs/Web/API/Do …

こちらの場合は、複数を扱う扱い方をする必要があります。
具体的には、添字でforループ等でまわすか、あるいは、forEachなどで順に処理するといった方法になるでしょう。
https://developer.mozilla.org/ja/docs/Web/API/No …
    • good
    • 0

No1です



少し考え方を変えていますが、こんなのはいかがでしょうか。

<!DOCTYPE HTML>
<html lang="ja">
<head><title>Sample</title>

<script type="text/javascript">
(()=>{
const textList = ["晴れ", "雨"];
const imgList = ["Hare.png", "Ame.png"];
let reg = new RegExp("(" + textList.join("|") + ")","gm");

window.addEventListener("DOMContentLoaded", ()=>{
document.querySelectorAll("p.text").forEach((e)=>{
let res = e.textContent.match(reg);
if(res){
res.forEach((r)=>{
let image = new Image();
image.src = imgList[textList.indexOf(r)]
e.appendChild(image);
});
}
});
});
})();
</script>

</head>
<body>
<p class="text">今日の天気は晴れです。</p>
<p class="text">明日の天気は雨です。</p>
<p class="text">明後日の天気は晴れです。</p>
<p class="text">月曜日の天気は晴れ一時にわか雨です。</p>
</body>
</html>
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!