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

■ このスレッドは過去ログ倉庫に格納されています
2018/04/16(月) 00:09:43.45ID:???
JavaScript を自ら学ぶ人のための質問スレッドです。
次スレは>>950が(本スレで改善案があれば考慮して)立ててください

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

■禁止行為
・丸投げ質問
・迷惑スクリプトの質問
・オレオレ用語の使用(一般的な用語を使用する事)
・煽り、批判等の他人を不快にさせる行為(批判の代わりに「AよりBが良い」のような代案を出す事)

■質問テンプレート
【環境】OS, ブラウザをバージョンと共に記入してください。
【条件】期待する回答の条件を書いてください。
【何をしたのか】何をしたら問題の現象が発生するのか。再現手順を具体的に書いてください。
【エラーメッセージ】エラーメッセージがあれば正確に書き写してください。
【期待する結果】最終的にどういう結果を望んでいるのか、を書いてください。
【サンプルコード】現象を再現可能な最小限のコードを書いてください。
 1レスに収まらないならコード投稿サイトを利用してください。
 http://jsdo.it/ http://jsbin.com/ http://jsfiddle.net/ http://ideone.com/

■回答者へ
・回答には多様性があります。他人の回答を尊重してください
・動作ブラウザや環境が限られる場合は、それを明記してください
・他人の回答を批判する代わりに、自分ならこう書くという例を示してください
・質問者がJavaScriptでなければ実現できないと勘違いしてるなら、その否定としてHTMLとCSSで実装しても良い
・他人の回答を見たくないのであれば、文句をつける代わりにNGにして見えないようにしてください。文句をつける=荒らしです
2018/05/14(月) 18:07:17.98ID:???
便乗で質問します
キャレット無しの場合、本来TEXTAREAやINPUTにキーボード入力するような操作を
DIV要素でやるにはどのような構成になるのでしょうか(googleドキュメントみたいなやつです)

TEXTAREAにキーボード入力したものをval()で取得してDIVにコピー、みたいなのではありません
さらに全角半角や漢字など(TEXTAREAへ入力できるものすべて)も判別したいです

keydown取得してkeyCodeで半角全角を振り分け→漢字などはスペースキーの監視で。
全角時にはバックスペースキー、半角切り替えも監視
など考えましたがそんなめんどくさい処理をしないといけないのか・・?と眉唾でした
(そのためのTEXTAREAやINPUTだと思いましたが)
例えばGoogleドキュメントなどはそういうめんどくさいキー監視をしているのでしょうか?
2018/05/14(月) 18:09:37.94ID:???
キー監視じゃIMEがどんな変換したかわからないから面倒如何の前に不可能でね
2018/05/14(月) 18:20:37.28ID:???
例えばhiddenしたTEXTAREAにフォーカスを当てて・・
みたいなことができればと、hiddenしたtextareaにfocusしてみましたが
TEXTAREA内の変更にまでは至りませんでした

>>508
たしかに・・
2018/05/14(月) 18:23:42.47ID:???
textareaは表示のまま、potitionでwindowから見切れるように
ならできました
ただ、キーボード入力のプルダウンメニューが邪魔になりますが
2018/05/14(月) 18:57:37.63ID:???
ちなみに稚拙ですがこんな感じです
https://jsfiddle.net/5sgn8d8e/
2018/05/15(火) 00:57:32.59ID:???
たしかにキャレット位置を保存しておいて、HTMLを書き換えてから戻す
みたいな処理だった気がします
で、すごーーく面倒くさかった記憶があります
RangeオブジェクトとかSelectionオブジェクトとか、
普段全く使わないようなオブジェクトを使って・・
しかもそれらのオブジェクトが異様に難解だった記憶があります
今もそれですかね〜
2018/05/15(火) 01:28:59.58ID:???
>>495
jQueryのtext()では、タグがエスケープされるけど、
html()では、タグも有効になる

要素の内容が変更されたら、change イベントが発行される

正規表現を使う
2018/05/15(火) 03:08:21.53ID:???
一定の領域では泥臭い作業から逃げられん
論理的に必要なことはどうした考えても何度考えても必要
2018/05/15(火) 05:57:19.24ID:???
>>507
要素の内容が変更されたら、jQuery のchange イベントが発行される

