+ JavaScript の質問用スレッド vol.126 + [転載禁止]©2ch.net
JavaScript を自ら学ぶ人のための質問スレッドです。 >>2-4 のテンプレを読んだ上で質問してください。 ■質問を書く上で (1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。 (2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。 (ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など) (3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。 (4) 常に自発的に調べる心構えを持ってください。 具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。 わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。 (5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。 (6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。 ※必ず「問題の事象が再現されること」を確認してください。 必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。 (7) サンプルコードに HTML が含まれる場合は http://validator.w3.org/ で [Check] してみてください。 (8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2 の質問テンプレートを活用してみてください。 (9) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。 こんにちは。 どなたか教えていただけませんか。 下記のようなコードを書いたのですが、 div部分が1つなら問題ないのですが、複数になると2つ目以降は反映されません。 そこでループにしないといけないのかな?と思うのですが知識が未熟でどうすればいいのか全くわかりません。 どなたかどうすればいいか教えて頂けませんでしょうか。 よろしくお願いします。 // HTML <div class="fullimg"><img src="./img1.jpg" height="1000" width="1000"></div> <div class="fullimg"><img src="./img2.jpg" height="500" width="500"></div> // script let imgd = document.querySelector("img"); let result = imgd.getAttribute("src"); let hresult = imgd.getAttribute("height"); let wresult = imgd.getAttribute("width"); const div = document.getElementsByClassName("fullimg"); div[0].innerHTML = '<label for="' + result + '"><img src="' + result + '" height="' + hresult + '" width="' + wresult + '"></label>'; ループ以前にlabelのfor属性は関連するフォーム要素のIDを指定するものなので生成しようとしてるhtml自体に問題があるよ では再度サンプルコードを書いておきます。 // HTML <div class="fullimg"><img src="./img1.jpg" height="1000" width="1000"></div> <div class="fullimg"><img src="./img2.jpg" height="500" width="500"></div> // script let imgd = document.querySelector("img"); let result = imgd.getAttribute("src"); let hresult = imgd.getAttribute("height"); let wresult = imgd.getAttribute("width"); const div = document.getElementsByClassName("fullimg"); div[0].innerHTML = '<img src="' + result + '" height="' + hresult + '" width="' + wresult '">'; こちらでどうぞよろしくお願いします。 >>372 せめてループに挑戦してるけどうまく動かないから助けてってとこまではたどり着いてほしい気がするなぁ 初心者向けのループのレクチャーなんていくらでも見つかるわけだし >>375 どこかから拾ったサンプルコードの修正依頼で自分は全く知識がないのだろう これで音信不通になるようではな 諦めたか他所へマルチしに行ったか これは、取得した値をそのまま設定しているだけだから、何も変わらない jQuery なら、 // fullimg クラスの付いたdiv の、直下のimg $( 'div.fullimg > img' ).each( function ( index, elem ) { jQ_this = $( this ) const src = jQ_this.attr( 'src' ) // 取得 const height = jQ_this.attr( 'height' ) const width = jQ_this.attr( 'width' ) console.log( `${ index }: ${ src }, h: ${ height }, w: ${ width }` ) jQ_this.attr( 'src', src ) // 設定 jQ_this.attr( 'height', height ) jQ_this.attr( 'width', width ) } ) ログ出力 0: ./img1.jpg, h: 1000, w: 1000 1: ./img2.jpg, h: 500, w: 500 【環境】VS Code バージョン: 1.77.0 Electron: 19.1.11 Chromium: 102.0.5005.196 Node.js: 16.14.2 V8: 10.2.154.26-electron.0 OS: Linux x64 5.4.0-42-generic 【何をしたのか】イベントリスナー内でevent.target.valueを参照した。 【エラーメッセージ】プロパティ 'value' は型 'EventTarget' に存在しません。ts(2339) 【サンプルコード】 (() => { "use strict"; const fruit = document.querySelector('select'); if (null === fruit) { return; } fruit.addEventListener('change', (event) => { if (null === event.target) { return; } console.log(event.target.value); }); })(); fruit === event.targetを実行するとtrueが返ったので、event.target.valueをfruit.valueに書き換えたところエラーが消えた。 イベントを扱うサンプルコードでは大抵event.target.valueが利用されているが、HTMLSelectElement.valueで置換した場合に何か落とし穴はありますか。 >>380 エラーが消えたからヨシ!は好ましくない まずはts(2339)で検索してみよう >>381 エディタ上でts(2339)が出ていてもブラウザ上での実行は問題なくできます。 キャストするとts(2339)が消えますが、「型アサーション式は TypeScript ファイルでのみ使用できます。ts(8016)」が発生します。 ブラウザで実行すると、「Uncaught SyntaxError: Unexpected identifier 'as' (at hoge.html:24:35)」が発生します。(TypeScriptの構文なので当然ですが……) fruit === event.target;はtrueなので置き換えたのですが、トラップや問題はありますか。 (エディタ上のts(2339)も消えるし実行もできるので、落とし穴がなければこれで行きたいな、と) >>382 そもそもTypeScriptを書こうとしてるわけじゃないのになんでtsエラーが出てるの?ってこと vscode右下の言語モードがTypeScriptになってるんじゃないの? >>383 なってないです。拡張機能も無効です。 i.imgur.com/TE6gwcY.jpg >>384 うちではTSでは出るけどJSでは出ない https://i.imgur.com/TJimdvc.png https://i.imgur.com/kj2oMNk.png おそらく何かvscode側の問題だろう で、エディタの問題ならなおさらfruit.valueで解決とするのは悪手 >>384 わかった、vscodeの設定に↓があるんじゃない? "js/ts.implicitProjectConfig.checkJs": true これ追加したらうちでもJSでエラー出た >>385 >>380 原因が判明しました。"js/ts.implicitProjectConfig.checkJs"がtrueでした。 型のチェックはしたいので、event.target.valueの上に@ts-ignoreを書いて解決します。 ありがとうございました。 >>386 まさにそうでした。ありがとうございました。 jQuery では、event.target.value でも、正常に動く <div id="btn-wrap"> <button class="BtnA BtnAll" value="1">A-1</button> <button class="BtnA BtnAll" value="2">A-2</button> <button class="BtnB BtnAll" value="3">B-3</button> </div> <div id="btn-wrap-2"> <button class="BtnC BtnAll" value="11">C-11</button> </div> $( function ( ) { // 外側・親に、イベントを付けて、親で、子のイベントをキャッチする $( '#btn-wrap' ).on( 'click', function ( event ) { const value = $( event.target ).prop( 'value' ) console.log( value ) alert( value ) } ); $( '#btn-wrap-2' ).on( 'click', function ( event ) { console.log( event.target.value ) alert( event.target.value ) }); } ); >>387 @ts-ignoreもなんか負けたみたいでいやだけども調べてみてもいい解決策はなさそう 致し方なしかな >>389 正常に動くかどうかの話はしてないよ よく読もう fruitがHTMLSelectElementなのは確定してるから event.currentTargetがHTMLSelectElementであることは推定できそうだな event.target じゃなくて event.currentTarget にしたらどうなるかね >>387 型チェック入れるとか if (null === event.target || !(event.target instanceof HTMLSelectElement)) { return; } キャストするとか console.log(/** @type {HTMLSelectElement} */ (event.target).value); >>392 そのへん少し試したけどうまくいかなくて諦めてた 致し方なしとか言う前にもう少し手を尽くすべきだった 反省 >>391 currentTargetもts(2339)が発生します >>392 元々、nullチェックは'event.target' は 'null' の可能性があります。ts(18047)のエラーを消すために入れていたのですが、 条件を!(event.target instanceof HTMLSelectElement)に書き換えてもts(18047)とts(2339)は発生しないので、解決しました。 JSDocコメントでのキャストは気づきませんでした、こちらが適している場面があればこちらも利用していきます。ありがとうございました。 >>390 >>393 そうなんです、@ts-ignoreを使用している行で他のエラーが出た時に気づけなくなるので、あまり使用したくないです。 遅い時間までお付き合いいただき、ありがとうございました。 ところで、event.targetの代わりにfruitを使用すべきではない明確な理由はないが、event.targetを使用するのが(通常|普通|無難)である。ということで合っていますか。 1つのイベントハンドラが複数の要素に対して設定されることは一般的で、その場合はevent.targetを使うことになる 今回のケースはそうでないにしても、可搬性や拡張性を考えれば常にevent.targetを使用しておくという判断は妥当だろう あと処理結果は同じでも、イベントの起こった要素に対して処理をする、という意図をコードに残す意味もある いずれにしろ現時点のそのコードだけを考えるならお好きなように >>395 確かに以下のような場合にはEvent.targetを使う必要があるし、「意図をコードに残す」にとても合点がいきました。 <button data-x="1">btn1</button> <button data-x="2">btn2</button> const btns = document.querySelectorAll('button'); for (const b of btns) { b.addEventListener('click', e => console.log(e.target.dataset.x)); } >>389 に書いた 複数のコントローラーに、イベント登録する場合、 外側・親に、イベントを付けて、親側で子のイベントをキャッチする このjQuery信者は文脈や論点ってものを全く理解しないのな jQueryでは~jQueryなら~ってただただ念仏を唱えて布教に励む様子がまさに信者 Slickで出来てSwiperでできないようなアニメーション処理って何かある? Mathjaxって配列環境でcolspan, rowspanって使えないのか? \multicolumnというべきか JavaScript でローカルファイルを読み書きするにはどうすればいいでしょうか? fetchという関数が使えるかと思ったんですが、blocked by CORS policy というエラーになってしまいます。 CORS(Cross-Origin Resource Sharing)制限は、 ローカルPC 上に、何かのサーバーを立てて、そこから配信すれば良い VSCode の拡張機能、open in browser では、 file:/// から始まるローカルファイル・アクセスだから、CORS制限あり file:///C:/Users/Owner/Documents/test.htm 一方、Live Server では、サーバーを立てているから、CORSにならない http://127.0.0.1:5500/test.htm 同様に、コマンドプロンプト・PowerShell から、 1-liner で、Ruby で作られた遅いウェブサーバー、WEBrick を起動すると、 ruby -run -e httpd . -p 8080 これも、サーバー経由だから、CORSにならない http://localhost:8080/test.htm JavaScriptで電卓を作るよ。 JavaScript + HTML + CSS で電卓やホームページを作るのが今の目標です。 マイナーな質問 XyJaxで、一括して文字色を変える方法教えてくれ \color{red}を使っても、その箇所だけしか変更できない。 \xymatrix環境内全部の文字色を変えたい こんにちは。 誰か教えてください。 <style> .def { color: red;} </style> <div> <p class="abc">aaa</p> </div> <div> <p class="abc">bbb</p> </div> <script> dif = document.querySelectorAll('.abc'); dif.forEach(element => document.querySelector("div").classList.add("def")); </script> このようなコードですが、実行すると1つめのaaaを囲ってるdivにしかclassが追加されません。 条件にあるすべてのdivに追加するにはどうすればいいのでしょうか? >>408 document.querySelectorAll('.abc').forEach(element => element.closest("div").classList.add('def')); >>409 レスありがとうございます。 closestなんてものがあるのですね。知りませんでした。 おかげで思うように行きました。 ありがとうございます。 >>408 これでもいけると思う document.querySelectorAll('div:has(> .abc)').forEach(x=>x.classList.add('def')); これでもいいのかな?間になにか挟まってたらダメだけど ('div >:is(.abc)') >>411 ,412 こちらもありがとうございます。 大変助かります。 https://jsfiddle.net/um71qgzf/3/ こんな表示状態で、textarea に入力して改行していき、表示可能行数を超えると、スクロール状態になります。 入力された行数に応じて textarea が縦に伸びて、textareaのコンテナにあたる li もそれに応じて縦に伸びるようにするにはどうすればいいのでしょうか? textarea 高さ 自動 でググるとそれっぽいのあったよ SELECTタグで、人物を選択出来るようにしたいのですが、SELECTが非展開の時はIDだけ表示して、 展開した時だけ、IDと人物名が表示されるようにする方法を教えてください。 人物配列 ↓ var array = [ { "id": 1, "name": "人物1" }, { "id": 2, "name": "人物2" } ] こんな表示にしたいです。 ↓ https://i.imgur.com/WWwRHPV.jpg >>417 一応確認するが、非展開時に数字にする意図は何? フォーム送信時に数字を送信したいだけなら、尊信値(value属性値)と表示する選択肢(子要素の文字列)を分けて書くだけで良いのだが https://getbootstrap.jp/docs/5.0/components/dropdowns/ Bootstrap 5 のDropdowns のページの一番最後に、 ドロップダウンイベントについて書いてある show.bs.dropdown/shown.bs.dropdown このイベント発生時に、表示テキストを入れ替えれば? 変数名はキャメルケース(getNameなど)がよく使われるようですが、 スネークケース(get_nameなど)はやはり使わない方がいいですか? https://liveweave.com/6IlWRJ JavaScriptでスプリッターを作っているのですが、左右を分割するスプリッターをマウスで動かしても、マウスの位置とずれてしまいます。 どのように修正すればいいのでしょうか。 >>423 良いか悪いかはさておき 考え方としては そのコードを、どのくらいの範囲で共有するのか ってのを基準に考えたらいいと思う 自分だけなら好きにすればいいし 身内だけなら話して決めればいいし 広範囲なら世間一般の流れに合わせるべき みたいな >>417 すんごい前だけど 似たようなことを頑張ったことある でもやっぱり select要素が開いているかどうかを判定出来ないので 原理的に出来なくて select要素のように振る舞うものを 手作りするのが早かったです 今動作しているのがサーバ上(https//:~)なのかローカル(file:///C:~)なのか区別する必要性が出てきました。 locationで取得する以外にいい方法ありますか? 区別さえ確実にできれば得られる値は(true/falseなど)なんでもいいです。 >>427 window.location.protocolを見れば良いんじゃないかな httpかhttpsなら、みたいな var people = [{ "id" : "ID1", "name" : "人物1", "room" : "1" }{ "id" : "ID2", "name" : "人物2", "room" : "2" }] var select_tag = document.getELementById("my_select"); for ( var i = 0; i < people.length; i++ ) { var option = document.createElement("option"); option.value = people[i].id; option.innerText = people[i].name; my_select.append(option); } こういう感じの select を設置して、option が選択された時に、選択された人物の room を取得するにはどうすればよいのでしょうか? >>429 select_tag.selectedIndexに 今選ばれてるoptionが何番目かが入ってるから select_tagのchangeイベントにフックして その数字を拾って、people[数字].idを参照したらいいよ ごめん間違えた people[数字].roomだった すまんこ >>431 出来ました!ありがとうございます! select_tag.addEventListener("change", (e) =>{ let i = select_tag.selectedIndex; alert(people[i].room); }); 今のJavascriptファイルの管理って、どれがスタンダードになっていますか? webpackはだいぶ古いんですよね? >>435 そもそもwebpackは管理するものではないのだが… バンドルツールのシェアのことなら webpackがまだまだ支配的だと思う viteとturbopackが頑張り始めたところだけど この辺はJSだけの話ではなくなるので なんとも言い難い感じ パッケージの管理のことなら npm一択な気がする ツール自体はyarnとかpnpmとか色々あるけど Ruby on Rails では、npm は遅いから、yarn を使う Rails 7 からは脱webpack で、 Import Maps で、CDN から直接インポートする HTTP/2 が普及して、バンドル・Node.js が不要になった。 バンドル不要のTailwind を使う バンドルするなら、esbuild, rollup, webpack を使う。 esbuildならCSS プロセッサとして、Bootstrap を使う >>436-438 バンドルツールのことです。 webpack→viteと学んでいるのですが、 正直複雑すぎてついていけてません・・・ 特にviteでバンドルして生成されるファイル構成に どうしても違和感があって、勉強を中断しています。 ChatGPTに聞くとviteのようにハッシュ値で変換した ファイル名にすることでセキュリティが高まるそうですが、 元のファイル名から変わるのに違和感を覚えます Vite は、Vue.js の作者だったか? Vueも、Vue 3 で人気が無くなって、React 一色になった 2, 3年前は、Vueが転職で有利だったのに、 今は、React, TypeScript ブラウザのキャッシュ対策として、 ファイル名はハッシュ値の方が良い ファイルを更新するとハッシュ値も変わるから、 古いファイルがキャッシュされない どうせ配布用のファイル名だから、開発用には関係ない Viteの書き出すファイル名はconfigで変更できたような >>439 元のファイル名がわかることに どこまで意味があるのか?って話じゃね? たとえばbabel+webpackだって トランスパイル、パッキング後は 部分的にバイナリになったりするわけで 要するに人間の読めるものではなくなる つまり、ファイル名がハッシュ化されなくても 人間が得られるものはせいぜい そのファイルがなんなのかの想像がつきやすい 程度のこと ファイル名が中身と全く関係ない なんてこともよくあるとは言わんまでも 一定数わけで、となるとデプロイされるファイル名には それほど大きな意味がない ってことが多いのではないかな Vite は、Ruby on Rails をコピーしたのかな? foreman, webpack-dev-server で、hot reload するみたいな? ファイルを修正したら、即ブラウザに反映されるとか 開発時には、CSS をコンパイルせず、 動的にスタイルを当てているだけとか Viteの使い方がやっとわかりました! ファイル名が変わるのは許容します これから少しずつ学んでいきます みなさんアドバイスありがとうございました 実際にサイトをサーバーに公開することになったらファイル名のうしろにつくハッシュ値の恩恵がわかると思うよ キャッシュのこと気にしなくていいからね アプリで登録されたユーザー情報をWEBアプリで管理するということで 制作会社から管理画面のラフが送られてきたのですが、 ある箇所で、アプリで登録したユーザーのメアドをプルダウンで選択するんだそうです。 続き 「今はテストなので登録数は20-30件ですが、仮に50,000人とかになったら?」 と尋ねたら「プルダウンされた50,000行の中から目視で探す」んだそうで それが正しいやり方だと言い張って平行線です。 どう論破したら良いでしょう? 長文の投稿ができなかったので分割にて投稿させていただきました。 何卒よろしくお願いいたします。 論破もくそもねーわ 変更したいなら変更すればいいじゃん これ100%発注側の問題だからな まあそうだわな 客あるあるだけど 欲しいもの、必要なものをちゃんと説明できないのは 本当によくあることで だいたいの不幸や不具合はそこが起点になるんだ 作る側もそれはわかってるから 出来るだけ真意を聞き出そうとはするんだけど で、平行線になってるってことは 説明不足のまま、もう作っちゃったからでしょ ちゃんと追加料金払って変更してもらいなさいな 今後のために教えてください。 「アプリで登録されたユーザー情報」を「WEBアプリで管理したい」 という話し合いはしていましたがプルダウンにする/しないという 話し合いは確かにしていませんでした。 また自分は普段別の領域で制作業務を行なっており アプリに関して無知ですが制作系はそこそこのクライアントをこなしています。 アプリの業界では特に話し合いを詰めないと この様な非常識な仕様がポンと出てくるものなのでしょうか? 自分がいる業界ならば二度と仕事は振られないと思います。 (考えれば使いづらいのは話し合うまでもなくわかるでしょう、それがわからないのなら次はない、という感じ) >>452 >「アプリで登録されたユーザー情報」を「WEBアプリで管理したい」という話し合い いやいやざっくりすぎやろw 項目すら詰めてないとか非常識にもほどがあるんだけど >この様な非常識な仕様がポンと出てくるものなのでしょうか? どういう会社にどういう条件でいくら支払うか次第 海外とかにユルユルな発注を低予算でやるとそれなりによくあること さすがに5万件になったら使いづらいというのは受注側も百も承知 それが理解できないような人間には出会ったことがない お金の問題かスケジュールの問題か人不足か いずれにしろ仕様変更の影響度が大きすぎるから今の条件では対応できないということ ぶっちゃけ言えば君から二度と仕事を振られなくても別に困らないということでもある 非常識な業者は多い。 だから優秀な社員、又はアドバイザーみたいな第三者を雇う。 例えば家の売買なら、直接売買せずに宅建業者を通すのと同じ 後はキャンセルして、裁判して金を取り返す。 そんな業者と付き合っても損するだけ 詐欺みたいなもの >>452 >アプリに関して無知ですが 無知な人が関わっちゃったのが 問題の根っこなのはさて置き データ件数とかは設計時に検討した?のかな? 自分も死ぬほど経験しているけど ウェブ制作会社のディレクターって ウェブのこと全然知らないじゃん? あんまり関わらない方がいいよ 自分でも作れるけどやらないだけ、くらいになるまでは 登録済みユーザーを一覧できる画面とか存在しないのかな? 負荷を無視して単に使い勝手を改善したいならデータリストに変更すれば解決 独自のプルダウンを開発すれば5万件いける 無限スクロールすればいい 質問者です。 知り合いのエンジニアさんが助けてくれて 解決できる機能のソースコードは持っていて、 自由に使って良いですよ、と言われているのですが 提案したらクオリティの担保ができないから断られました。 まあわかるんですが、クオリティが低いから問題になっているのですが、、という感じです。 その開発会社思ったよりはまともそうでよかったじゃんw 書けば書くほど墓穴を掘っていくな 君が第一にやるべきはソースコードを渡すことじゃなくて どう修正して欲しいかを含めて整合性のある要求仕様としてまとめて提示することだぞ 単純なCRUDアプリなんだから要求仕様さえきちんとまとまっていればこんな問題は起きない モバイルアプリで登録済みのユーザー情報を管理するためのWebアプリなら 普通は検索画面、一覧画面、ユーザー単位の詳細画面があって 一覧画面や詳細画面からユーザー単位の編集画面へリンクされるので 編集画面でそのユーザーのメールアドレスをドロップダウンから選ぶ必要はない あるユーザーと別のユーザーを手作業で紐づける機能が必要ということであれば ユーザー単位の編集画面から紐づける機能を起動して検索画面 -> 一覧画面 -> 詳細画面と辿る この場合は紐づけ処理中かどうかで一覧画面や詳細画面の内容を変える必要があるから画面数の扱いとしては別画面 このくらい小規模な開発だと 要件定義含めて客とのやり取りと 客に説明するためのドキュメント作りがコストの大半だからな それを理解しない客は避けるに越したことがない >>463 単純なCRUDアプリであれば、 整合性のある要求仕様を提出しなくても ある程度のクオリティが上がってくるものだとおもっていました。 こちらは私の完全な落ち度ですね。 ただ、この場合制作会社が 「仕様書がなかったから、或いは具体的な指示がなかったから50,000行を一気に表示しても良いと思った」 として50,000行を一気に表示するようなものを作った、みたいなことはよくあることなのでしょうか? 自分の業界であれば素人のクライアントには合理的な解決法をアドバイスするかなと思います。後で自分が地雷撤去で困ることもあるし、次の仕事がほしいので。 >>466 >単純なCRUDアプリであれば、 >整合性のある要求仕様を提出しなくても >ある程度のクオリティが上がってくるものだとおもっていました。 アホすぎるww 提案内容が気に入らないなら望ましいと思う内容に変更してもらえばいいだけなのになぜそれができないんだろう? そこに問題の本質がありそう >>468 日本語の堪能なアメリカ人なんですけど 正しいから直す必要がないの一点張りなんですよね。 >>469 下らない嘘までついて隠さなきゃいけない裏事情があることだけはよく分かった read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる