のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,624,377人
昨日:no data人
今日:
最近の注目
人気の最安値情報

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

元スレ+ JavaScript の質問用スレッド vol.132 +

JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
101 : Name_Not - 2018/03/10(土) 16:41:20.38 ID:???.net (-1,-29,-18)
コンソールで
document
window
ってそれぞれうって中身を見てみればいい。
102 : Name_Not - 2018/03/10(土) 16:52:01.77 ID:???.net (+59,+29,-7)
イベントハンドリングをデレゲートする、ってどういうこと?
104 : Name_Not - 2018/03/10(土) 17:08:40.35 ID:???.net (+104,+29,-45)
>>102
ある要素のイベントをその親のイベントハンドラで受け取って処理すること
子が増減するたびに新しくイベントハンドラを作らなくて良くなる

その反面documentみたいに、いろんな要素からのイベントを受け取ってしまう場合は
どの要素から発生したイベントなのかをチェックする必要があり面倒くさい
なのでdocumentで受け取るなんて普通するか?
105 : Name_Not - 2018/03/10(土) 17:09:19.57 ID:???.net (-11,-29,-16)
>>103
それだと<button>以外の要素からのクリックとかも
受け取ってしまいますよね?
106 : Name_Not - 2018/03/10(土) 17:11:56.30 ID:???.net (+28,-30,-85)
<input typer="button" id="name">

--
document.getElementById("name").addEventListener("click", function)

こゆこと?
これを
イベントハンドリングをdocumentでうけてデレゲートする
って表現するの?
107 : Name_Not - 2018/03/10(土) 17:13:09.02 ID:???.net (+59,+5,-1)
タイプタイパータイペストwwwww
108 : Name_Not - 2018/03/10(土) 17:13:47.22 ID:???.net (+76,+18,+0)
>>106
違う
109 : Name_Not - 2018/03/10(土) 17:16:51.86 ID:???.net (+67,+15,-16)
>>104
>>108

コードで書くとどうなるの?
110 : Name_Not - 2018/03/10(土) 17:18:22.18 ID:???.net (-2,-30,-32)
document.addEventListener("click", function)
111 : Name_Not - 2018/03/10(土) 17:19:23.93 ID:???.net (+111,-30,-268)
>>104-105
発火した要素やparentNode再帰で、idやclassNameを見て切り分けたりする
jqueryのclassNameでのハンドリングがdocumentじゃなかったっけか

当然、<button>の中に<span>が入ってたりすると複雑化したり処理が多くなるが
どっちかっていうと
バブリングを踏まえて処理組んでたり
時系列的に同時に走られるとまずかったり
バブリング停止が混ざると厄介だったり、というほうの影響が大きいと思う

>>109
<div id="p1"><button>b1</button><button>b2</button></div>

document.getElementById('p1').addEventListener( 'click', function(){
if(e.target.tagName==='button'){ /* proc */ }
}, false );

みたいな
112 : Name_Not - 2018/03/10(土) 17:19:33.16 ID:???.net (+60,+29,-12)
>>107
添付 天パ テンペスト
113 : Name_Not - 2018/03/10(土) 17:21:17.13 ID:???.net (+52,+29,-2)
また髪の話してる・・・
114 : Name_Not - 2018/03/10(土) 17:25:25.34 ID:???.net (+16,-30,+0)
プログラミング業界ではdelegateは移譲を意味する
一般的な用語でおそらくインターネットが普及する以前から使われてきた用語だけど、
今の話の文脈のdelegateはjQueryが発端なのかな?

jQueryでは1.4.2からdelegateというこのイベントを親で受け取る機能が追加された
(他にも似たようなliveというメソッドがあったがこれらはイベント関連全てを扱うonに統合された)
果たしてこのjQueryのdelegate以前から使われていたのかどうか

ちなみにjQueryだと>>111のような面倒くさいことは必要なく

$('button').on('click', function() {・・・}) だと
$(document).on('click', 'button', function() {・・・}) と書き換えるだけでいい
多くの場合イベントハンドラの中身はそのまま使える、
またdocumentの代わりにbuttonの上位要素でも良い
115 : Name_Not - 2018/03/10(土) 17:26:13.85 ID:???.net (+63,+28,-1)
>>111
なるほどー
勉強なりました。
116 : Name_Not - 2018/03/10(土) 17:26:43.62 ID:???.net (+63,+30,-74)
平日家に届く荷物

通常: 自分が家にいないと受け取れない
(再配達あるが例ということで)

デリゲート: 平日家にいる家族に自分宛荷物を受け取っといてくれと頼んどく

現実だといちいち頼まなくても家族が勝手に取っといてくれるだろうがコンピューターは融通がきかないのだ。
余計なことしないとも言う。勝手に開けられてて死亡したことあるしなw
117 : 111 - 2018/03/10(土) 17:28:54.32 ID:???.net (+76,+29,-95)
>>111のfunctionの引数指定 (e) が抜けてた
まあ上位が取って、下位にイベントを当てる、みたいな雰囲気を理解してもらえればいい

プログラミング的にはできるだけ影響を少なく直上の要素などで受けるのが健全
個別にidをつけたり個別にaddEventListenerしたり、としなくてもいい等の利点がある
といっても高尚なパターンとかじゃなくて
誰でも思いついてやってることだと思う
118 : Name_Not - 2018/03/10(土) 17:32:12.24 ID:???.net (+49,+21,-19)
なんでもdocumentで受けるのは
グローバル変数使い放題みたいな印象があるな
119 : Name_Not - 2018/03/10(土) 17:32:30.35 ID:???.net (+64,+29,-13)
それよりliが動的に足し引きされるやつとかの対応だろ
動けばいいや派はここで積む
120 : Name_Not - 2018/03/10(土) 17:35:18.21 ID:???.net (+45,-29,-56)
>>119
そりゃcreateElementするときに個別にaddEventListenerしてからappendChildすれば済む
問題が出るのは、innerHTML操作しかできないわからない層ぐらいじゃね
121 : 114 - 2018/03/10(土) 17:38:01.52 ID:???.net (+36,-30,-188)
書き忘れたが、今の話のdelegateがjQuery由来ではないのか?というのと
もう一つ、なんでもdocumentというのは、liveメソッドが原因じゃないのか?ということ

jQuery 1.4.2で追加されたdelegateは親要素を指定することができるのだが、
それよりも前に1.3から追加されたliveは親要素は指定できずにdocumentになっていた
(これがわかりづらいという意見があって最終的にonに統一されたのだけれども)

$( "button" ).live( "click", function() {・・・}) だと
buttonではなくdocumentで受け取るようになっていたわけだ
122 : Name_Not - 2018/03/10(土) 17:41:11.50 ID:???.net (+93,+29,-35)
>>121
その辺考えるとjqueryは
documentへの委譲を理解せず使ってバグを生み出すコーダーを量産してたとも考えられるな
123 : Name_Not - 2018/03/10(土) 17:49:36.60 ID:???.net (+63,+17,-174)
>>122
でも当時はdelegateなんて考えなかったからね
だからこそjQueryは内部の処理を隠蔽して
魔法のような機能をしてますみたいな感じだった

また移譲の認識を広めたのもjQuery 1.7から追加されたonメソッドなわけで
ウェブプログラマとDOM APIにかなりの影響を与えたライブラリだな

その数年後にDOM APIにようやくセレクタを使ったアクセスや
比較方法が追加されたわけだしね
124 : Name_Not - 2018/03/10(土) 17:56:16.76 ID:???.net (+98,+29,-31)
>>120
動的に要素いじってる奴とイベント設定したい奴が同じならそうだが…
ライブラリがやってる場合とかなかなかそうもいかない
125 : Name_Not - 2018/03/10(土) 18:04:50.18 ID:???.net (+71,+29,-17)
>>124
あー、言われてみれば確かに
ライブラリ側で受信と共に自動生成されますー、とかあるわ納得
そりゃ親に当てるやりかた思いつけなくて詰むな
126 : Name_Not - 2018/03/10(土) 18:05:22.30 ID:???.net (+28,-30,-252)
>>96
イベントバブリングを少しでも減らすためと思ってる
document.bodyにしないのは、HTMLタグの<body>が省略されてたり、2つ以上書かれてたりすると、
Javascript側のdocument.bodyが不定になるっぽいから

