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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

408閲覧

javascript rect 画像スクロールのプログラム

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/05/08 22:39

javascriptを勉強中です。

コンソールログを見たのですが、エラー箇所がわからない為質問させてください。

開始ボタンでスクロールを開始し、停止ボタンで停止するプログラムです。
停止位置を数字の途中でなく区切りの良い位置で止めるプログラムです。
数字は、0、1、2、3、4、5、6、7、8、9、0の10文字です。
1文字の高さは60pxです。

テキストの通りに入力しているつもりなのですが、開始ボタンを押しても動作しません。
間違っている箇所はありますでしょうか?

javascript

1<!DOCTYPE html> 2<html> 3<head> 4 5<script> 6 7 var cy=0,y=50,TimeId; 8 function stop() 9 { 10 clearInterval(TimeId); 11 var obj=document.getElementById("myimg"); 12 cy=parseInt(cy/60)*60; 13 y=parseInt((y-50)/60)*60+50; 14 obj.style.clip="rect("+cy+"px,60px,"+(cy+60)+"px,0px)"; 15 obj.style.top=y+"px"; 16 } 17 18 function scroll() 19 { 20 var obj=document.getElementById("myimg"); 21 obj.style.clip="rect("+cy+"px,60px,"+(cy+60)+"px,0px)"; 22 obj.style.top=y+"px"; 23 cy+=10; 24 y-=10; 25 26 if (cy>=60*10){ 27 cy=0; 28 y=50; 29 } 30 } 31 32</script> 33 34</head> 35<body> 36 37<input type="button" value="開始" onClick="TimeId=setInterval(scroll,100)" style="position:absolute;left:50px;top:20px" /> 38<input type="button" value="停止" onClick="stop()" style="position:absolute;left:90px;top:20px" /> 39<img id="myimg" src="number.gif" style="position:absolute;left:50px;top:50px;clip:rect(0px,60px,60px,0px)" /> 40 41</body> 42</html>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

修正手順

実行すれば、エラーはわかりますが…。

TypeError: Illegal invocation

各変数値は確認しておいて、損はないでしょう。
(jsfiddleではconsole.logが失敗するので、ローカルテスト)

HTML

1<!DOCTYPE html> 2<title>sample</title> 3<input type="button" value="開始" onClick="console.log(TimeId, window.scroll, scroll);" style="position:absolute;left:50px;top:20px" /> 4<input type="button" value="停止" onClick="stop()" style="position:absolute;left:90px;top:20px" /> 5<img id="myimg" src="number.gif" style="position:absolute;left:50px;top:50px;clip:rect(0px,60px,60px,0px)" /> 6<script> 7'use strict'; 8var cy=0,y=50,TimeId; 9 10function stop() 11{ 12 clearInterval(TimeId); 13 var obj=document.getElementById("myimg"); 14 cy=parseInt(cy/60)*60; 15 y=parseInt((y-50)/60)*60+50; 16 obj.style.clip="rect("+cy+"px,60px,"+(cy+60)+"px,0px)"; 17 obj.style.top=y+"px"; 18} 19 20function scroll() 21{ 22 var obj=document.getElementById("myimg"); 23 obj.style.clip="rect("+cy+"px,60px,"+(cy+60)+"px,0px)"; 24 obj.style.top=y+"px"; 25 cy+=10; 26 y-=10; 27 28 if (cy>=60*10){ 29 cy=0; 30 y=50; 31 } 32} 33</script>

変数 scroll の値が期待通りでない為、window.scroll に修正。

HTML

1<input type="button" value="開始" onClick="TimeId=setInterval(window.scroll,100)" style="position:absolute;left:50px;top:20px" />

addEventListener

HTMLのonclick属性値は特別なスコープで実行される為、addEventListener のコードに慣れておくことを推奨します。

HTML

1<!DOCTYPE html> 2<title>sample</title> 3<input type="button" value="開始" style="position:absolute;left:50px;top:20px" /> 4<input type="button" value="停止" style="position:absolute;left:90px;top:20px" /> 5<img id="myimg" src="number.gif" style="position:absolute;left:50px;top:50px;clip:rect(0px,60px,60px,0px)" /> 6<script> 7'use strict'; 8var cy=0,y=50,TimeId; 9 10function stop(event) 11{ 12 clearInterval(TimeId); 13 var obj=document.getElementById("myimg"); 14 cy=parseInt(cy/60)*60; 15 y=parseInt((y-50)/60)*60+50; 16 obj.style.clip="rect("+cy+"px,60px,"+(cy+60)+"px,0px)"; 17 obj.style.top=y+"px"; 18} 19 20function scroll() 21{ 22 var obj=document.getElementById("myimg"); 23 obj.style.clip="rect("+cy+"px,60px,"+(cy+60)+"px,0px)"; 24 obj.style.top=y+"px"; 25 cy+=10; 26 y-=10; 27 28 if (cy>=60*10){ 29 cy=0; 30 y=50; 31 } 32} 33 34document.querySelector('input[type=button][value="開始"]').addEventListener('click', function (event){ 35 TimeId = setInterval(scroll, 100); 36}, false); 37 38document.querySelector('input[type=button][value="停止"]').addEventListener('click', stop, false); 39</script> 40

Re: hamutail さん

投稿2020/05/09 02:09

編集2020/05/09 02:15
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2020/05/09 02:10

ああ、自己解決されていますね。 いずれにしても、HTMLのonclick属性は推奨しません。
退会済みユーザー

退会済みユーザー

2020/05/09 02:24

回答ありがとうございますm(__)m いろいろアドバイスありがとうございます! 後でじっくり見たいと思います。
退会済みユーザー

退会済みユーザー

2020/05/09 12:23

変数 scroll の値が期待通りでない為、window.scroll に修正。の通りにしたら、変数名を変えなくても動作しましたので、改めましてベストアンサーに選択させていたしました。
guest

0

onclickで実行する関数名がscrollになってないからでは?

投稿2020/05/08 23:15

okina

総合スコア471

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/08 23:21

回答ありがとうございますm(__)m 関数名がscrollになってないからでは?とのアドバイスですが、どういう風に書き直したら宜しいでしょうか?
okina

2020/05/08 23:26

onClick="scroll()"の方が正しい気はします。これで動くか検証はしていませんが、、、
退会済みユーザー

退会済みユーザー

2020/05/08 23:33

回答ありがとうございますm(__)m 試してみましたが、そこだけ変えただけでは、動きませんでした。
okina

2020/05/09 01:29

たしかにこれで動くわけなかったです。 元の内容でconsoleの内容教えてください
退会済みユーザー

退会済みユーザー

2020/05/09 01:39

回答ありがとうございますm(__)m 開始ボタンを押すと、Uncaught TypeError: Illegal invocation と表示されて、左側に赤枠に白文字で数字が1づつ加算されていきます。 停止ボタンを押すと、加算が止まります。
退会済みユーザー

退会済みユーザー

2020/05/09 01:47

アドバイスを参考に検索してみましたところ、「ネイティブ関数の別名を作っちゃダメ」エラーだそうです。 http://gakuzoo.hatenablog.com/entry/20130126/1359167495 関数名を別の関数名に変えたところ動作しました。 アドバイスありがとうございます!
okina

2020/05/09 01:51

あ、なるほど、、、初めて見ましたそんなエラーよかったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問