他には、keypress イベントとか
2018/05/15(火) 06:31:26.60ID:???
IME API使えばいいじゃん
対応環境無いけど
2018/05/15(火) 06:50:37.39ID:???
div要素の内容が変更されたら、しかしそもそもdiv要素にどうやってキーボードから書き込むの、っていう話じゃないの>>515
隠しtextarea法が定石なの?
2018/05/15(火) 07:05:39.60ID:???
定石なんて無い
それでバリアがある環境や、ガラケーみたいなテキスト編集環境に対応できるかは分からんし
一般論としてできる限り細かい調整はしないで諦めたほうが良い
519515
垢版 |
2018/05/15(火) 07:08:00.41ID:???
>>515
自己レス

jQuery のchange, keypress イベントでは、うまくいかなかった
520515
垢版 |
2018/05/15(火) 07:12:36.31ID:???
Electron アプリの、VS Code では、半角文字で入力補完が出る

Electron とか使わないと無理なのかも
2018/05/15(火) 08:01:56.32ID:???
>>517
div要素を編集可能にするだけじゃん
2018/05/15(火) 16:04:21.29ID:???
ぐぐったらcaret.jsというのがあるみたいだけど
https://jsfiddle.net/sbrqvc2q/
2018/05/16(水) 06:07:00.35ID:???
そういうのあるんですね
ありがとうございます
ただ要素中のHTMLを書き換えてキャレットを戻せばいいと思っていましたが
よく考えると文字を一文字書き加えるごとに全領域を書き換えるエディタなんてないわけで
テキストノードの中に潜って文字のレベルで操作する必要があると思います
そのためのオブジェクトがRangeオブジェクトだったと思います
面倒くさいですが、面倒くさい方法しかないなら、するしか仕方ないですね・・
2018/05/16(水) 08:26:59.14ID:???
改行ごとにspanやpで区切るなどして部分的な指定をしやすくすれば、
HTMLの書き換えでもいいのかもしれません
ただ、何か問題があったから前回そうしなかったのではないか、という気もします
2018/05/16(水) 11:43:04.01ID:???
SelectionオブジェクトとRangeオブジェクトには、
ひととおりの API が定義されていますが、あまり使われていません。
本書でも解説しません。
(…)
Webアプリケーション上でリッチテキスト編集機能が必要な場合は、
ブラウザ間での差異を吸収してくれる既存のソリューションを適用するとよいでしょう。
インターネット上を探せば、そのようなエディタ部品がたくさん転がっています。

名著と名高いサイ本も、リッチテキスト編集周辺はそっけない記述&放り投げです
「たくさん転がっています」って、
これはそういうエディタ部品を作りたい人が読む本じゃないのかと問い詰めたいです
2018/05/16(水) 12:06:09.71ID:???
>>525
テキストエディタの作り方って本があると思ってんの?
527Name_Not_Found
垢版 |
2018/05/16(水) 12:12:00.56ID:nGgdPMwx
配列について質問です

var arr = [1, 2, 3, …]; と続く配列をタグで囲み、IDを割りふるにはどうすればいいでしょうか?

<b id="1">1</b> <b id="2">2</b> <b id="3">3</b> … のようにしたいです

下を試しましたが、IDにすべての配列が入ってしまったため、arr[0] と arr[1] としたら、3番目以降が2のままでした
console.log('<b id="' + arr + '">' + arr.join('</b> <b id="' + arr + '">') + '</b>');

よろしくおねがいします。
2018/05/16(水) 13:56:16.68ID:???
>あまり使われていません。

ガリガリ使っとるがな
2018/05/16(水) 17:09:18.55ID:???
>>527
var ary = [1, 2, 3, 4];
console.log(ary.reduce((acc, n) => acc + `<b id="${n}">${n}</b>`, ''));
2018/05/16(水) 17:13:13.29ID:???
>>529
ありがとうございました!
2018/05/16(水) 19:24:22.87ID:???
>>529
console.log(ary.reduce((acc, n) => acc + `<b id="${n}">${n}</b>`, ''));
console.log(ary.map(n => `<b id="${n}">${n}</b>`).join(''));


上の方を選んだ理由は?
2018/05/16(水) 19:37:19.81ID:???
どっちでもいいけど新しい配列ちゃん生んですぐ殺すとかかわいそうやん
2018/05/16(水) 21:46:41.00ID:???
そんな無理にmapだのコールバックだの使わなくとも
昔っからある
(''+ary).replace(/(\d+),?/g,'<b id="$1">$1</b>')
でいいじゃん
2018/05/16(水) 22:03:54.34ID:???
ループさせますが何か
2018/05/16(水) 23:57:30.03ID:???
>>533
お前が正規表現に慣れてるだけだろwwww
知らんやつにはそっちのほうが宇宙語だろw
2018/05/17(木) 00:38:42.11ID:???
中途半端に新作作るならいっそリメイクの方が売れると思う
2018/05/17(木) 00:42:57.16ID:???
jsは昔っからコールバック使うが。
そういう言語だ。
pythonとかから来た人かな?
2018/05/17(木) 00:59:32.71ID:???
あ?昔から? JavaScriptでmapやreduceが
使えるようになったのはIE9からなんだが?
昔はそんなコード書いてねーよ
2018/05/17(木) 01:40:37.68ID:???
IEをサポート対象外としてきたものは幸福である
2018/05/17(木) 01:52:20.30ID:???
IE以外はネスケしかないって時代を知らんのだろうなw
それでよく昔からなんて言えたものだ
2018/05/17(木) 02:11:05.39ID:???
>>538
おまえ頭湧いてんのかwww
コールバックって言ってんだろwwww
コールバック使うのはmapreduceの専売特許じゃねーんだよアホwwwww
2018/05/17(木) 03:14:54.20ID:???
昔から使うsetTimeoutもcallbackだな
callbackが昔から使われていることと、replace()が昔からあることは別だが

callbackで配列や文字列操作する関数って昔からあったっけ?
2018/05/17(木) 06:21:36.32ID:???
>>535
そんなんだから君には成長がないんだよ
2018/05/17(木) 06:29:42.28ID:???
はぁ?去年から10kgは成長しとるで?
2018/05/17(木) 07:30:57.08ID:???
もう成長する毛髪もないクセに・・・
546Name_Not_Found
垢版 |
2018/05/17(木) 09:12:07.01ID:+SF4BPiN
自演で誤魔化し乙w
「昔からある〜でいいじゃん」とか言ってるくせに人には君には成長がないキリッとか笑うww
2018/05/17(木) 20:16:53.61ID:???
何が言いたいんだこいつ
喧嘩したいだけのJS無関係レスは他所でやれ
2018/05/17(木) 21:16:59.69ID:???
>>533
無理に正規表現を使わずとも、昔からあるfor文でいいじゃん

for (var i = 0, l = ary.length, s = ''; i < l; ++i) {
s += '<b id="' + ary[i] + '">' + ary[i] + '</b>';
}
2018/05/17(木) 21:29:14.42ID:???
これが見慣れてるな
2018/05/17(木) 21:48:22.10ID:???
ループ外で使うsをループ初期化部で宣言するのは駄目じゃないか
2018/05/17(木) 22:02:15.20ID:???
一旦代入したsを更新し続けるのも良くないよ
2018/05/17(木) 22:08:05.80ID:???
全部const使えってか?
2018/05/17(木) 22:09:24.93ID:???
それが良いと思う
2018/05/17(木) 22:26:25.10ID:???
>>550
それは確かだが、昔からシリーズとしてはsを外に出すのが正解だな
2018/05/17(木) 22:37:26.27ID:???
>>533は数字以外が来たときに壊れる一番ダメなやつじゃん
2018/05/17(木) 22:43:15.75ID:???
変数の異目的の再利用が、コードの見通し上よろしくないのは知ってるが
再代入も追記追加変更もNGというのは初めて聞いたな
2018/05/18(金) 03:15:41.51ID:???
前から気になってたけどconstの変数は再代入するとエラー出るけど
const obj={}みたいにオブジェクトにすると中は再代入しまくりなのが混乱するのですが
これはobjectとかarrayはconst宣言しない方がいいってことですか?
2018/05/18(金) 03:53:08.93ID:???
他のところでうっかりvarで再定義再代入されないだけと考えたほうがいいってこと
2018/05/18(金) 05:49:13.18ID:???
>>556
const房というなんでもかんでもconstにすればいい、と考える極端な人がいるらしい
基本、気にしなくてOK
2018/05/18(金) 06:00:17.51ID:???
const宣言された変数の中身がオブジェクトや配列だった時に中身の操作が可能なのは、なんで?
参照だから、って考えたら混乱しないし一応筋は通るけど、必然性はないよね
2018/05/18(金) 06:19:08.20ID:???
const には「再代入不可」以外の意味はないからね
プロパティの更新も禁止したいなら
Object.defineProperty とか Object.freeze
2018/05/18(金) 17:21:46.36ID:???
>>558-560
use strict宣言ではvarの代わりにconstを使う、みたいなのを見たのでてっきり変数宣言の主軸なのかと思っていました
>>561
なるほど(エラーは設定しないといけないみたいですが)そういう関数があるのですね
2018/05/18(金) 18:58:08.98ID:???
constを基本にするのは別に悪いことじゃないよ
必須かと聞かれると自分はletばかりだけど
564Name_Not_Found
垢版 |
2018/05/18(金) 19:35:55.40ID:rKRag9JE
TDZのクソ挙動が気に入らないのでvarです。
functionスコープで特に問題ない。
大規模開発するなら使うけど。
しないなら必要ない。不便なだけだぞ。
2018/05/18(金) 21:06:39.05ID:???
それ本当にTDZの挙動に不満持ってるのか?
再宣言禁止で
let a = hoge
と次の
a = fuga
が揃わないとかならまだ少し分かるが
定義場所前でのundefinedを期待する必要性なんてまず無いだろう
2018/05/18(金) 23:26:18.45ID:???
TDZは重宝してる
2018/05/19(土) 02:25:49.15ID:???
fromってどういうとき使うの・・?

var arr=['kyoto','oosaka'];
console.log(Array.from(arr, n=>`${n}-fu`).join(", "));
console.log(arr.map(n=>`${n}-fu`).join(", "));

mapでいいじゃん・・みたいな
2018/05/19(土) 02:34:37.26ID:???
配列風オブジェクトを配列に変換したい時に使う
569Name_Not_Found
垢版 |
2018/05/19(土) 13:30:15.68ID:TKsYmqdA
[...配列風オブジェクト]でいいじゃん
2018/05/19(土) 17:23:00.70ID:???
>>569
配列風オブジェクトにスプレッド演算子が使えるとは限らないんだが

実際にEdgeでNodeListにスプレッド演算子は使えない。
古いChromeとかも使えないようだ。
2018/05/19(土) 18:31:51.94ID:???
古いブラウザ持ち出したらfromも使えないじゃん
572Name_Not_Found
垢版 |
2018/05/19(土) 18:36:57.78ID:O/Yxf4Ui
fromはpolifilでできる
スプレッド演算子はbabelで使えるようになったとしても
NodeListでは使えない
2018/05/19(土) 18:55:29.64ID:???
だったらアロー関数もletもconstもトレイリングカンマも使うなよ
2018/05/19(土) 19:12:45.53ID:???
ぶっちゃけ必要が無い限り使わんなあ
2018/05/19(土) 19:38:52.11ID:???
>>573
babelで変換可能なものは使うよw
2018/05/19(土) 21:28:56.72ID:???
>>572
Symbol対応していればポリフィル可能だよ

NodeList.prototype[Symbol.iterator] ≒ Array.prototype.values
だから
2018/05/19(土) 21:32:49.32ID:???
>>568
iterableでない配列likeオブジェクトに対応できない
578577
垢版 |
2018/05/19(土) 21:35:39.93ID:???
>>577は>569宛
2018/05/20(日) 14:37:34.10ID:???
そういうツッコミは感心しないな
この靴は山を登るときに使う
いや、エベレストに対応できない
みたいな
2018/05/20(日) 16:43:05.57ID:???
熊の毛皮はあんまり寒いと役に立たないらしい。そういうときは犬の毛皮を使うそうだ。
なんだ、熊の毛皮つっかえねーな
2018/05/20(日) 17:29:49.09ID:???
じゃああんまり寒いと熊、絶滅しちゃう?
2018/05/20(日) 18:13:12.78ID:???
>>579
この場合は、Array.fromは不要というニュアンスへの反論だからおかしくはないと思うが
2018/05/20(日) 19:21:02.36ID:???
>>581
熊には体脂肪という毛皮をサポートするものがあるから大丈夫
2018/05/20(日) 19:37:28.85ID:???
俺にも脂肪はたくさんついているが?
2018/05/20(日) 20:40:15.97ID:???
髪の毛がついてないから寒さに弱いんだよ
2018/05/21(月) 18:45:07.49ID:???
暇つぶしに姉妹スレもよろしくおねがいします

+ JavaScript のお題用スレッド +
https://mevius.5ch.net/test/read.cgi/hp/1526666703/
2018/05/21(月) 21:14:25.17ID:???
スマートホン
スマフォ
2018/05/21(月) 21:18:23.96ID:???
セマフォ
589Name_Not_Found
垢版 |
2018/05/21(月) 23:41:14.10ID:N1KmZ/qF
全くの初心者ですが、
便利なウェブサービスを作りたくてJavaScriptを勉強しはじめました。

