X



+ JavaScript の質問用スレッド vol.130 + [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001Name_Not_Found
垢版 |
2017/07/31(月) 21:10:56.03ID:???
JavaScript を自ら学ぶ人のための質問スレッドです。
>>2-6のテンプレを読んだ上で質問してください。次スレは>>950>>2のテンプレ案(本スレで改善案があれば考慮)を元に立ててください

■規則/推奨ルール
・メール欄を空欄にし、名前にレス番を入れることを強く推奨(なりすまし防止)
・質問内容は具体的に。言葉だけでなく、出来る限り再現性を確認したサンプルコードの掲示。
・質問テンプレートの利用推奨。
・質問への「答え」だけでなく「意見」を出しても良い。

■禁止行為
・丸投げ質問
・迷惑スクリプトの質問
・オレオレ用語の使用(一般的な用語を使用する事)
・煽り、批判等の他人を不快にさせる行為(批判の代わりに「AよりBが良い」のような代案を出す事)
・回答者同士のレスは原則禁止(>>6を参照)
・ライブラリの話題の投稿(>>6を参照)

■質問テンプレート
【環境】OS, ブラウザをバージョンと共に記入してください。(ex: IE8, Firefox4)
【何をしたのか】何をしたら問題の現象が発生するのか。再現手順を具体的に書いてください。
【エラーメッセージ】エラーメッセージがあれば正確に書き写してください。(Windows なら「コピット」を活用)
【期待する結果】最終的にどういう結果を望んでいるのか、を書いてください。
【サンプルコード】現象を再現可能な最小限のコードを書いてください。
 1レスに収まらないならコード投稿サイトを利用してください。
 http://jsdo.it/ http://jsbin.com/ http://jsfiddle.net/ http://ideone.com/
0355Name_Not_Found
垢版 |
2017/09/27(水) 15:36:21.86ID:???
attachEventのことも思い出してあげて下さい
0356Name_Not_Found
垢版 |
2017/09/27(水) 15:53:22.10ID:DDiRRlwb
>>354
メモしておきます!ありがとうございます
0357Name_Not_Found
垢版 |
2017/09/28(木) 02:45:45.27ID:???
addEventListenerやxhrの第三引数指定する人ってどう言う考えしてるんだろう?
特にaddのは関数定義の後に記述する事にもなりがちだし不格好なだけと思うけど。
0358Name_Not_Found
垢版 |
2017/09/28(木) 06:27:15.11ID:???
useCapture Optional
捕捉フェーズを使用する場合は、 useCapture に true を指定します。
捕捉フェーズの開始後、指定されたタイプのイベントの全てが、まず、登録された listener に発送され、
その後、DOM ツリーにおいてその下に位置する任意の EventTarget に発送 されます。
ツリーをたどって上方へ浮上するイベントは、捕捉フェーズを用いるように指定されたリスナーを誘発することはありません。
詳細については、DOM Level 3 Events を参照してください。
この引数は、全てのブラウザで省略可能ではないことに注意してください。省略した場合、 useCapture は false となります。
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0359Name_Not_Found
垢版 |
2017/09/28(木) 06:29:41.76ID:???
めっちゃズレてる
俺にはAAを作る才能がない
0360Name_Not_Found
垢版 |
2017/09/28(木) 06:32:05.46ID:???
ツールを使うんだよ
じゃないと絶対にずれるぞ
0361Name_Not_Found
垢版 |
2017/09/28(木) 06:44:56.51ID:???
>特にaddのは関数定義の後に記述する事にもなりがちだし不格好なだけと思うけど。
そもそもコールバック自体が不恰好であってこの感性は理解できない
0362Name_Not_Found
垢版 |
2017/09/28(木) 15:34:50.97ID:+lEbfk45
fancybox3のパーツを実走することなく本家のリンクのみで動かしてる場合に、
全画面中の透明なし、背景色の指定、はできないでしょうか?どなた教えてください。
<script type="text/javascript">
$("[data-fancybox]").fancybox({
オプション
});
0363Name_Not_Found
垢版 |
2017/09/28(木) 17:11:24.30ID:???
{a:1, b: 2} のようなリテラルで
prototype のない object( Object.create(null) )を作る方法はないですか?
0364Name_Not_Found
垢版 |
2017/09/28(木) 18:05:53.50ID:???
空を作った後にコピーすれば良いじゃん
var object = o => Object.assign(Object.create(null), o);
object({a:1, b: 2});
0365Name_Not_Found
垢版 |
2017/09/28(木) 19:16:58.32ID:???
>>364
>Object.assign

知らなかった! ありがとう
0366Name_Not_Found
垢版 |
2017/09/28(木) 20:52:12.37ID:???
リテラルなら__proto__:null,を含めれば良いだけだけどな
0367Name_Not_Found
垢版 |
2017/09/30(土) 05:31:35.62ID:Jh7Gg5Po
__proto__も知らない奴がassignも知らない奴に教えるスレ
もはや世紀末
0369Name_Not_Found
垢版 |
2017/09/30(土) 08:37:49.21ID:???
ボタン1を押すとボタン2が出てきてボタン2を押すとボタン3が出てくる
という処理をinnerHTMLとaddEventListnerでやろうとしているのですが
ボタン2を押してもボタン3が出てきてくれなくて困っています

innerHTMLで出力したものがイベントターゲットになっていないからだと思うのですが、どうすれば解決できるでしょうか?
プログラムを書くのが初めてなので初歩的な質問だと思いますが、よろしくお願いします
0371Name_Not_Found
垢版 |
2017/09/30(土) 10:45:15.58ID:???
innerHTMLしたあとにaddEventListenerすればいいかと
むしろまだ存在していない(innerHTML前)要素にどうやってaddEventListenerしようとしたのか
0372Name_Not_Found
垢版 |
2017/09/30(土) 11:03:20.44ID:???
>>369
ボタンの一つ上の要素にaddEventListenerしevent.targetでクリックされた要素を取得し判別する
0373Name_Not_Found
垢版 |
2017/09/30(土) 11:12:04.64ID:???
clickイベントはwindowに対して1つだけでいい
あとはevent.targetで振り分け
というかボタン2とボタン3は元々ある状態にしておいて
スタイルのdisplay:noneをdisplay:blockなりに変更するだけでいいのでは
0374Name_Not_Found
垢版 |
2017/09/30(土) 11:21:48.45ID:???
>>369
要素が存在しない時にイベントを与えているからだろうなw
その辺りをチェック
0375Name_Not_Found
垢版 |
2017/09/30(土) 11:23:28.70ID:???
>>369
プログラムだけではないが、
HTML + CSS + JavaScriptの世界では
見た目はCSSで制御する

最初にボタンを3つ書く
<input class="btn" type="button" value="button1" >
<input class="btn" type="button" value="button2">
<input class="btn" type="button" value="button3">

見た目をCSSで制御(最初のボタン以外は非表示)にする
.btn + .btn {
 display: none;
}
.btn.clicked + .btn {
 display: inline;
}

ボタンが押されたら押されたいう情報(クラス)を自分自身に設定する
(JavaScriptはjQueryを使えば簡単に書ける)
$(document).on('click', '.btn', function() {
 $(this).addClass('clicked');
});

実行サンプル https://jsfiddle.net/qz5fLy9y/

ちなみに押したら押されたという状態になって、その後変わらないものは
ラジオボタンを単独で用いれば表現できる。あとは見た目をCSSでボタン風にするだけ
つまりJavaScriptなしでもできるぞ
https://jsfiddle.net/qz5fLy9y/1/
0376Name_Not_Found
垢版 |
2017/09/30(土) 11:28:22.02ID:???
addEventListenerではなくaddEventListnerしてるというオチに期待
エラーも見てないな
0377Name_Not_Found
垢版 |
2017/09/30(土) 16:52:56.13ID:???
皆さんありがとうございます!
cssで隠しておくのと親要素から取得するの2つともで希望の動きができました
皆さんめっちゃ心強いです(*´ω`*)
0378Name_Not_Found
垢版 |
2017/09/30(土) 22:09:41.31ID:???
サンプルまで作ってもらって本当に感謝です
HTMLとCSSだけでもここまで動かせるなんて知りませんでした(;´Д`)

ちゅーかjsfiddleってサイト便利ですね
私が作ってる程度のものならatomよりこっちのが使い勝手いいかも(??????)??
0379Name_Not_Found
垢版 |
2017/09/30(土) 22:25:37.59ID:???
いやさすがにatomのほうがいいだろう
0380Name_Not_Found
垢版 |
2017/09/30(土) 22:50:11.40ID:???
jsdo.it で、HTML, CSS だけで、

ワニワニパニックを作った人を知らんのか?w
0382Name_Not_Found
垢版 |
2017/10/01(日) 05:23:08.09ID:???
HTML5ムーブメントを語る上で避けては通れない
CSSプログラミングを知らないとか教養がないと言われてもしようがないな

昔っからこのスレは知ったかが多かったが
今では知ったかもできないほんまもんの無知ばかりやな
0384Name_Not_Found
垢版 |
2017/10/01(日) 07:22:12.84ID:???
んなもん知っとるわ
あのお粗末なワニワニパニックを話に出したレベルの低さに対しての反応だろ
もっと教養を身につけた方がいいぞ
0385Name_Not_Found
垢版 |
2017/10/01(日) 07:37:56.46ID:???
何が「知らんのか?w」だよ。
聞いてもねーのに糞しょうもない知識を自慢したいだけの馬鹿は黙ってろよ。
0386Name_Not_Found
垢版 |
2017/10/01(日) 11:46:54.28ID:???
こいつ通勤中の赤信号にもいちいちキレてそうな奴だな
0387Name_Not_Found
垢版 |
2017/10/01(日) 12:21:50.46ID:???
windows版のchrome(バージョンは最新)で
SpeechSynthesisUtteranceの
rateを上げたら、再生出来ないばかりか、
ブラウザを再起動しないとその後再生できなくなる現象が出ています
自分だけでしょうか?
仕様によるとrateの最大値は10なので値は仕様の範囲内のはずなのですが
3にするとおかしくなります

(再生可能)
https://jsbin.com/wuteqewavo/edit?js,console

(rate=3、その後再生不可能)
https://jsbin.com/viriritali/edit?js,console
0388Name_Not_Found
垢版 |
2017/10/01(日) 15:31:11.57ID:???
>>387
自分もちょこちょこ試してるけど1年前からそんな感じだよ
そのAPIはセンシティブで上手くいくかはタイミングなんかにも影響する
OSやデバイスのシステムを借りててブラウザだけで完結してる範囲が少ないから
仕方がないのかもしれない
それでも最近は随分マシになった方
最初の頃はまともに動く確率のほうが低かった
0389Name_Not_Found
垢版 |
2017/10/01(日) 18:31:33.47ID:j9qs3OVI
[ [1, 'c'], [2, 'a'], [3, 'b'], [4, 'a'], [5, 'c'] ]から重複を除いた abc だけを取り出すにはどうすればいいでしょうか?
0390Name_Not_Found
垢版 |
2017/10/01(日) 18:41:35.20ID:???
1,2,3,4,5の数字のほうはどうでもいいのか?
0392Name_Not_Found
垢版 |
2017/10/01(日) 20:02:40.81ID:???
nativeでも良いじゃん
list.map(a => a[1]).filter((v, i, arr) => arr.indexOf(v)==i)
Array.from(new Set(list.map(a => a[1])))
0393Name_Not_Found
垢版 |
2017/10/02(月) 01:18:17.91ID:???
ぶっちゃけこれだけのためにlodash丸ごと使うことは絶対にありえない
その内部実装の関数1つだけ借りてくることはあっても
0394Name_Not_Found
垢版 |
2017/10/02(月) 01:29:12.77ID:???
そういう時に使いたいのが、これ、custom build
お客さんの要望に応じて必要な分だけをチョイスできる
オトクなパッケージ
https://lodash.com/custom-builds
0396Name_Not_Found
垢版 |
2017/10/02(月) 02:27:26.24ID:???
配列の中のオブジェクトの中のプロパティ値の最大値をMath.max.applyで呼び出す書き方をご教授くださいm(_ _)m

配列はこんな感じです
var scoring=[
{'male':[1,0,0,0],'female':[10,5,3,0]},
{'male':[2,5,3,0],'female':[10,5,3,0]},
{'male':[0,0,0,0],'female':[10,5,3,0]}
];
0397Name_Not_Found
垢版 |
2017/10/02(月) 02:44:58.36ID:???
>>396
> Math.max.applyで呼び出す
ってのが意味わからん。

スコアの配列を最大値に置き換えれば良いんか?
つまりこういうことか?

https://jsfiddle.net/a1p11fLt/

var scoring=[
{'male':[1,0,0,0],'female':[10,5,3,0]},
{'male':[2,5,3,0],'female':[10,5,3,0]},
{'male':[0,0,0,0],'female':[10,5,3,0]}
];

var s = _.map(scoring, row => _.mapValues(row, (v,k) => _.max(v)))
console.table(s)
0400Name_Not_Found
垢版 |
2017/10/02(月) 03:09:15.07ID:???
>>398
大変申し訳無いです、質問の内容に不足がありました(;´Д`)

上記の配列から変数を使って特定の値を呼び出し、それが所属する配列の中の最大値かどうかの判定をしたいのです。
変数を使って値を呼び出すところまではできています。
例えば2列目maleの3を呼び出した時、それは[2,5,3,0]の中で最大かどうか?を判定するために、最大値である5を取得したいです。
よろしくおねがいします。

それから初心者すぎて_.mapとかその他もろもろの表現が初見で頭が沸騰してしまってます。
せっかく書いていただいたのに申し訳ないですm(_ _)m
0401Name_Not_Found
垢版 |
2017/10/02(月) 04:39:41.64ID:???
>>400
ary = scoring[num][sex] と置けば
num = 1, sex = 'male' のとき
ary が [2,5,3,0] になる
その内最大を得るには
max = Math.max.apply(Math,ary) もしくは
max = Math.max(...ary)
0402Name_Not_Found
垢版 |
2017/10/02(月) 05:06:28.79ID:???
>>401
できました!
ありがとうございます(*´ω`*)
0403Name_Not_Found
垢版 |
2017/10/02(月) 05:09:31.96ID:???
>>394
そういう問題じゃ無いんだよね
3種類10箇所とかなら分かるけど、ただ一つ_を使うのは変だし
それだけのためにライブラリ管理コストかけるのもね
キリも無くなるし
既に利用してる可能性が結構あるjQueryは分かるけど、
_は単発の質問にはそぐわないね
0404Name_Not_Found
垢版 |
2017/10/02(月) 07:13:25.90ID:???
>>395
コードが短いのはいいことだけども速さ求めるなら
おとなしくforと連想配列でやったらはやいんちゃう
0405Name_Not_Found
垢版 |
2017/10/02(月) 08:51:22.77ID:???
>>388
まだ不安定なんですね
ありがとうございました
0406Name_Not_Found
垢版 |
2017/10/02(月) 08:57:49.91ID:???
JSONのデータ構造を変えてから
$.getJSONで取ったデータがおかしくなるという問題に悩まされていましたが
原因はキャッシュでした
GETは通常、パラメータが同じ場合に同じものが返ってくるものですが
データ構造を変えるなどの仕様的な変更が反映されないと困ります
解決方法として、パラメータにタイムスタンプを付加するという方法がありますが
これで毎回別のGETにすることで、
キャッシュが異様に増殖してしまうのではないか、という危惧があります
どうなのでしょうか?
0407Name_Not_Found
垢版 |
2017/10/02(月) 09:16:45.75ID:???
>>406
ブラウザのキャッシュ管理のことまで気にしなくていいとは思うが
やるなら.htaccess等でヘッダーいじれば色々出来る
キャッシュさせないよう設定するとか逆にキャッシュさせた上で毎回確認だけはして更新時のみデータ受信する等
0408Name_Not_Found
垢版 |
2017/10/02(月) 12:44:12.88ID:???
クリックすると広告ページが新しいウィンドウで開くのを開かないようにjavascriptで制御したいんですが、
何かいい方法ないですかね?

window.openが実行された時に、すぐページを閉じるようなやつでもいいんですが、リファラは空だしどうしようかなと。
Google extensionで作ってます。
0409Name_Not_Found
垢版 |
2017/10/02(月) 14:45:10.98ID:???
>>408
uBlock origin 使えばだいたい防げるだろ?
それで足りなければTampermonkeyを使えば良い
0411Name_Not_Found
垢版 |
2017/10/02(月) 19:35:42.09ID:???
>>409
こんなのあったんですね
ありがとうございます。

>>410
ありがとうございます
調べてみます。
0412Name_Not_Found
垢版 |
2017/10/02(月) 22:25:22.55ID:???
Underscore は、ライブラリ全体をロードする必要があるけど、
Lodash は、使う関数だけを、include できる

ただ最近は、ES5/6 に実装している、関数も多い

ライブラリにある関数を自作するのは、
ホワイトボックステストも必要だし、品質も悪い
0413Name_Not_Found
垢版 |
2017/10/03(火) 05:24:23.65ID:???
>>407
そこまでコントロールできたのですか
ありがとうございます
0414Name_Not_Found
垢版 |
2017/10/03(火) 09:36:23.90ID:???
promiseは非同期処理を同期的に書く方法ですが
非同期処理を実際に同期的にするにはどういう方法がありますか?
0415Name_Not_Found
垢版 |
2017/10/03(火) 10:07:57.35ID:???
>>414
取り敢えず全ての非同期関数がpromiseを返すように設計しとけばasync awaitで同期的に書ける
あと問題があるのがobservableやasync iteratorに当たるものだが
これはトランスパイラを使うか、while(await)テクニックで乗り切る
ちょっと悩ましい所
0416Name_Not_Found
垢版 |
2017/10/03(火) 14:04:00.31ID:???
>>415
ありがとうございます
順次調べていきます
0417Name_Not_Found
垢版 |
2017/10/03(火) 23:01:14.37ID:lPSfG7Mo
ぶっちゃけpromise理解できないから騙し騙しやってるわ
0418Name_Not_Found
垢版 |
2017/10/04(水) 14:19:52.28ID:???
ローカル変数って
内部的には関数のプロパティとして実現されているのでしょうか?
0419Name_Not_Found
垢版 |
2017/10/04(水) 16:22:25.72ID:???
>>416
概観しましたが、すごくすっきり書けていいですね
generatorで同期的に処理する方法も調べたのですが、
これは本来そのために作られた訳ではない機能をハック的に使ってる感じで
美しくないと感じましたが
それに比べるとasync/awaitはキレイだと思いました
0420Name_Not_Found
垢版 |
2017/10/04(水) 22:37:43.89ID:???
プロパティは、プロトタイプチェーンをさかのぼって探索されるけど、

ローカル変数は、さかのぼらない
0421Name_Not_Found
垢版 |
2017/10/05(木) 02:18:36.66ID:???
>>418
関数実行時やブロック文に入る度にそのコンテキストに紐付いたオブジェクトのようなもの
globalやwith文中では本当のオブジェクトが使われる
0422Name_Not_Found
垢版 |
2017/10/06(金) 12:50:02.91ID:???
分割代入と変数宣言を同時に行うことは出来ませんか?
0423Name_Not_Found
垢版 |
2017/10/06(金) 12:59:12.81ID:???
let [ a, b ] = ary
みたいにできるよ
0424Name_Not_Found
垢版 |
2017/10/06(金) 14:01:58.85ID:???
firefoxがshadowdomに対応してないんで似たようなことがしたいんですが
いいアイディアありませんか?
勉強のためにやるのでフレームーワークなどは使いません
0425Name_Not_Found
垢版 |
2017/10/06(金) 14:16:25.76ID:???
それって死んでもFxで動かないと駄目なの?
Fxも1年以内に実装されるだろうから、そのときには動きますで良いじゃん
0427Name_Not_Found
垢版 |
2017/10/09(月) 15:43:20.36ID:???
ES2015ではundefinedの上書きが出来なくなったようですが
属性の有無を調べるメソッドなり関数なりが追加されないのは何故ですか?
0428Name_Not_Found
垢版 |
2017/10/09(月) 17:57:16.39ID:???
Object.getOwnPropertyDescriptor( window, 'undefined' )
// { value: undefined, writable: false, enumerable: false, configurable: false }
0430Name_Not_Found
垢版 |
2017/10/09(月) 22:34:04.31ID:???
>>427
undefinedの上書きができなくなったことがどう関係するんだ?
undefinedの上書きができれば、属性の有無を調べるメソッドが
無くてもいいってことだろ?
0431Name_Not_Found
垢版 |
2017/10/09(月) 23:21:52.96ID:???
in演算子なんてあったんですね
ありがとうございます
0432Name_Not_Found
垢版 |
2017/10/10(火) 10:51:08.48ID:???
画面構成が一貫したSingle Page Applicationを作っていました
ベースとなるHTMLは最初から記述されていて、
適宜要素を動的に操作していたのですが
異なる構成の画面が必要になりました
部分的な書き換えではおさまりません
そうなると最初の画面から完全に動的に書かなくてはいけないのか?
それとも今の画面をどこかに保存しておいて、処理が終わったらまた戻す?
とか色々考えていますが
こういうことが問題になったらそろそろフレームワークの導入を考えた方がいいのでしょうか?
0434Name_Not_Found
垢版 |
2017/10/10(火) 11:26:45.01ID:???
>>432
スケールしないことを実感したら切り替え時だろう
0435Name_Not_Found
垢版 |
2017/10/10(火) 12:32:42.44ID:???
では勉強していきます
ありがとうございました
0436Name_Not_Found
垢版 |
2017/10/10(火) 15:54:04.50ID:brV5QabT
>>432
もう1個 別のSPA 作って
ShareWorker で状態を共有させる方法もあるんじゃないかな
0437Name_Not_Found
垢版 |
2017/10/10(火) 18:23:03.18ID:VzD+hjux
chromeとIEで確認しています
下記のような形でクリックイベントリスナーを設定しましたが反応はありませんでした
どこに問題がありますでしょうか?よろしくお願いします
 
Hoge.prototype.foo = function(){
 var button = document.createElement( "input" );
 button.type = "button";
 button.value = "テスト";
 button.addEventListener( "click", this.bar, false );
 this.div.appendChild( button );
}

Hoge.prototype.bar = function(){
 alert( "click" );
};
0438Name_Not_Found
垢版 |
2017/10/10(火) 18:26:27.41ID:???
>>437
要素が生成されていないのにイベントを与えているから
0439Name_Not_Found
垢版 |
2017/10/10(火) 18:26:49.99ID:SL8zOk23
>>437
this.bar
0440Name_Not_Found
垢版 |
2017/10/10(火) 18:28:19.97ID:SL8zOk23
>>437
途中で送信しちゃったw

this.bar

って第二引数に与えると、実際にクリックイベントが発火したとき
thisになるのはevent.targetであってHogeインスタンスじゃない
0441437
垢版 |
2017/10/10(火) 18:36:56.27ID:VzD+hjux
>>440
試しに下記の様にしましたが変わりませんでした
this.div.appendChild( button );
var func = this.bar;
button.addEventListener( "click", func, false );
0442Name_Not_Found
垢版 |
2017/10/10(火) 18:39:55.65ID:SL8zOk23
>>441
変わってないよ

var A = this;
button.addEventListener('click' , function(){ A.bar(); } , false);

とか
これがベストとは言わんけど
0443Name_Not_Found
垢版 |
2017/10/10(火) 18:40:39.73ID:???
>>441
そのやり方でもthisになるのはevent.targetであってHogeインスタンスじゃない
0444Name_Not_Found
垢版 |
2017/10/10(火) 18:53:04.24ID:brV5QabT
Function.prototype.bind() を使う
0445437
垢版 |
2017/10/10(火) 20:07:35.00ID:VzD+hjux
Hoge.prototype.foo = function(){
 this.div.appendChild(button);
 button.addEventListener( "click", function(){
  console.log( "test" );
  alert( "test" );
 },false );
}
そもそも発火しませんでした・・・
0446Name_Not_Found
垢版 |
2017/10/10(火) 21:04:04.69ID:SL8zOk23
>>445
そんな中途半端に書かれてもわからんよ
this.divってなんぞや?とかとか

全部書いておくれ
https://jsfiddle.net/
0448437
垢版 |
2017/10/10(火) 21:33:32.89ID:E6KH4Zj5
詳しいサンプルをありがとうございます
一旦最小構成でテストしてみたら最初のままで通用してしまいました
var Hoge = function( elementId ){
 this.div = document.getElementById( elementId );
};

Hoge.prototype.foo = function(){
 var button = document.createElement( "input" );
 button.type = "button";
 button.value = "ボタン";
 this.div.appendChild( button );
 button.addEventListener( "click", this.bar( this ), false );
};

Hoge.prototype.bar = function( arg ){
 console.log( "arg is..." ); //
 console.log( arg ); // object
};

var hoge = new Hoge( "test" ); // <div id="test"></div>
hoge.foo();
0449Name_Not_Found
垢版 |
2017/10/10(火) 21:39:59.94ID:???
>>448
>button.addEventListener( "click", this.bar( this ), false );

これは間違ってるよ
第二引数に渡すのは関数

this.bar ← これは関数
this.bar(this) ← これは関数barを実行した返り値
0450Name_Not_Found
垢版 |
2017/10/10(火) 21:41:48.84ID:E6KH4Zj5
訂正!訂正します
先の書き方だと第2引数が意図せずに実行されてるだけで本当は下記の通りですね
button.addEventListener( "click", function(){ this.bar( this ); }, false );
// this.bar is not a function at HTMLInputElement.
0451Name_Not_Found
垢版 |
2017/10/10(火) 21:48:06.42ID:SL8zOk23
>>450
>button.addEventListener( "click", function(){ this.bar( this ); }, false );

おちつけw
そのthis.barのthisは第二引数に渡した無名関数のスコープで
無名関数の外、つまりHogeのものじゃない

んでお手軽に解決するなら、Hogeのthisをいっぺん保存してこう
var A = this;
button.addEventListener( "click", function(){ A.bar( this ); }, false );

もっと根本的に解決するなら
Function.prototype.bind()
Function.prototype.call()
Function.prototype.apply()
あたりをググると良いよ
0452437
垢版 |
2017/10/10(火) 22:13:47.52ID:VzD+hjux
>>451
その後色んなパターンを実践していましたが
最終的には、まさに一度thisを保存する方法に落ち着きました
(関数先でクラスのプロパティを参照する必要があるので)
スコープとbind()について落ち着いて調べてみたいと思います
みなさんありがとうございました
0453Name_Not_Found
垢版 |
2017/10/11(水) 00:12:29.66ID:???
JavaScript の、this は、コロコロ変わるから難しい。
bind を使わないと、拘束できない

jQuery を使えば、悩むこともない
0454Name_Not_Found
垢版 |
2017/10/11(水) 01:05:45.44ID:???
>>453
jQueryを使ってもそこは一緒
だけどjQueryだとクロージャーを使っても循環参照になりづらいのと
DOM要素のリストとして扱うという設計思想によって扱いやすいってだけ

でさ、お前ら何やってんの?
>>437の話だろ? なんでthisを保存とかいう話になってんの?

addEventListenerの第二引数にクロージャーなんか渡すから
話ややこしくなってるじゃん。 >>437のコードでだいたいあってるだろ

https://jsfiddle.net/rdeuvep2/

function Hoge(elementId) {
 this.div = document.getElementById(elementId)
}

Hoge.prototype.foo = function() {
 var button = document.createElement( "input" );
 button.type = "button";
 button.value = "テスト";
 button.addEventListener( "click", this.bar, false );
 this.div.appendChild( button );
}

Hoge.prototype.bar = function() {
 alert( "click" );
};

var hoge = new Hoge("buttons");
hoge.foo();
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況