JavaScript の質問用スレッド vol.125
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvvv:1000:512 JavaScript を自ら学ぶ人のための質問スレッドです。 >>2-5 のテンプレを読んだ上で質問してください。次スレは>>950 が>>2 の「次スレの立て方」を元に立ててください ■質問を書く上で (1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。 (2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。 (ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など) (3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。 (4) 常に自発的に調べる心構えを持ってください。 具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。 わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。 (5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。 (6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。 ※必ず「問題の事象が再現されること」を確認してください。 必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。 (7) サンプルコードに HTML が含まれる場合は http://validator.w3.org/ で [Check] してみてください。 (8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2 の質問テンプレートを活用してみてください。 (9) ライブラリ関連の質問は禁止です。関連スレにあるライブラリ質問スレで質問して下さい。 (10) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。 ■前スレ JavaScript の質問用スレッド vol.124 https://mevius.5ch.net/test/read.cgi/tech/1636525464/ VIPQ2_EXTDAT: checked:vvvvvv:1000:512:: EXT was configured >>131 ありがとうございます。 まず進捗させないとけないんでそのやり方でやってみて、後々何がエラーの原因なのかは自決できるように調べてみます。 JavaScript(JS)は、Ruby の数倍難しい 初めてのJavaScript 第3版 ――ES2015以降の最新ウェブ開発、2017 例えば上の本は、サイの表紙のサイ本と呼ばれるけど、 これだけ勉強しても、文法しか学べない 改訂2版 Ruby逆引きハンドブック、2018 一方、サイ本と比べて、上の本は、多くの主要モジュールの使い方まで説明している。 大体のコーディングパターンまで学べる。 つまり中級者向けなのは、文法のページが少ないから JSだと、ES3, ES5, ES6 の20年に及ぶ、膨大な文法の変遷を追っていかなければならない。 ES2015(ES6)から、ようやくクラスも出来て、Rubyっぽくなってきた ちょっとした比較でも、あいまい比較演算子== は使ってはならない。 厳密比較演算子=== だけを使うとか、初心者がはまる罠が多い 学ぶ順序としては、Ruby → JS を勧める >>131 では、callback 関数が呼ばれる前に、どちらの処理が呼ばれるか、既に分かっている状態でしょ。 直接引数に、呼ばれる処理を入れている callfunction('huga'); callfunction('hage'); 一方、>>130 では、callback関数が呼ばれる前には、どちらの処理が呼ばれるか、まだ分からない状態。 callback関数の中で初めて、どちらの処理が呼ばれるかが決まる コンソールからは実行出来るのに、 拡張機能からだと無視されるのは何? 乱数の生成について質問です。 日付をシードとした乱数を生成したいのですがどうも偏ります。 シードの採用の仕方にルールなどがあるのでしょうか? xorshiftのものを2個試しましたが 2ことも偏っていました。 https://jsfiddle.net/4dz70wxp/3/ ちょっとだけ違う初期値に対して乱数がほしいという用途は想定外だろう 欲しいものはMurmurHash3みたいなハッシュ関数ではないか? もう少しいじってみたけどどうやらシードの桁数不足が問題なのかな new Xorshift32(seed * 1000000) とかにするだけで最初の値にもだいぶ幅が出る いやいや偏りってそういうことじゃなくてって話ならごめんだけど >>139 不勉強でよくわかってないですが やりたいのは後で再現できる単純にランダムな遅延時間がほしいだけです。 >>140 delayMaxを100にしてみましたら3回目ぐらいから取れそうと感じました。 シードが小さすぎるということは 一般的には シードを与えるなら 乱数関数が受けられるシードの最大数/関数で生成されるシードの最大数をかけて でシードの範囲を広げたほうがいいということなのでしょうか。 それとも単純に今回はシードが小さすぎて特殊事例であまり気にする必要はないと言う感じでしょうか。 お二人ともありがとうございます。 next()が与えられた値にビット演算をあれこれやって次の値を出してるから シードが2桁整数ではほとんどのビットがゼロなために 最初の演算結果が狭い範囲に収まってしまってるんでないかと >>143 ありがとうございます https://jsfiddle.net/4dz70wxp/5/ 42億あるうちの下一桁をいじるだけではだめみたいですね。 一日かわればseedも大きく変わるようにして 念の為、3回目あたりをとってみます。 ありがとうございました。 https://jsfiddle.net/f9h4zu1x/ 少し間違ってた 桁数が少ないのが問題じゃなくて、ビットの可変幅が狭いのが問題 だから桁数増やしてもシードの増分が1なら結局同じ 日付を上の桁に持っていけば1回目も改善する ブラウザ上での音声認識と録音について質問です。 現在、マイクから音声認識を行い、簡単な対話を行うWebアプリを作成しようとしています。 Web Speech APIのSpeechRecognitionを使用して音声認識には成功しましたが、これに加えて録音も同時に行いたいです。 SpeechRecognitionは喋っている内容を取っているので、そこから音声ファイルを作成できないかとやったのですが、目的の資料を見つけることができませんでした。 そのため、SpeechRecognitionと並行してmediaDevices.getUserMediaを使い録音する形で実装しました。 PCでは成功したのですが、スマホ(Android、iOS共に)だとmediaDevices.getUserMediaでストリームを使用とした時点で音声がすべてそちらに取られてしまい、音声認識が出来なくなってしまいました。 今度は録音した音声データをGCPのSpeech-to-Textの音声認識に回すかたちで実装してみましたが、即座に認識結果が得られず、対話のテンポが悪くなるため、微妙な感じになってしまいました。 音声認識と録音を両立する良い方法はないでしょうか? 他人が書いたJavaScriptのコードは読みにくいですよね? >>147 自分が書いたコードすら後から見るとよく分からないなんてことはザラ function double(number){ const result=number*2; return result; }; const a=double(10); console.log(a); でコンソールに20と表示されますが、return resultの所のイメージがつかめません function double(number){ const result=number*2; }; console.log(result); もっと簡単にこれでは20と表示されないんでしょうか? すみません わかりました double(number)に戻り値number*2を返してるんですね だからdouble(10)で20になると JavaScriptのパズルをやってたんですけど、このコードだけで意味がわかりますか? https://i.imgur.com/A4xj7Qh.jpg 最初の定義とか色々省かれていませんか? 初心者だからはっきりわからないのですが… これぐらいなら簡単 変数名と関数名がちゃんと付けられてるからそこから読んでいけば普通に読める >>153 変数のlistとかどこにも定義されて無いんですけど… console.log(list)とか突然書かれても、初心者にはわかりにくい どこから出てきたのかと… >>152 任意の数値リストを突っ込むと最大値出してくれるっていうコードだろこれ 問題の方にあるのかも知らんし ここで聞かれても分かんね 問題はこんな感じです https://i.imgur.com/lImN0zM.jpg (画像の下の方が切れてますが、>>152 の画像と同じものが入っているだけです) あまり親切じゃないから初心者には向いて無いのかな? このコードは十分初心者向けに書かれていると思うけどねぇ ただmax=0にしているから、基本は0より大きな数の配列の中から最大値を調べる処理という事に 次のステップなどで対応するならいいけどね max の初期値を配列の先頭から取れば済むだけだが ようやくわかりました 2つめの関数の中で前に定義した1つめの関数を実行してるんですね 関数は定義&実行で1ペアと考えないといけない 次に進みます #を付ける プライベートクラスフィールドが分かりにくい。 解説しているサイトも少ない。 Adobe Illustratorのスクリプトを書くのにHTMLの知識いりますか? JavaScriptの入門書を読んでたんですけど、前半のJavaScriptの文法の所まで読み終わりました 後半はHTMLとJavaScriptの組み込み方みたいになってるんだけど、ここ読む必要あるのかな? もちろん知ってた方がためになるんだろうけど、次のAdobe JavaScriptの本へ行こうか迷っています… DTP(印刷)でillustratorを使ってるのでWebは扱っていません AdobeのjavascriptというかESバージョンめちゃくちゃ古くて記述するの苦労したが最近はどうなんだ 自己レスですが必要無いそうです ES2015以降も必要無いそうです constとかletが使えないので全部varになってる >>164 CEPでも使わない限りはHTMLの知識は不要。 pg9 = win1.pnl.add('group') pg9.orientation = "row" CAN = pg9.add("button",[0,0,100,30],"cancel") OK = pg9.add("button",[0,0,100,30],"OK") CAN.onClick = function(){win1.close()} OK.onClick = function(){ win1.close() dofn() } win1.show() } // テキストを元のサイズに戻すための計算 var txtresize=100/bai*100; // テキストフレームだけを選択する activeDocument.selection = null; // 全ての選択を解除する var txtObj = activeDocument.textFrames; for (var i=0; i<txtObj.length; i++){ // テキストフレーム数だけ繰り返す try { txtObj[i].selected = true; // 選択する }catch(e){} } //選択したテキストを"sel"とする var sel = app.activeDocument.selection; //選択したテキストの数で繰り返す for (i=0; i<sel.length; i++) { //選択したテキストの幅と高さを元の大きさに戻す sel[i].resize(txtresize,txtresize); } // オブジェクトの選択を解除する for (var i=0; i<sel.length; i++){ try{ sel[i].selected = false; }catch(e){} } プログラムの最初の方は省略したのですが、 CAN.onClick = function(){win1.close()}の所で、キャンセルがクリックされた時にそれ以降のプログラムが実行されないようにしたいのですが、どう書き換えればいいでしょうか? return;ではそれ以降が実行されてしまいます CAN.onClick = function(){win1.close();exit();} みたいなことをやりたいのですが、exit()はAdobeScriptにはありません… >>170-171 質問の意味がわからない CAN.onClick = function(){win1.close()} で処理は終了している コールバック関数について、伺いたいのですが。 コールバック関数は、引数に渡される関数という理解でいますが。 これは関数であって、オブジェクトメソッドを渡すこともできますでしょうか。 例えば、 object.addEventlistener() などの、メソッドも渡すことができますでしょうか? object.addEventlistener なら関数だから渡せるけど object.addEventlistener() は渡せないな >>173 object.addEventlistenerで渡せるが、実行時のthis値が変わるので、期待通りに動作しない bindを使うか、「コールバック関数を渡す関数」にthis値束縛機能があればそれを使う必要がある ありがとうございます。 Object.AddEventlistenerでも、コールバック関数になりうるということですね。 ただし、期待していることはできない。 関数(ユーザー定義)をコールバック関数にすることはイメージつくのですが。 オブジェクトメソッドをコールバック関数にするイメージがつきません。 何か、例文があれば教えていただけますでしょうか? あ。addEventlistener以外で構いません。 >>176-177 this値の変え方まで書いているのに、なぜにイメージ? コールバック関数を使ったコードを書いて試せばすぐにわかる問題 AdobeScriptなのですが、 https://i.imgur.com/Ycwp6Nj.jpg 上の画像の「四角のパスの四隅をハサミツールで切って、塗りを線にする」まではスクリプトで出来るのですが、「短辺を特定する」ということはスクリプトで出来るのでしょうか? 一般的なJavaScriptの話でもいいのですが、出来るとか無理そうとか… 質問です、どなたか教えて下さい、どうか宜しくお願いいたします インターネットラジオ JCBA FMはな再生ページ https://www.jcbasimul.com/fmhana 上記サイトを開くとCookie利用承諾の画面が出てきます。この利用承諾画面は document.getElementsByClassName("cookieBanner__btn")[0].click() とすることで自動的にOKボタンを押して閉じることができました。引き続き再生ボタンを押したいので document.getElementsByClassName("MuiSvgIcon-root")[0].click() としましたが、残念ながら自動的に再生ボタンを押すことができません。自動クリック自体が禁止 されているような雰囲気です。たぶんサイト側でクリック禁止にしているのだろうと思いますが これを利用承諾画面と同じようにJacaScriptで自動クリックするする方法はないでしょうか? ユーザー操作が起点じゃない場合は音声再生をブロックする、という制限がブラウザ側でかかってることがある その場合はブラウザの設定で解除できるかもしれない >>181 iframeの中かつshadowDOMの中なので一発で要素を取得できない document.querySelector(".radioPlayer__iframe").contentDocument.querySelector("#player_ui").shadowRoot.querySelector("button").click(); jcba-playerカスタムエレメントはplay()メソッドが実装されてるようなので document.querySelector(".radioPlayer__iframe").contentDocument.querySelector("#player_ui").play(); でもいける こうじゃないか document.getElementById("player_ui").shadowRoot.querySelectorAll("button")[0].click() または document.getElementById("player_ui").play(); >>183 すばらしい!有り難うございます!そのどちらの方法でも再生ボタンがクリックできました! 何を勉強したらあなたのような達人になれるのでしょうか?本当に有り難うございました! >>184 お答えくださり有り難うございます。ただ、残念ながらその方法はどちらもNGでした。 "player_ui" を "#player_ui" に変えても駄目なので、すみませんが>>183 を使わせてもらいます。 if( ){ };の( )の中に「関数txtfn()が一度も実行されていなかったら」という条件を書きたいんですけど、どう書けばいいんでしょうか? 無理でしょうか? すみません、これがコードです。 SEL = activeDocument.selection LAY = activeDocument.activeLayer for(s=0; s<SEL.length; s++) SELfn(SEL[s]) function SELfn(sx){ if(sx.typename != 'PathItem') return if(sx.filled == false) return c1 = sx.fillColor if(c1 != "[GrayColor]"){ val = c1 txtfn(); } } function txtfn(){ alert(val+"です"); } alert("グレースケールです"); 本当は、関数txtfn()が一度も実行されなかった場合に最後に「グレースケールです」と表示したいのですが、 このコードのままだと毎回最後に「グレースケールです」と表示されてしまいます。 「グレースケールです」は1度だけの表示したいのです(表示する回数が多すぎることになるので) 単にループ前にフラグをfalseにでもしておいて、一度でも実行すればtrueにすれば判断出来るのでは? >>188 SEL = activeDocument.selection LAY = activeDocument.activeLayer var yk=0; for(s=0; s<SEL.length; s++) SELfn(SEL[s]) function SELfn(sx){ if(sx.typename != 'PathItem') return if(sx.filled == false) return c1 = sx.fillColor if(c1 != "[GrayColor]"){ val = c1 txtfn(); } } function txtfn(){ alert(val+"です"); yk=1; } if(yk!=1){ alert("グレースケールです"); } これで出来ました。 ありがとうございます。 すまん、敢えてここで聞かせて Windows しか持っておらず、JavaScript の Safari での動作確認のため極力安い MacBook かなにかを買いたい。 中古でもなんでもいいんだけど、今時の Safari が動くやつって何を選べばいい? Mac も iOS も Safari の系譜もよく分からず途方に暮れてる。 いわゆるブラウザのデベロッパーツールで動作確認したいので、多分 iPhone とかじゃだめなんだよね? アドバイスおねがい safariのバージョンってiOSと連動だって話だったと思うから最新のiOSサポートしてる機種ならええんでないの? Mac系のスレで理由話して最新のiOSが動く安いやつどれ?って聞くのが確実だろう 動作確認のために実機買うなんて景気のいい話だなぁ羨ましい 俺ならBrowserStackとかLambdaTest使っちゃうけどね iPhone持ってる人に実機テストしてもらっちゃうな >>192 景気なんてよくねーよだからケチりたいんだろ。 でも何そのおもしろそうなキーワードは。調べてくる >>193 これまで作ったのをたまたま iPhone で見たら動いてないのがあってね。 元々 Safari とか眼中には無かったけどそんなに特殊なことやってるとも思ってなかったんで、動かないとか思ってなかった。 あんまり気分悪いんでちょっと調べておこうかと。 >>191 やっぱ最新OS じゃないとダメかということでそこを軸に探すと、フリマで 2万台くらいらしいってことは分かった。 あと iPad の Safari でもデベロッパーツールを動かせるらしいことが分かったので、そっちの線もありそう。 つか MacOS と iOS って違うのね… なにはともあれ、取っ掛かりは掴んだ気がする。 ありがとう イベントオブジェクトを使わず、thisを使って、 そのイベントの発生元の要素を取得することは可能でしょうか? すみません、先日JavaScriptによるクリックについて質問した者です 情けないのですが、今度は別サイトの再生ボタンがどうしても押せず困っています インターネットラジオFM++ FMはなび再生ページ https://fmplapla.com/fmhanabi ソース見るとiframeもshadowDOMも使っていないように見えるのに、再生ボタンを押せません document.getElementsByClassName("player_start_button")[0].click() document.getElementsByClassName("start_stop_button_button")[0].click() 上記2つとも駄目でした。どうすればJavaScriptで再生ボタンをクリックできるでしょうか? どなたかもう一度だけ教えてください、宜しくお願いいたします 該当する要素がない start_btns = document.getElementsByClassName("player_start_button") console.log( start_btns.length ) //=> 0 start_stop_btns = document.getElementsByClassName("start_stop_button_button") console.log( start_stop_btns.length ) //=> 0 >>197 ブラウザの DevTools でイベントリスナーの click を見ると見つかる >>199 chromeだと当該要素の「検証」をすると出てくる >>201 document.querySelectorAll("button")[0].click()で行けました 有り難うございました こういう程の良い距離感のアドバイスを遅れる人間になりたいですな >>170 ですが、やっぱりキャンセルボタンを押すと CAN.onClick = function(){win1.close()}の所で終わらなくて、最後の行まで実行されるんですがどうすれば中断出来るんでしょうか? キャンセルしてもテキストの大きさが変わって終わります そもそもキャンセルボタン押す前にテキストサイズ変わってんじゃねえの >>205 「画像とテキストが一緒になってる図で、画像だけ拡大縮小してテキストサイズはそのままにする」というスクリプトなんですけど、キャンセルすると図の大きさはそのままでテキストだけ拡大縮小してしまうんですよ これでは困るのでキャンセルの箇所でコードから抜け出したい CAN.onClick = function(){win1.close(); return; } ではなく、 CAN.onClick = function(){win1.close()} return; 上は、その無名関数から抜け出すだけで、 下は、全体の処理から抜け出す >>207 まだ仕事中で確かめられていないのですが、キャンセルでなくてOKの時も抜けたりしませんか? >>207 return;を入れると、違う動作を始めたので保留にします。 時間がある時に考えます。 どうもありがとうございました。 <div id="zahyou" style="position:absolute">aaaaaaaaaa</div> <スクリプト> for(let n=1;n<=100;n++){ if(n % 2 === 0){ document.getElementById("zahyou").style.left = "0px"; } else{ document.getElementById("zahyou").style.left = "200px"; } } </スクリプト> としてもaaaaaaaaaaの位置が全く動かないけど <スクリプト> let n=0; setInterval( function(){ if(n % 2===0){ document.getElementById("zahyou").style.left = "0px"; } else{ document.getElementById("zahyou").style.left = "200px"; } n++; } ,100 ); </スクリプト> とするとaaaaaaaaaaの位置が動くのはどうしてですか? >>210 画面のレンダリングは逐一行われないから。 イベント契機で実行されたスクリプトの処理を一旦終えたときその最終的な結果がレンダリングされるというか、一旦処理を終えないとレンダリングされないと思っておけばいい。 setInterval のやつは、インターバルの契機で実行された処理は1コマ分の処理だけして終わるから、その都度レンダリングされる(かもしれない)。 実際は周期があまり高頻度だと、処理を終えてもレンダリングされるとは限らず間引かれたりする。 ただ未レンダリングだからといってもDOMの状態やスタイルの設定などは逐一適用されてる。 >>212 そうだったんですか ありがとうございます a = "0px"; a = "200px"; a = "0px"; a = "200px"; a = "0px"; a = "200px"; こういう処理を100回やってから、100回目の後だけ再描画されるのだろう。 1〜99回までは値が設定されるだけで、再描画されない 横からで申し訳ないけど、アニメーション処理を行うならsettimeoutとかでわざと描画間隔を空ける必要があるって解釈でいいのかな? >>215 一コマ毎にイベント処理を終えブラウザに処理を返す構造にしないといけない あるいはスタイルや SVG でアニメーションさせるか ブラウザでは、Performanceパネルや タイムラインパネルでチェックできる アニメーションならsetTimeoutよりrequestAnimationFrameだね >>216 >>218 わっちょい違うけど同一人物です 勉強になります ゲームセンターにある機械とか、パソコンゲームでは、よくコマ(フレーム)落ちが起きる 1/30秒とか1/60秒の間に、処理が終わらないので、再描画できない 例えばドキュメント上に5つのアイテムがあるとして、その5つのアイテムそれぞれの幅を合計したものが知りたいのですが、途中までコードを考えました (5つというのは仮のアイテム数で実際は未定です) DOC=activeDocument; SEL=DOC.selection; for(i=0;i<SEL.length;s++){ BND=SEL[i].geometricbounds; W=BND[2]-BND[0]; Wが最初の1つのアイテムの幅になると思うのですが、これをSEL[0]~SEL[4]まで合計するにはこの続きにどういうコードを書けばいいのでしょうか? (間違っていたら既に書いてあるコードを変更してください) すみません 質問してから気付きました これでいけますか? DOC=activeDocument; SEL=DOC.selection; for(i=0;i<SEL.length;s++){ BND=SEL[i].geometricbounds; W1=BND[2]-BND[0]; W=W+W1; } >>224 ありがとうございます for(i=0;i<SEL.length;i++){ ~ }っていう式がコードの中にいくつも出てくるんですけど、変数iのところはそれぞれの式で変えないといけないんでしょうか? for(j=0;j<SEL.length;j++){ ~ }とか。 関数内だけですか? 同じ変数文字が使えるのは いい質問ですね 変数のスコープの問題なので試してみたらいかがでしょう? jsのスコープをしっかり押さえると 伸びしろが変わります! ありがとうございます 勉強を始めて1か月ですけど改造はわりとうまく出来るようになりました 最初は何が書いてあるのかわからないんだけど、ジーッとしつこく見てるとわかって来ますね let も var も(スコープ内)再代入可能です let i=0; for(i=0;i<10;i++,console.log(1,i)); for(i=0;i<10;i++,console.log(2,i)); console.log('------'); for(i=0;i<10;i++){ console.log(3,i); for(i=0;i<10;i++){ console.log(4,i); } } console.log('------'); let t=0; for(i=0;i<10;i++){ console.log(5,i); for(t=0;t<10;t++){ console.log(6,t); } } >>228 中腹の二重ループについて敢えてやってるなら説明が必要じゃね。 >>229 for(i=0;i<SEL.length;i++){} for(j=0;j<SEL.length;j++){} と質問されてるので入子構造なんだろうなと 入子じゃないですよ ドキュメント上にアイテムが複数あって、何回も全アイテムを移動したり変形したりする必用があるので並列です >>228 何回も使えるんですね ありがとうございます ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる