のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,645,669人
昨日:no data人
今日:
最近の注目
人気の最安値情報

元スレjQuery 質問スレッド vol.8

JavaScript覧 / PC版 /
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter

751 = :

参照がなければGCされるということですか?
逆に言うとdataが含まれた要素をjQuery外から削除してしまったら
メモリリークになるということでしょうか。
危険ですね?

752 = :

だからjQueryを使いましょうという話になる

753 = :

麻薬の禁断症状は麻薬を使い続ればいいからな。理にかなっている

754 = :

>>752はイかれてるんじゃないかと正直思う
メモリリークなんて普段から怖がってかかるものじゃない
プロジェクトを進めてきて一段落する度にちょっと確認してみるだけ
それで意図しないメモリの増加があればメモリリークが起きてるのかなとなる

そのときにプロファイルをとって調べればいい
ただしjQueryのようなライブラリを使ってると調査の難易度が格段に増す

755 = :

Backbone.js は、DOM を削除した際に、そのDOMの子孫に、
イベントハンドラーがあっても削除されないから、メモリリークになるけど、

jQuery では、そういうイベントハンドラーも、自動的にすべて削除するから、
メモリリークにならないとか、何かで読んだ

まあ、jQueryをデバッグ実行して、確かめて下さい

756 = :

>>755
イベントハンドラがメモリリークするのは何故かと言うと

var element = document.getElementById('id');
element.addEventListener('click', function() {
 element.style.color = 'red';
},false);

みたいなコードを書くと、内部のelement.styleのelementが
外側のelement.addEventListenerのelementを参照して循環参照状態になるから
イベントハンドラがelementを掴んじゃってるから、elementを消すだけじゃ
循環参照になってしまうからメモリリークになる
一応今のブラウザはこの問題は解決されたことになってるが。

jQueryの場合は通常以下のような感じで書くので、循環参照することはないのでメモリリークもしない
(だってそこに有るのはオブジェクトではなくただのセレクタ文字列だもの)

$('#id').on('click', function() {
 $(this).color({color: 'red'});
 // $('#id').color({color: 'red'});
})

757 = :

replaceWithでも当然
dataやイベントリスナ―の処置はしてくれますよね?

758 = :

>>757
はい。jQueryを使っている限りメモリリークはしません

759 = :

>>758
jQueryは神なんですね
ありがとうございました

760 = :

神ではありません。素晴らしいライブラリです。

761 = :

なるほど。確かにjQuery.cleanDataを呼び出しているようだな

http://github.com/jquery/jquery/blob/662083ed7bfea6bad5f9cd4060dab77c1f32aacd/src/manipulation.js#L440
replaceWith: function() {
var ignored = [];

// Make the changes, replacing each non-ignored context element with the new content
return domManip( this, arguments, function( elem ) {
var parent = this.parentNode;

if ( jQuery.inArray( this, ignored ) < 0 ) {
jQuery.cleanData( getAll( this ) );
if ( parent ) {
parent.replaceChild( elem, this );
}
}

// Force callback invocation
}, ignored );
}

jQuery.cleanData に関しては

http://blog.livedoor.jp/aki_mana/archives/6919272.html
> GitHub で manipulation.js のソース読めば判るとおり、結構頻繁に jQuery.cleanData() が実行されてます。
> ― jQuery.cleanData() メソッドは、data() API として独自に実装された
> 「各要素と紐づけられるキー・バリューストア(メモリストア)」に対する処理なので、
> innerHTML を使う場合でも、jQuery.cleanData() を使うなら、まぁ問題無いです。

764 = :

連続している複数の要素をひとかたまりのjQueryオブジェクトにすることって出来ますか?
それに対してreplaceWithして、その部分をごっそり入れ替えたいのです
全てがある要素の子要素なら出来ると思いますが
そういうコンテナを設置せずにやりたいです

765 = :

>>764
複数の要素を一塊にするのが、jQueryオブジェクトの本質みたいなものだから
連続してようがしてまいが一塊にできる。

だけど連続してない場合に「どこと」入れ替えたいのかが区別つかない
あなたは連続していることだけを想定しているから、どこと入れ替えても同じ結果になるので
気にしていないかもしれないけど、jQueryは連続して無くても扱えるものなので
それを考慮しなければいけない

で、どうするかだけど、連続する複数の要素のうち
最初の要素を入れ替え対象とし、その後の要素は消してしまえばいい
(実際には処理する順番は逆にすることになるだろうけど)

$('li + li').remove();
$('li').replaceWith('<li>a</li>');

これが単純でわかりやすいと思うけど、頑張れば
メソッドチェーンで一行で書けるかもね

766 = :

