jQuery 質問スレッド vol.8
■ このスレッドは過去ログ倉庫に格納されています
JavaScriptでDOM用ライブラリであるjQueryのスレです。 次スレは>>950 が>>2 のテンプレ案(本スレで改善案があれば考慮)を元に立ててください このスレはjQueryやjQuery UIの使い方やjQueryプラグインの作り方を質問するスレです。 jQueryを使って作る側のスレであって、こんなプラグインありませんか?と聞くスレではありません。 そういうのは自分で探してください。 ろくにサポートもされてなさそうな野良プラグインの使用はおすすめしません。 JavaScriptの質問は関連スレで質問して下さい。 ■前スレ jQuery 質問スレッド vol.7 https://mevius.5ch.net/test/read.cgi/hp/1478055094/ ■関連スレ JavaScript の質問用スレッド vol.130 https://mevius.5ch.net/test/read.cgi/hp/1501503056/ ECMAScript デス 6 https://mevius.5ch.net/test/read.cgi/tech/1483332914/ JavaScript ライブラリ総合質問所 vol.5 https://echo.5ch.net/test/read.cgi/hp/1465399470/ ×そういう変数を作って ○そういう関数を作って でした 追加で質問です。変数とコンポーネントの紐付け jQueryなどのJavaScriptライブラリやフレームワークを 使わない場合はどうやるのでしょうか? その方法があるとして、jQueryにも応用できますか? >>780 リテラルとは何のことでしょうか >>781 別人ならもっと別人らしく書いてください >>782 ありがとうございます 読んでみます >>782 の記事を読んでいますが 未知のパラダイムの洪水で混乱してきました 素直にデータバインディングライブラリの勉強した方がいいパターンですねこれは・・ だからそう言ってるだろ… でもデータバインディングライブラリはいっぱいありすぎて逆に迷うな。 ある程度高機能になったらそこまでやるならもうvuejs使えよってなっちゃうからそれよりシンプルかが判断の分かれ目か。 https://github.com/gwendall/way.js/ とかどうかね?あとrivets.jsとか… >>785 確かに単機能でシンプルな方がいいですね 見てみます ありがとうございました 以下のような、横に伸びるtableのtdで同じ文字列が連続した場合 colspanでセルを結合するロジックを組みたいのですが どのようにすれば実現できるか悩んでおります <table> <thead> <tr> <td>2018</td> <td>2018</td> <td>2019</td> </tr> </thead> </table> ↓以下のように同データをcolspanとして結合するロジックが作りたいです なおデータはソートされております。 <table> <thead> <tr> <td colspan="2">2018</td> <td>2019</td> </tr> </thead> </table> よろしくお願いします >>787 過去スレに似たような話が出たけど なに? コピペ? また同じ話したいの? $('td').each (function() { var prev = $(this).prev(); if ( prev.text() === $(this).text() ) { var num = prev.attr('colspan'); // 3連続以上にも対応 num = num ? parseInt(num) + 1 : 2; $(this).attr('colspan', String(num)); prev.remove(); } }) データがソートされてるなら、自分と直前(兄、prev)の要素が、 同じかどうか確かめればよい 兄が自分と同じなら、兄を削除して、自分にcolspanを付ける セレクターには、id を付けて、絞り込んで下さい。 <tr> が、2行以上あると、誤動作するかも >>790 > <tr> が、2行以上あると、誤動作するかも 普通複数あるだろw 表のヘッダーだけじゃないのか? 表のデータも、1つのセルにまとめるのか? <tr><td>A</td><td>A</td><td>B</td></tr> <tr><td>B</td><td>C</td><td>C</td></tr> >>790 で、<tr> が、2行以上あると誤動作するかもって言うのは、 上の例で、1行目のB と、2行目のB がつながってしまうから これを避けるには、1行ずつ分けて、処理すべき >>790 動作を確認できました 超リスペクトです ありがとうございます! 他の方が指摘している部分で問題が無いか確認しつつ、参考にさせて頂きます >>792 自分はtrごとにclassを付けて対応しました あくまでヘッダで使いたかったので煩くはならなかったですが、10行超えるような行で適用すると泥臭くなりそうだとは思いました 複数行にも使うの? 複数行の場合は、 >>795 の例では、2行目のB に、colspan="2" が付くから、ダメだろ 1行ごとに一旦、処理を切らないといけない >>789 は、難解すぎて、訳がわからない >>790 を複数行にも対応できるように、修正した $('td').each (function() { var prev = $(this).prev(); // そのtr の、最初のtd は、処理しない。continue if (prev.length === 0) { return true; } if ( prev.text() === $(this).text() ) { var num = prev.attr('colspan'); num = num ? parseInt(num) + 1 : 2; $(this).attr('colspan', String(num)); prev.remove(); } }) >>799 > は、難解すぎて、訳がわからない 縦横量対応 + jQueryプラグイン化してあるからねw 短いのであれば、こっちにあった(少しだけ変更してみた) コードの説明はリンク先へ http://toro.2ch. sc/test/read.cgi/hp/1452081417/732 $('td').attr('colspan', function() { return $(this).text() === $(this).prev().text() ? null : 1; }).filter('[colspan]').attr('colspan', function() { return $(this).nextUntil('[colspan]').length + 1; }).end().remove(':not([colspan])'); そういや >>789 は更に最初からcolspanがある場合にも対応していたはず 色々と参考コードをありがとうございます 799さんのコードは理解が難しかったですが、改造案件ではこういうのをワンサカ見るんだろうなと思うので理解できるよう努力したいと思います 何度も同じjQueryオブジェクトを使う時には 今でも一旦変数に代入した方がいいのでしょうか? $document = $(document) のように。 パフォーマンスから言えば代入した方がいいはずですが、 もう気にしなくていいような気もします マシンが高性能になっているので マイクロ秒レベルのパフォーマンスの違いなんて気する時代ではないのでは? という意味です というか1マイクロ秒の違いすらあるのか怪しいですよね・・ documentならいいだろうが複雑でパフォーマンス考慮のないCSSセレクタ書くとマイクロ秒オーダーじゃ済まないよ 確かに引数に文字列を渡す場合はパース処理が入るので何度も実行したくはないですね 引数がDOMオブジェクトの場合は許容範囲の感じがします 場合によりけりということでしょうか ありがとうございました みんなjqueryオブジェクトには$付き変数つかってる? それとも気にしない派? おれは気にしない派 >>808 > documentならいいだろうが複雑でパフォーマンス考慮のないCSSセレクタ書くとマイクロ秒オーダーじゃ済まないよ 具体例あげられますか? そこそこの規模のDOMを用意し、CSSセレクタでパフォーマンスの観点から避けるべきと言われていること(ユニバーサルセレクタとか子孫セレクタとか一般兄弟セレクタとか)をあえてすべて踏む長めのセレクタをぶっこんでトライ! まさか計測まで人にやらせるつもりじゃねーだろうな >>813 計測はこっちでやってやるよ お前は黙ってセレクタを書け >>814 じゃ黙ってDOM用意しな。セレクタはDOM依存だからな。 セレクタの遅さはDOM依存じゃないが? そんなにDOM用意しろって言うなら ほらよ。遅いセレクタ書いてみなw <span>a</span> DOM依存であることを示してるように見えるのだが… >>817 オレなら >>816 のaを選択するのにたっぷり0.1秒はかかるセレクタを書くことができるッ! しかもそいつはつい先日納品したプロジェクトで使用したばかりのやつだッ! >>804 2回以上使う場合で、その間、変化が無いなら、変数に入れて使うべき 変数に入れずに、2回書いたら、その間にDOM に、 何か変化があるのかも、と思ってしまう 変化が無いなら、変数に入れた方が、わかりやすい $(event.currentTarget) とかもわざわざ変数に入れるんですか? コールバックの中でvar $this = $(this);とか稀によく見る >>821 入れてもいいってだけで基本的に変数に入れない。実行速度に問題があって 変数に入れると速度の問題が解決するって場合だけ入れる。 > $(event.currentTarget) > とかもわざわざ変数に入れるんですか? 入れない $(this)もそうだが、カッコの中がDOM要素の場合は、セレクタよりも遥かに 速度が早いので変数に入れても問題が有る速度を解決することにはつながらないだろう それから変数に入れる前にチェインでつなぐことを考えたほうがよい。 チェインするのは変数に入れるのと同じ効果がある またそもそもチェインすらいらないかもしれない 例えばこういう書き方もできる http://api.jquery.com/jQuery/#entry-examples-1 $( "<div/>", { "class": "test", text: "Click me!", click: function() { $( this ).toggleClass( "test" ); } }) http://api.jquery.com/css/#css-properties .css({ "background-color": "#ffe", "border-left": "5px solid #ccc" }) http://api.jquery.com/attr/#attr-attributes $( "#greatphoto" ).attr({alt: "Beijing Brush Seller", title: "photo by Kelly Clark"}); この使い方も重要 http://api.jquery.com/attr/#attr-attributeName-function $( "#greatphoto" ).attr( "title", function( i, val ) { return val + " - photo by Kelly Clark"; }); 1. title属性を取得して 2. title属性を加工して 3. title属性を再設定する ということを変数無しでできる 引数に関数を渡すことで、変数に一旦入れる必要がなくなる。 ↓つまりこんなコードを書かなくて良くなるということ var $greatphoto = $("#greatphoto"); var title = $greatphoto.attr("title"); title = title + " - photo by Kelly Clark"; $greatphoto.attr("title", title); >>825-826 ありがとうございます 知らない方法ばかりです 関数を渡してフィルタみたいな処理ができるのは良さげです 変数をなるべく使いたくないっていうのは、 関数型っぽく書きたいっていうところから来てるんですよね >>827 名前を使いたくない ってのが一番大きい理由だと思うよ おれ自身はチョイ関数でもバンバン定義する派だけど、使いたくない理由もわかる >>820 804ではないが参考になった 以前速度差ないとのことで変数に入れずにいたが そういうことならわかりやすくていいですね 変数使わないべき、それ以外認めんと徹底抗戦してたのいたからな >>820 が変数に入れるべきと言った途端 > 2回以上使う場合で、その間、変化が無いなら、変数に入れて使うべき ↓これだよw > 変数使わないべき、それ以外認めんと徹底抗戦してたのいたからな >>820 > 変数に入れずに、2回書いたら、その間にDOM に、 > 何か変化があるのかも、と思ってしまう > > 変化が無いなら、変数に入れた方が、わかりやすい どういうこと? 変数に入れた所で、変化するでしょ? $id = $('#id') $id.text(123); $id.text(); // 変数に入れたのに123に変わってる jQueryにDOM要素の状態をさせるメソッドは たくさんあるけど、どれも変数に入れても変化するものばかり 唯一の例外はremoveしても(DOMの状態は変化しているが) jQueryオブジェクトには参照が残ってるってことぐらい それだけなのに"変化がないなら変数に入れたほうがわかりやすい"は大げさ 変数に入れてもDOMは変化してる 変数に入れていれば、その間になにも変化がないように言い方は 誤解のもとでしかないのでやめたほうが良い $ul = $('ul') console.log($ul.children().length) // 5 $ul.children().remove(); console.log($ul.children().length) // 0 -------- $ul = $('ul') console.log($ul.children().length) // 5 $ul.append('<li>') console.log($ul.children().length) // 6 -------- $ul = $('ul') console.log($ul.parent().attr('id')); // undefined $('#id').append($ul) console.log($ul.parent().attr('id')); // id いや、再代入してないよw ----はただの区切り 別々の話ね。 >同じjQueryオブジェクトを使う時には とあるのに何入れ替えてるんだよw 変数に入れても、 ・DOM要素の内容は変わる ・DOMの構造も変わる ・DOM要素の参照は残ってる って所かな? jQueryとか関係なく var elm = document.getElementById('id'), って書いてるのと同じ。 ID=idをdocumentのDOMツリーからremove()しても、 elmという参照は残ったまま 逆に言えば、参照は残ったままだけど、 DOM要素への変更は反映される。jQueryでも同じ >>838 めんどくせーな。 これでお前でも理解できるだろ? 変数に入れてもDOMは変化するんだって 例1 function exp1() { var $ul = $('ul') console.log($ul.children().length) // 5 $ul.children().remove(); console.log($ul.children().length) // 0 } 例2 function exp2() { var $ul = $('ul') console.log($ul.children().length) // 5 $ul.append('<li>') console.log($ul.children().length) // 6 } 例3 function exp3() { var $ul = $('ul') console.log($ul.parent().attr('id')); // undefined $('#id').append($ul) console.log($ul.parent().attr('id')); // id } 変数に入れておけば、異なる参照を指すことはない。 このリストが、別のリストに変わったりしない 変化する場合でも、その要素・コンテキスト以下・子孫要素しか変わらない 祖先の要素が変わって、別の要素を指すようになったりしないから、 意図がわかりやすい >>841 よく考えてほしいんだけどさ、 一行目、私は○○にデータを書き換えます。 二行目、○○にデータが書き換わった状態であってほしい これの方が直感的だよね? >>840 そんなことは書かれる前からわかっとるわ、基本だろ そういうことでなくて質問と>>838 はDOMを変化させない前提だろうよ パフォーマンス云々言ってるのだし だから変数に入れてもDOMは変化しますよって言ってるんだが? 変数に入れることで、どういう勘違いを あなたはしてるのですか?っていう話 順を追って説明しないと理解できてなさそう 1. DOMを変化させない前提 2. 変数に入れないと、DOMが変化するように見える 3. 変数に入れると、DOMは変化しないように見える 4. でも変数に入れても実際はDOMは変化する 5. つまり3は勘違い。変数に入れてるのをみてDOMが変化しないように見えたら、それは目が悪い。 久しぶりに除いたが「変数使わないべき、それ以外認めん」の人がまた勘違いで話捻じ曲げて強引に押し通そうとしてるのか その話は知らんけど、>>845 に何か物申すこと有る? × 変数に入れずに、2回書いたら、その間にDOM に何か変化があるのかも、と思ってしまう ○ 変数に入れても、2回書いた時、その間にDOMに何か変化があることがある。 × 変数に入れるとDOMは変化しない ○ 変数に入れるとDOMを変化させてもDOM要素への参照は残っている なんで正しい説明ができないんだろう? >>844 問題文をもう一度読もうか 先ずはそこからだ そして、これを踏まえて説明すると、 jQueryではメソッドチェーンでつなぐことで 変数に入れなくても、変数に入れたのと同じ状態を作ることができる。 >>850 問題文ってこれ? > 804 名前:Name_Not_Found[sage] 投稿日:2018/04/09(月) 12:47:31.90 ID:??? > 何度も同じjQueryオブジェクトを使う時には > 今でも一旦変数に代入した方がいいのでしょうか? > $document = $(document) > のように。 > パフォーマンスから言えば代入した方がいいはずですが、 > もう気にしなくていいような気もします じゃああんたはその次のレスを読もうか? そのレスが間違ってるって話をしてるんだから 変数に入れたらDOMに変化がないと思うだろ! いや、思わんね(笑) これだけの話 ちなみの最初の話をすると $document = $(document) 変数に代入しなくても、document変数に参照が残ってる。 $element = $(this) 変数に代入しなくても、this変数に参照が残ってる element = document.getElementById('id') $element = $(element) 変数に代入しなくても、element変数に参照が残ってる わけで、毎回 $(documet)、$(this)、$(element) を実行しても (DOMではなく参照が)変わらないことは保証される 一般的にイベントのデレゲーションは負荷軽減に繋がると言われていますが $(document).on('click','.hoge a',fn) のようにセレクタで指定している場合、 クリックのたびにイベントが起きた要素がセレクタと一致するかを調べるので 結構負荷が高くなるのではないかと思いました $('.hoge a').on('click',fn) のように要素に直接リスナを登録した場合、セレクタの解釈はリスナの登録時だけなので、負荷は小さくなるのでは? ただデレゲーションの場合、リスナ登録時に存在しないDOMのイベントも捕捉できるという意味もあるので 簡単に置き換えることはできませんが 表に、100セルがある場合、 各セルに、イベントハンドラーを付けると、100個になる これらの処理が似ている場合には、 表に、1つのイベントハンドラーだけを付けて、 各セルの座標値を、計算した方がよい >>855 負荷とひとまとめにしてるけど、 典型的な速度を取るかメモリを取るか問題やね デレゲーションを使うと、 1. イベントハンドラの設定が1回ですむ(速い) 2. イベントハンドラが一つで済む(メモリ少ない) 3. イベント発生ごとに発生した要素のチェックが必要(遅い) 4. 要素を増やしてもイベントハンドラの設定は不要(速い) 要素ごとにイベントハンドラをつけると 1. イベントハンドラの設定が要素の数だけ必要(遅い) 2. イベントハンドラが複数必要(メモリ多い) 3. イベント発生しても発生した要素のチェックが不要(速い) 4. 要素を増やす時イベントハンドラの設定が必要(遅い) イベントハンドラの分メモリが必要と言っても関数の中身自体は共通化できるので イベントハンドラを持っていますよーという情報のメモリ またセレクタに一致しているかどうかは、比較的最近のブラウザなら Element.matchesメソッドがDOM APIに追加されてるのでさほど遅くないはず で結局の所トレードオフ問題でどちらが良いかはやってみないとわからないし 環境によって変わるし、DOMの構造によっても変わるだろうし、 俺なら気にせずデレゲーション使うだろうな >>826 の、上の程度ならもちろん変数使わないが 実際複雑になったり長くなったりすると下に近くするな 好みだが深くするのが嫌なので >>857 コードまで書いて一生懸命答えてても元文読み違えてたら全て無駄 の典型的パターンだよな >>859 同じく。↓とか $('#hoge').children('li').eq(計算).children('span').text(なんたら).attr('hage', かんたら); $('#hoge') .children('li').eq(計算) .children('span').text(なんたら).attr('hage', かんたら); って書けば良い 改行できない病かなにかか? >>864 むしろ流れ的にどうやったら改行の問題と読んだのかそのプロセスが知りたい 学生のテスト対策のヒントになるかもw いや改行の問題なんて言ってないだろw 改行を入れることで、読みやすくできるという話だよ 変数に入れればいいって言ってるやつだって メソッド実行のたびに変数にだって入れないだろ? 「わかりやすい単位で変数に入れる」というはずだ。 だからそのわかりやすい単位で改行をいれればいいだけ >>859 ライブラリなどのサンプル見るとほとんどvarにセットしてる >>867 もういいよ、無理すんなって 益々墓穴掘ってる $('#hoge').children('li').eq(計算).children('span').text(なんたら).attr('hage', かんたら); を変数に入れるってどうするつもりだったんだろうか? var $li = $('#hoge').children('li') var $span = $li.eq(計算).children('span') $span.text(なんたら).attr('hage', かんたら); こうか? $('#hoge').children('li') .eq(計算).children('span') .text(なんたら).attr('hage', かんたら); ならこれで良い気がするな。 変数に入れるバージョンから、変数を取り除いただけ それよりも>>863 の方がわかりやすい気がするのは 行の最初に対象とするターゲットが来てるからかな eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); これは、jQuery のeq のソースコードだが、 これぐらい少なくても、this.length を2回使わない 同じものなら、変数に入れる。 その方が保守しやすく、最適化しやすく、少し速いかも ここは相変わらず、jQuery君が他人に噛みつき、荒らし回ってるんだな >>875 スレタイのどこに「他人に噛みつき、荒らし回る」と書いてある? >>873 >>826 の話とずれてる。 >>826 は処理対象を変数に入れるって話 設定値を変数に入れるって話じゃない ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる