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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

4回答

4255閲覧

javascriptで既存のメソッドの機能は引き継ぎながら同じメソッド名で上書きするにはどのようにすればいいのでしょうか?

KazuyaKubo623

総合スコア7

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2015/11/24 08:38

こんにちは。javascript初心者です。

javascriptで既存のメソッドの機能は引き継ぎながら同じメソッド名で上書きするにはどのようにすればいいのでしょうか?

具体的に現在実現したいことはフォーム全てのsubmitメソッドに機能を追加したいです。
以下のように書いてみたのですが、上手く動きません。根本的に何かが間違っているかもしれませんが、ご教授願えませんでしょうか?よろしくお願いします。

$('form').each(function () { this.submit = (function () { function newSubmit() { alert("追加したい機能"); this.prototype.submit.apply(this); } return function () { return newSubmit(); } })(); });

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

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

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

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

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

guest

回答4

0

提示のコードでreturn newSubmit();とありますが、
こうすると関数の実行結果(returnしていないのでこの場合undefined)が
this.submitに代入されてしまいます。

一度関数を退避し、その退避した関数を新関数内で呼び出してみてはどうでしょう。
(each内でこういうことしたことないので、どうなるかやってみないとわからないのですが。)

JavaScript

1$('form').each(function () { 2 var oldFunction = this.submit; //既存の関数を退避 3 this.submit = function () { 4 oldFunction(); //新関数内で既存の関数を実行 5 alert("追加したい機能"); 6 }; 7});

投稿2015/11/25 05:22

moredeep

総合スコア1507

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

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

KazuyaKubo623

2015/11/26 08:24

ご回答ありがとうございます。 皆さまのご回答のお蔭で自己解決できました!
guest

0

コードは書きませんが、
onclick と onsubmit を「退避」して、onsubmit とonclick をnull で初期化してから、jquery.on で submitを設定、e.target.orgclick と e.target.orgsubmit が元々実装されてたイベントハンドラなので、それを実行後、submit に追加した新しい機能を実行すれば良いですね。大元のイベント契機が、buttonなのかsubmitなのかは、e.target.type で判断できます。

投稿2015/11/25 03:59

ipadcaron

総合スコア1693

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

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

KazuyaKubo623

2015/11/26 08:24

ご回答ありがとうございます。 皆さまのご回答のお蔭で自己解決できました!
guest

0

jQuery v2.1.4 で検証してみましたが、jQuery#on() でイベント定義するだけで期待通りに動作しました。

HTML

1<form> 2 <input type="submit" value="submit"> 3 <input type="button" value="button"> 4</form> 5<script> 6'use strict'; 7jQuery('form').on('submit', function (event) { 8 console.log(event.type + '1'); 9 event.preventDefault(); 10}); 11jQuery('form').on('submit', function (event) { 12 console.log(event.type + '2'); 13}); 14</script>

Re: KazuyaKubo623さん

投稿2015/11/24 09:04

think49

総合スコア18162

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

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

KazuyaKubo623

2015/11/24 09:25

ご回答ありがとうございます。 これで試してみたのですが、submitを押した場合は発火し、buttonを押した場合には発火しませんよね。 説明が下手で申し訳ないのですが、私がやりたいことはどちらでも発火させたいのです。つまり<input type="button" value="button" onclick="javascript:form.submit();">と書いて発火させたいのですが、その場合はどうすればよいのでしょうか?
think49

2015/11/24 09:36

input[type=submit] にHTMLの記述を変更するだけで実現できると思いますが、なぜ input[type=button] で submit したいのでしょうか。 JavaScript でやるなら input.type = 'submit'; で解決ですが、HTMLの記述を変えるほうが格段にスマートだと思います。
KazuyaKubo623

2015/11/25 00:05

私もその方がスマートだと思うのですが、既にあるプロジェクトの中でinput type="button"でsubmitをしなければならない部分がたくさん存在してしまっているのです。。 input type="submit"のものも共存している状態でして、どちらでも同じ処理を行いたいのでメソッドの上書きを考えたのですがそれはできないのでしょうか?
think49

2015/11/25 03:25

> 既にあるプロジェクトの中でinput type="button"でsubmitをしなければならない部分がたくさん存在してしまっているのです。。 仕様を変えられない理由が明確になっていないのではないでしょうか。 input[type=submit] もしくは button[type=submit] を使えない理由が明確になって初めて最適解が決定すると思います。 現状では暫定対応的なコードしか書けませんが、それは良くない対応だと思います。 --- 仮に仕様を変えられない現実的な理由があるとして。 先程も書きましたが、JavaScript で input[type=button] を input[type=submit] に書き換える手法も無理なのでしょうか。 jQueryなら下記のようにかけると思います。 jQuery('input[type=button]').prop('type', 'submit'); それが無理であれば、KazuyaKubo623さんが試したようにclick時にsubmitを作動させるしかないと思います。
guest

0

えっと、ふつうに$('form').submit(function(){...})でイベントを仕掛けるのではなにか問題があるのでしょうか。

投稿2015/11/24 08:41

maisumakun

総合スコア145183

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

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

KazuyaKubo623

2015/11/24 08:48

早速のご回答ありがとうございます。 普通にフォームでsubmitする場合はそれで大丈夫なのですが、onclick="javascript:form.submit();"を使いたい部分があるんですね。その場合$('form').submit(function(){...})ではイベントが発火しないのです。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問