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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

3056閲覧

TypeScriptでonkeyupを動作させる

mobile105

総合スコア20

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2020/05/20 18:21

編集2020/05/21 02:26

前提・実現したいこと

現在TypeScriptを勉強中です。
onkeyupを用いてfunctionを実行したいのですが下記のようなエラーが出て実行できません。

発生している問題・エラーメッセージ

Uncaught ReferenceError: test is not defined at HTMLInputElement.onkeyup

該当のソースコード

HTML

1<%= javascript_pack_tag 'test' %><!--jsファイル読み込み--> 2<input type="text" onkeyup="test('aaa')">

TypeScript

1function test(str: string) { 2 console.log(str); 3} 4

console.log('test')とすると結果は返ってくるためjsファイル自体の読み込みは正常に出来ていると思われます。

動作環境は
Ruby 2.6.5
Rails 6.0.1

Vue,React,Angular等のフレームワークは使用しておりません。

ご教示いただければ幸いです。

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

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

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

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

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

hoshi-takanori

2020/05/20 20:28

その TypeScript ファイルは HTML からどうやって読み込んで実行していますか?
miyabi_takatsuk

2020/05/21 01:07

なにかライブラリかフレームワークを使用している(React.js、Vue.js、Angularなど)のであれば、その質問タグの追加と、 質問文へ提示して下さい。 また、場合によっては、フレームワーク上のTypeScript構文をある程度まで記載必要かと思います。
miyabi_takatsuk

2020/05/21 02:17

なるほど、Ruby on RailsからTypeScriptを使用しているわけですね。 質問タグに、Ruby on Railsを追加してください。 あと、見る限り、TypeScriptではなく、JavaScriptな気がしますが、 いかがでしょうか? コメントアウトに、jsファイル読み込みと書いていますし。
guest

回答1

0

ベストアンサー

いくつか原因が考えられます。

  • testメソッドが、グローバルに定義となっていない。

on系の属性から呼び出せるものは、グローバルに定義されている、ないし、
グローバルスコープからアクセスできる変数やオブジェクトに限ります。
なので、そのtestメソッドが、(function(){ /* ここに定義されている */ })();などの中に定義されている場合、原則、on系の属性からは呼び出せません。

  • 構文がTypeScriptのため、メソッドとして認識されていない

これは限りなく薄いですが、
質問の構文function test(str: string)は、引数に型指定を行っておりますが、
現状、JavaScriptはまだ引数に型を指定はできません
よって、関数として正しく認識されていない可能性があります。
ただし、Ruby On Railsによって、TypeScriptをJavaScriptにコンパイルして返しているのであれば、
<%= javascript_pack_tag 'test' %>の構文でですね)この可能性は限りなく薄いでしょう。

  • Ruby On Railsによって、TypeScriptをJavaScriptにコンパイルする関係上、<script>要素生成のタイムラグがある

上記に若干付随しますが、コンパイルする関係上、<script>要素生成が遅れ、
<input onkeyup="test('aaa')">においてのtestメソッドの認識が先に走ってしまい、
testがない、とエラーが出てしまっている可能性です。
なので、その場合、HTMLの書き方や順番などに工夫が必要かと思います。
ただし、HTMLの、ブラウザからの解析の仕様上、この可能性も限りなく薄いです。

上記いずれの可能性でもないなどありましたら、コメントいただければと思います。

投稿2020/05/21 02:34

miyabi_takatsuk

総合スコア9555

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

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

mobile105

2020/05/21 03:12

お世話になります。 グローバルに定義されていないという部分が怪しいと思いTypeScriptでどのようにグローバルに関数を定義するか調べて下記のように記述したら動作するようになりました! interface Window { test(): void; } window.test = () => { console.log("aaa"); }; これでようやく次に進めそうです。ありがとうございました。
miyabi_takatsuk

2020/05/21 03:23 編集

解決よかったです。 おお、なるほど・・・。 こちらも勉強になりました。 ただし、アロー関数だと、thisの扱いが変わってしまいますので、注意が必要かも。 onkeyup属性付けたinput自身を取ってきたいなら、 window.test = (str: string, valueDom: HTMLInputElement) => { console.log(valueDom); }; として、inputは、 <input type="text" onkeyup="test('aaa', this)"> とするといいかもしれません。
mobile105

2020/05/21 14:48

ご返答おくれまして申し訳ございません。 webpackでビルドすると変数のスコープが通常とは異なるようですね。 いただいたコードでinputの要素も取ることも出来ました! ご丁寧にありがとうございました! 感謝致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問