>>111
jQueryのon()を見た感じでは、指定された要素そのものにaddEventListener()してるっぽい
さすがにdocumentだけで全部を処理していると、targetの管理・分岐が大きくなりすぎて処理が重くなると思う

<button><img></button>
という構造の場合、<img>でイベントが発生した場合にevent.targetは<img>になるから、parentNodeをたどって、<button>に内包されてるか確認しなきゃいけない

jQueryもparentNodeをたどってる
第三者のライブラリを使うと自分で書く必要がなくなるというだけの話
127 : Name_Not - 2018/03/10(土) 18:08:06.15 ID:???.net (+16,-29,-53)
>>126
指定された要素そのものにaddEventListenerしているということは
その後に追加された同名classNameを持つ要素に対応できないということになるんだが
それとも、要素追加を監視して逐一リスナ貼り付けてるのか?
128 : Name_Not - 2018/03/10(土) 18:10:11.74 ID:???.net (+6,-30,-174)
>>126
> jQueryのon()を見た感じでは、指定された要素そのものにaddEventListener()してるっぽい

そうだよ。こっそりdocumentになっていたのは古いliveメソッドの話

だからdocumentで受け取るなら
$(document).on('click', ~
とする。

そして本来の要素は第二引数に、このように書く
$(document).on('click', 'button', ~


親要素で受け取るという考え方が広まったので、普通に親イベントで受け取る
だけど、簡単に本来受け取りたかった要素 'button' を指定するのは引数一個と簡単で、
さらにthisは本来受け取りたかった要素になっている
129 : Name_Not - 2018/03/10(土) 18:11:00.64 ID:???.net (+3,-29,-8)
>>127
classNameで指定されたらclassNameでチェックすればいいだけでしょ
130 : Name_Not - 2018/03/10(土) 18:12:10.77 ID:???.net (+5,-30,-129)
>>127
> 指定された要素そのものにaddEventListenerしているということは
> その後に追加された同名classNameを持つ要素に対応できないということになるんだが

だから普通にdocumentにon(addEventListener)するんだってばw
そしてonメソッドの第二引数に「指定された要素」を指定することで
まるで「指定された要素」そのものにaddEventListenerしたかのように
違いを吸収してくれている
131 : Name_Not - 2018/03/10(土) 18:13:01.00 ID:???.net (+21,-29,-13)
>>129
> classNameで指定されたらclassNameでチェックすればいいだけでしょ
単純なclassNameだけで判別できる場合ならね
132 : Name_Not - 2018/03/10(土) 18:14:33.97 ID:???.net (+67,+8,-35)
>>131
その結果がjQueryの複雑なチェック方法なのでは
133 : Name_Not - 2018/03/10(土) 18:22:21.21 ID:???.net (+62,+29,-122)
documentをリスナ追加対象にすれば重くなる
最小限の親要素をリスナ追加対象にすればその外に生じた要素に対応できない
対象を考えなきゃいけないのはjqueryなしと変わらない
どこにリスナが追加されるかを意識して使わないといけないのはjqueryなしと変わらない
なんでもかんでもdocumentに追加していては問題が生じる危険がある
いずれにしてもjqueryを使わず普通にできる

なるほど
134 : Name_Not - 2018/03/10(土) 18:26:59.86 ID:???.net (-1,-29,-65)
Jqueryは結局のところ初心者向けじゃないのかな

JQ無しでjs仕様がわかっててJQ無しでコード書けててJQの挙動がしっかり把握できてる人
が一行一文字でも書く文字減らしたいために使う
135 : Name_Not - 2018/03/10(土) 18:44:05.61 ID:???.net (+20,-7,-32)
DOMはJavaScript初心者には難しすぎる
jQueryはJavaScript初心者にちょうどいい
136 : Name_Not - 2018/03/10(土) 20:12:56.49 ID:???.net (+39,-30,-187)
jQuery のソースコードには、IE9 なら、Android 4 ならとか、数十の分岐処理がある

JS で作る人は、これらの分岐処理でバグるから、正常に動作させるのに、10年以上掛かる

例えば、素のJSでは、要素の削除も、一旦その要素の親を取得してから、
親から見て、子供を削除する

var elem = document.getElementById('abc');
elem.parentNode.removeChild(elem);

こういうように書かないと、IE11 では動かない。
だから一々、どのブラウザでは動かないとか、頭を抱える

素のJSで作っている奴は、調べものばっかりして、頭を抱えているけど、
バグの多い製品しか作れないw

基本、調べものばかりしている奴は、コーディングの練習にもならないし、
時間を浪費して、上達しないから最悪
137 : Name_Not - 2018/03/10(土) 20:17:15.01 ID:???.net (+57,+29,-34)
グローバル変数相当に名前空間とクロージャそれぞれどういう長所短所ある?
前者はその都度MyApp.つけなくてはならず

ここの皆はどっち使ってる?
138 : Name_Not - 2018/03/10(土) 20:24:02.46 ID:???.net (+87,+29,-26)
どっちかしか使わないなんてない
名前空間といっても要するに1つのオブジェクトに押し込めるかどうかだけだし
139 : Name_Not - 2018/03/10(土) 20:47:24.77 ID:???.net (+68,+30,-101)
>>136
今時趣味で作るならモダンブラウザオンリーで十分だと思うよ
仮に仕事でIE対応が必要だとしても、考え方が反対だと思う
やっぱり、対応方法はわかってるけど、自作するのは面倒くさい
そこで効果を理解してるライブラリを使うというのが正常だと思う

jQueryを何の為かどういう仕組みか分からず使ってる状態っていうのは
絶対に困る場面が出るし、jQueryの良さを引き出せないよ
140 : Name_Not - 2018/03/10(土) 20:51:51.34 ID:???.net (+91,+29,-17)
今の時代は便利なものをどれだけ使いこなすかのほうが重要になっている
141 : Name_Not - 2018/03/10(土) 20:58:50.02 ID:???.net (+57,+29,-25)
jQueryあにき今日も全開っすね( ´∀`)bグッ!
142 : Name_Not - 2018/03/10(土) 21:00:09.08 ID:???.net (+31,-29,-24)
LSの機能使いたいけど、非対応ブラウザにも対応させたいけど、自分で書くのめんどい!人限定ライブラリ
143 : Name_Not - 2018/03/10(土) 21:01:09.03 ID:???.net (+69,+29,-2)
>>140
なんか言うことが営業っぽい
144 : Name_Not - 2018/03/10(土) 21:47:48.46 ID:???.net (+56,+19,-39)
>>132
> その結果がjQueryの複雑なチェック方法なのでは
何が複雑なの?
145 : Name_Not - 2018/03/10(土) 21:59:53.65 ID:???.net (+97,+26,-3)
>>138
どう使い分けてる?
146 : Name_Not - 2018/03/10(土) 22:34:40.91 ID:???.net (+76,+30,-85)
>>145
使い分けという時点でなんか違う気がしないでもないんだけど
・どう使いたいか・あとから変更したいかどう変更したいか
・状態を持たせたいか持たせるときどんな感じで使うのか
・1個だけあればいいか複数複製したいかnewしたいのかコンストラクタ次第で色々変えたいか
とか色々ある、んだけど

でも手法全体は変えないで後から変更調整を
したいときでもわりとどうにでもなるよね
147 : Name_Not - 2018/03/10(土) 23:29:09.80 ID:???.net (+62,+29,-32)
>>142
それはただのポリフィル
jQueryはあくまでjQueryワールドを提供するだけ
148 : Name_Not - 2018/03/11(日) 11:21:14.91 ID:Gy/uaNyu.net (+29,+27,-39)
グローバル変数を1つ宣言するのと
関数を1つ宣言するのとでは
グローバルの汚染度は変わらないですよね?
149 : Name_Not - 2018/03/11(日) 11:37:34.87 ID:???.net (+13,-30,-93)
>>148
console.log(globalOsen?'汚染されてる!':'汚染されてない');
var globalOsen = 'キャラメル';

console.log(globalOsen?'汚染されてる!':'汚染されてない');
function globalOsen() {
return 'キャラメル';
}
比べてみなよ。
console.log(globalOsen?'汚染されてる!':'汚染されてない');
var globalOsen = function() {
return 'キャラメル';
};
なら変わらないけど。
150 : Name_Not - 2018/03/11(日) 12:03:35.32 ID:???.net (+91,+29,-19)
なんで汚染だけローマ字なんだよ
グローバルもローマ字にしろや
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について