質問ですが、
ブログによく貼ってある、
カエレバ、ヨメレバってJavaScriptでできているのですか?
2018/05/22(火) 00:58:13.06ID:???
カエレバ.comそのものがどうやってできている、という意味なら
カエレバは、amazonや楽天などそれぞれのアフィリエイトパーツのルール(やテンプレート)に則った
アフィリエイトリンクを生成するサービス >>589

カエレバ利用者がブラウザからアフィID情報など打ち込んだとき
動的にアフィリンクを生成する処理部分で、少なくともJavaScriptが使われている
(ようはjavascriptを使った穴埋め問題)

あとは各サイトのテンプレートを一旦kaereba.comのサーバーサイドで処理のため
ここではphpが使われてるぽい
仮に、アフィIDによって商品IDそのものもが変わってしまうなら
各サイトへリクエストする必要がある
(ただほとんどのアフィリエイトパーツは穴埋め問題みたいなテンプレだろうが)

穴埋め問題だけなら、フロントエンドだけのjavascriptで実現できるし
極端に言えば個人使用なら文字通りテキストエディタで穴埋め問題すればいいだけ

もしリクエストする必要があるなら
・各サイトのレスポンスがクロスサイトに対応している、ならjavascriptだけで可能
・対応していなければ、phpやNode.jsみたいなサーバーサイドでの処理が必要
・対応しておらずサーバーサイドも嫌なら、ブラウザなどフロントエンドの設定を変える
など、この辺りがポイント
2018/05/22(火) 01:28:37.89ID:???
質問ですが、
ブログによく貼ってある、
ビックカメラ、ヨドバシってJavaScriptでできているのですか?
2018/05/22(火) 02:24:52.55ID:???
質問ですが頭によく貼ってある
2018/05/22(火) 02:26:11.46ID:???
地毛にきまっとるだろーが
2018/05/22(火) 02:51:33.73ID:???
JigeScript
2018/05/22(火) 04:52:54.78ID:???
Selectionオブジェクトでは
始点をanchor、終点をfocusと呼んでいます
anchor=碇なのは、選択開始部分を「そこに留める」ことからの発想だと思います
そう考えると、必ずしも始点が前、終点が後ろにあるとは限らないってことですよね?
文字選択というものは一般的にそうですし。
一方Rangeオブジェクトでは始点をstart、endと呼んでいます
この場合は始点が前、終点が後ろ(あるいは始点=終点)と保証されているということでしょうか?
2018/05/22(火) 05:11:56.81ID:???
>保証されている
少なくとも仕様ではそう。
例えば start を end より後に設定しようとすると end も変更される
2018/05/22(火) 05:20:24.05ID:???
>>596
そうなのですね
ありがとうございます
2018/05/22(火) 06:06:14.54ID:???
そもそもLtoRとRtoLが交じってることもある文字列で頭と尾を一般に定義することは出来ない
一応の挙動は決まっていても人間の尺度で保証されていると考えると痛い目にあうぞ
2018/05/22(火) 07:11:24.49ID:???
> そもそもLtoRとRtoLが交じってることもある文字列で頭と尾を一般に定義することは出来ない

どちらでも、頭は上で、尾は下だろ。
2018/05/22(火) 07:16:35.64ID:???
RtoLって言っても、要素の前後関係が変わるわけではないのでは?
たとえばrangeの先頭から末尾まで舐める処理は、LtoRだろうがRtoLだろうが同じように動作しますよね
2018/05/22(火) 09:08:41.33ID:???
いずれにしても、見た目上は左が前で右が後だけど、ここでいわれる「前」と「後」は 前(previousSibling) と後(nextSibling)?
DOMノードレベルとブラウザに描画されるレベルでは、前後の定義が変わるのでは?
2018/05/22(火) 10:44:30.80ID:???
RtoLで2要素跨いでる場合はどういう順番になるんだろう
2018/05/22(火) 13:28:48.90ID:???
>>601
なに言ってるんだ? 先に現れたのが前だろ
2018/05/22(火) 13:35:57.83ID:???
先って?
2018/05/22(火) 14:05:37.24ID:???
メモリアドレスの小さい順だが?
2018/05/22(火) 19:04:47.97ID:???
ファイルにしろDOMにしろ本質的にはシーケンシャルなのですよね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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