>>765
なるほど~
先頭一つを残して削除するなんて思いつきませんでした
ありがとうございます

768 = :

Vanilla JSでどう実装するのか解った上で
jQueryを使いたいと思うのですが
そういう人のための総括的な解説をしている
書籍を探してます。
もし知ってたら教えて下さい。

769 = :

>>768
そういう人のためがどういう人なのか分からんが
普通にjQueryの良書でよい

コアjQuery+プラグイン/jQuery UI 開発実践技法 (Programmer's SELECTION)
http://www.amazon.co.jp/dp/4798124281

jQueryクックブック
http://www.amazon.co.jp/dp/4873114683

770 = :

>>769
ありがとうございます。
購読検討してみます。

771 = :

jQueryを使って
ある要素が何番目の要素なのかを調べるにはどうすればいいですか?

772 = :

×何番目の要素
○何番目の子要素

でした

773 = :

>>771
index()

775 = :

使えません

776 = :

>>773
ありがとうございます
出来ました
要素自体が属性として持っているんじゃないかと思っていたのですが
配列の要素が配列のインデックスを持っていないように
DOMの要素も自分のインデックスを持っていないのでしょうね

777 = :

変数の状態をコンポーネントに反映するみたいなことを
jQueryでスマートにやるにはどうするのが一番いいのでしょうか?
たとえば変数の状態をドロップボックスに反映させるなど。
もちろんそういう変数を作って呼び出せば出来ますが、
なんかイケてない気がします
反映させる処理をコンポーネント自体に帰属させて呼ぶ感じにしたいです
カスタムイベントでしょうか?

778 = :

最近のフレームワークは
使ったことはないのでよくは知りませんが
変数とコンポーネントの紐付けもやってくれてる感じがします
似たようなことをjQueryでやるにはどうすればいいのでしょうか

779 = :

×そういう変数を作って
○そういう関数を作って

でした

780 = :

よくわからんがリテラルにすればいいのでは

781 = :

追加で質問です。変数とコンポーネントの紐付け
jQueryなどのJavaScriptライブラリやフレームワークを
使わない場合はどうやるのでしょうか?
その方法があるとして、jQueryにも応用できますか?

782 = :

>>778
データバインディングは専用のライブラリ使えばいいと思うが…簡単なのに。
どうしてもと言うならこれ読め。
http://postd.cc/boiling-react-down-to-a-few-lines-in-jquery/

783 = :

>>780
リテラルとは何のことでしょうか

>>781
別人ならもっと別人らしく書いてください

>>782
ありがとうございます
読んでみます

784 = :

>>782の記事を読んでいますが
未知のパラダイムの洪水で混乱してきました
素直にデータバインディングライブラリの勉強した方がいいパターンですねこれは・・

785 = :

だからそう言ってるだろ…
でもデータバインディングライブラリはいっぱいありすぎて逆に迷うな。
ある程度高機能になったらそこまでやるならもうvuejs使えよってなっちゃうからそれよりシンプルかが判断の分かれ目か。
http://github.com/gwendall/way.js/
とかどうかね?あとrivets.jsとか…

786 = :

>>785
確かに単機能でシンプルな方がいいですね
見てみます
ありがとうございました

787 :

以下のような、横に伸びる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>

よろしくお願いします

788 = :

>>787
過去スレに似たような話が出たけど
なに? コピペ? また同じ話したいの?

789 = :

>>787
ほらよ。過去スレから探し出して余計な物削っといたで
http://jsfiddle.net/eoxzjqwu/53/

790 = :

$('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行以上あると、誤動作するかも

792 = :

>>790
> <tr> が、2行以上あると、誤動作するかも
普通複数あるだろw

793 = :

表のヘッダーだけじゃないのか?

表のデータも、1つのセルにまとめるのか?

794 = :

裏のフッター

795 = :

<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行ずつ分けて、処理すべき

796 = :

>>789に答え出てるんだからそれでいいだろ

797 = :

>>790
動作を確認できました
超リスペクトです
ありがとうございます!

他の方が指摘している部分で問題が無いか確認しつつ、参考にさせて頂きます

798 = :

>>792
自分はtrごとにclassを付けて対応しました

あくまでヘッダで使いたかったので煩くはならなかったですが、10行超えるような行で適用すると泥臭くなりそうだとは思いました

799 = :

複数行にも使うの?

複数行の場合は、
>>795
の例では、2行目のB に、colspan="2" が付くから、ダメだろ

1行ごとに一旦、処理を切らないといけない

>>789
は、難解すぎて、訳がわからない

800 = :

>>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();
}
})


←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

類似してるかもしれないスレッド


トップメニューへ / →のくす牧場書庫について