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

私的良スレ書庫

不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

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

JavaScript スレッド一覧へ / JavaScript とは? / 携帯版 / dat(gz)で取得 / トップメニュー
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
レスフィルター : (試験中)
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
651 : Name_Not - 2014/07/22(火) 19:19:18.12 ID:???.net (+105,+29,-19)
>>649
参照を切らなくて済むなら切らないほうが良いに決まってるでしょ
652 : Name_Not - 2014/07/22(火) 19:21:02.02 ID:???.net (+97,+29,-23)
今日になっていきなり当然だろ当然だろ連呼しだしたやつも怪しいもんだな
653 : Name_Not - 2014/07/22(火) 19:23:13.00 ID:???.net (+94,+29,-40)
innerHTMLを使わなければ参照が切れない状況ならinnerHTMLを使わないほうが良い
常識で考えればすぐ分かるはずだがな
654 : Name_Not - 2014/07/22(火) 19:27:35.02 ID:???.net (+63,+30,-63)
むしろ逆に考えて
子ノードを持っているノードについて操作したい場面はどのくらいあるのか?
このとき子ノードに対して何かしているケースはどのくらいの割合か?

たいしたことしてない俺の経験上ではいずれもほとんど無かったがお前らどうよ
655 : Name_Not - 2014/07/22(火) 19:33:34.99 ID:???.net (+148,+30,-90)
>>651
> 参照を切らなくて済むなら切らないほうが良いに決まってるでしょ
中身が別物になってるんだから、同じものを指すべきじゃない。

>>652
いや、やっとこの馬鹿が言ってる「問題」が判明したからだよ。

中身を違うものに入れ替えてるのに、前の情報を保持したい?
そんなアホなことを言ってるとは思わなかったよ。
656 : Name_Not - 2014/07/22(火) 19:36:00.89 ID:???.net (+75,+29,-76)
>>653
> innerHTMLを使わなければ参照が切れない状況ならinnerHTMLを使わないほうが良い

考える順番がおかしい。

最初に考えるべきなのは、中身を新しいものに入れ替えたいのか、
中身は同じで、その属性を変えたいだけなのか。

これを最初に考えるべきでしょうが。
そしてやりたい事にあった命令を使うだけの話。
657 : Name_Not - 2014/07/22(火) 19:36:47.11 ID:???.net (+0,-30,-32)
>>639
"この文章をクリックすると TEXT_NODE 値を置換する。" が大嘘すぎる
tagNameや属性値も置換対象に入ってる
TEXT_NODE のみを置換対象にすべき
658 : Name_Not - 2014/07/22(火) 19:38:31.86 ID:???.net (+103,+29,-25)
>>643
html()はイベントとか切れないように色々工夫してるんだが?
問題点分かって無い奴はレスすんな
659 : Name_Not - 2014/07/22(火) 19:39:19.74 ID:???.net (+108,+29,-62)
>>655
> 中身を違うものに入れ替えてるのに、前の情報を保持したい?
おまえのいう「中身」を違うものに入れ替える必要がない事はhttp://jsfiddle.net/Pc87X/1/ で証明されているわけだが、おまえの目は節穴なのか?
660 : Name_Not - 2014/07/22(火) 19:40:45.89 ID:???.net (+57,+29,-7)
だらだら書いてるわりに実質ちょっと言い換えただけのありがたい説明文はいらねーよ
661 : Name_Not - 2014/07/22(火) 19:42:05.36 ID:???.net (+93,+29,-7)
他の質問が流れるからモンスター質問者に関わるのも考え物
662 : Name_Not - 2014/07/22(火) 19:46:10.89 ID:???.net (+18,-30,+0)
>>650
> プリミディブ型のように文字列でゴリゴリ処理する方が不自然だって事が感覚としてわからないなら、その程度の実力って事なんだろうな
これは文字列かどうかの問題じゃない。
innerHTMLに新しい文字列を代入するというのは、新しい文字列から生成したオブジェクトに入れ替えてるのと同じ。

obj = new Object;
obj.prop = 1;

obj = new Object;
console.log(obj.prop); // 1と表示されないじゃないか!

って言ってるのと同じ。

innerHTMLを新しいオブジェクトに入れ替えたのだから、その子オブジェクトも入れ替わる。
document.createElementを使った方法であっても、新しく作った要素に入れ替えたのなら、
古い要素のイベントハンドラは消える。


あと、HTMLを扱うときは、文字列で扱ったほうが速い。なぜなら単なる文字列は
メモリ内で終わる作業だから、重いDOMツリーの更新は必要ないし、
ブラウザの機能としてHTMLのパースは、もっともよく使う部分で、一番最適化されているから。

そういうこともわからない程度の実力かい?
663 : Name_Not - 2014/07/22(火) 19:47:57.57 ID:???.net (+110,+29,-76)
>>659
innerHTMLは、中身を入れ替える命令。

中身を入れ替えたくないのなら、innerHTMLを使うのが馬鹿だし、
中身を入れ替えたいなら、innerHTMLを使うのが良い。

そんな使い分けもできないの?

君は、最初にやりたい事をはっきりさせてから、
プログラムしようね。目的に合わない命令を使って
わーわー騒ぐんじゃない。
664 : Name_Not - 2014/07/22(火) 19:48:42.82 ID:???.net (+126,+27,-19)
>>658
> html()はイベントとか切れないように色々工夫してるんだが?

してません。
665 : Name_Not - 2014/07/22(火) 19:51:09.40 ID:???.net (+90,+28,-16)
>>664
それは俺も思った
工夫しているのは .on() だよな
666 : Name_Not - 2014/07/22(火) 19:51:10.42 ID:???.net (+57,+29,-24)
スレが質問こなさそうな状況だからいうが
質問と真っ当な回答を抜き出して検索性インデックス性をなんとか作り出してナレッジベース化したら役に立つだろうか
667 : Name_Not - 2014/07/22(火) 19:59:55.81 ID:???.net (+5,-30,-301)
>>662
> あと、HTMLを扱うときは、文字列で扱ったほうが速い。なぜなら単なる文字列は
> メモリ内で終わる作業だから、重いDOMツリーの更新は必要ないし、
> ブラウザの機能としてHTMLのパースは、もっともよく使う部分で、一番最適化されているから。

そうなんだよね。俺も十数年ぐらい前は、たとえばテーブルを作るのに、
tableをcreateElementして、trをcreateElementして、tdをcreateElementして
appendChildを繰り返して・・・ってDOM操作で何行もかけて作っていた
時もあったけど、今は遅いし面倒なだけなので文字列で生成している。

innerHTML = '<table><tr><th>header</th><td>data</td></tr></table>';

これをDOM操作で作っても重いし面倒なだけ。何一つメリットがない。

さらに言えば、文字列の連結も一が多くなると見難くなるから、
少し複雑なのはlodashのtemplate機能を使ってるよ。
668 : Name_Not - 2014/07/22(火) 20:02:13.92 ID:???.net (+53,+14,+1)
>>664-659
両方している
669 : Name_Not - 2014/07/22(火) 20:07:14.83 ID:???.net (+37,+9,-31)
html()がやってるのは、中身を入れ替えた時に消える古いオブジェクトに対して
ブラウザの不具合によるメモリリークな問題に対応する処理で、
イベントハンドラは普通に切れる。
670 : Name_Not - 2014/07/22(火) 20:55:18.88 ID:???.net (+154,+29,-57)
>>663
> 中身を入れ替えたくないのなら、innerHTMLを使うのが馬鹿だし、
>>655で「中身が別物になってるんだから、同じものを指すべきじゃない。」と発言しているのはなぜ?
別物にする必要がないでしょ?
671 : Name_Not - 2014/07/22(火) 21:01:54.70 ID:9sE25qaT.net (-6,+29,-172)
参照が切れると動かない事例として jQuery.data() がある

参照が切れないコードなら問題はない
http://jsfiddle.net/Pc87X/7/
jQuery の .html() を使用すると参照が切れて、jQuery.data() が期待通りに動作しなくなる
http://jsfiddle.net/Pc87X/9/

>>618で説明したノードのキャッシュも原理的には同じ問題だ

>>639
少なくとも、http://jsfiddle.net/Pc87X/1/ やhttp://jsfiddle.net/Pc87X/7/ では参照を切る必要がなかった
>>655の言葉を借りるなら「中身を入れ替える必要がない」というのだろうか
だから、この場合は「innerHTML や .html() を使うべきではない」といえる
672 : Name_Not - 2014/07/22(火) 21:06:04.69 ID:???.net (+78,+30,-132)
>>670
まあ大抵はIDに対してイベントハンドラ付加したりしてるから、直感的にはそう思っても仕方ない
けどイベントハンドラの設定も参照の作成もIDが必須になっているわけではない
なので内部構造としてノード・ツリー構造があるわけで、IDは表面上の操作と内部の位置とを橋渡ししているに過ぎない

こういう状況の中で、.innerHTMLで要素の中身を入れ替えたり操作したりするとき、
入れ替える前と後で、中身が持っている子要素が同じであるかどうかを保証するわけにはいかない
だからイベントハンドラは消失するし参照も切れる、それが当然の動作になってしまう
(付加したイベントハンドラは理論上すぐ消えるはずだけど、個人的になぜかそうとは限らないように思う)


…と、自分はこういうふうに理解してるけど、間違いあるかな
673 : Name_Not - 2014/07/22(火) 21:06:34.55 ID:???.net (+83,+30,-83)
>>670
> 別物にする必要がないでしょ?

なんで決め付けるの?

別物にしたいときは、別物。そうでない時は、そうでない。
別物にしたいときは、イベントが残っていたら大問題。

html()、innerHTMLを使うかどうかは、
どっちが目的かで変わるわけで、
なんで最初の目的を限定してから使えないって話するの?
意味がわからない。
674 : Name_Not - 2014/07/22(火) 21:07:42.94 ID:???.net (+68,+29,-96)
>>661
> jQuery の .html() を使用すると参照が切れて、jQuery.data() が期待通りに動作しなくなる

だからさ、それは「問題」じゃないんだって、

html()の仕様として、要素を丸ごと入れ替えるものだから
data()は消えるのが仕様として正しい。

なんで、目的にあってないものを使ってるくせに
それが問題だっていうのさ。馬鹿じゃん?
675 : 665 - 2014/07/22(火) 21:08:01.79 ID:9sE25qaT.net (-15,+29,-184)
蛇足だが、http://jsfiddle.net/Pc87X/5/ はテキストノード値の置換ではない(>>657の指摘通り)
私がhttp://jsfiddle.net/Pc87X/ で挙げた悪例をそのまま流用していると思われるが、良い実装ではないのでhttp://jsfiddle.net/Pc87X/9/ では正規表現でテキストノード部分を置換するようにしている
そもそも、innerHTML はテキストノード値の置換に向いていないし、他のAPIを使うべきとは思うのだが、jQuery には適切なAPIが存在しないな
676 : 665 - 2014/07/22(火) 21:10:49.61 ID:9sE25qaT.net (+20,+29,-19)
>>674
> なんで、目的にあってないものを使ってるくせにそれが問題だっていうのさ。
>>639が問題ないと主張するから反論しているだけなのだが…
文句は>>639にいってくれ
677 : Name_Not - 2014/07/22(火) 21:10:56.93 ID:???.net (+91,+29,-81)
innerHTMLは要素オブジェクトをまるごと入れ替えるという
仕様なのだから、その要素に結びついたデータは消えるのが正しい動き。
それは正しいまともな仕様なので、バグではない。
678 : Name_Not - 2014/07/22(火) 21:12:06.97 ID:???.net (+64,+29,-15)
>>676

>>639は問題ないでしょ?

あんた、dataも一緒でなければならないという
条件を最初に提示したかい?
679 : Name_Not - 2014/07/22(火) 21:14:43.20 ID:???.net (+62,+29,-74)
innerHTMLやjQueryのhtml()もそれ自体に問題があるわけではなく、
要素を入れ替えるという仕様なんだからそれに付随するデータも消える。

この仕様で問題があるかどうかは要件によって変わるので、
一概に問題があると決め付けることは出来ない。
いい加減に理解しようぜ。
680 : Name_Not - 2014/07/22(火) 21:14:50.96 ID:???.net (+80,+28,-33)
$obj.innerHTML += 'test';
とかしたとき、イベントハンドラが失効したり参照が切れたりするのは
JavaScriptのコード打っていると面倒に思うことがあるのは確かだろうけど

仕様作る側やブラウザの実装やる側に立って考えると
これを失効しないように参照が切れないように作るのってすごく大変そう
681 : Name_Not - 2014/07/22(火) 21:16:49.74 ID:???.net (+91,+29,-25)
> 参照が切れる切れるうざくね?
> なんでそんなものに執着してるのか。
これが発端だろ
参照が切れる問題点が全く分かっていない奴に説明してるだけだろ
682 : Name_Not - 2014/07/22(火) 21:18:21.25 ID:???.net (+38,+0,-51)
>>680
大変じゃなくて不可能

innerHTMLはHTMLを代入する命令なのだから
HTMLとして表現できるもの以外には対応できない。

そういう仕様。
683 : Name_Not - 2014/07/22(火) 21:18:39.25 ID:???.net (+104,+29,-7)
>>677
バグとは誰も言ってない
仕様なのは皆分かってる
684 : Name_Not - 2014/07/22(火) 21:19:30.39 ID:???.net (+70,+29,-30)
>>681
だから参照が切れるのは問題点じゃないんだって言ってるだろ。
第一、参照が切れてるんじゃない。

全く別のオブジェクトに入れ替えてるんだから、
そもそも参照が最初っから存在しないんだよ。
685 : Name_Not - 2014/07/22(火) 21:20:51.16 ID:???.net (+114,+29,-9)
>>683
”正しい”仕様な。

どうも正しい仕様なのに、
それが問題であるかのように
言ってる奴がいる。
686 : Name_Not - 2014/07/22(火) 21:22:06.20 ID:???.net (+63,+29,-19)
> 全く別のオブジェクトに入れ替えてるんだから、
> そもそも参照が最初っから存在しないんだよ。
これは酷い
687 : Name_Not - 2014/07/22(火) 21:22:25.81 ID:???.net (+7,-20,-67)
innerHTMLは、新しいHTMLオブジェクトに入れ替えたい時に
使うもので、新しいHTMLオブジェクトに入れ替えるのだから
イベントハンドラもdataも初期化された状態になってほしいね。
688 : Name_Not - 2014/07/22(火) 21:23:31.75 ID:???.net (+17,-21,-13)
>>685
じゃあ、eval 使えば?
689 : Name_Not - 2014/07/22(火) 21:26:31.52 ID:???.net (+48,-30,-224)
>>686

ひどくないんだが?

element.innerHTML に代入するということは、
新しい要素オブジェクトをcreateElementして、
elementの子供を新しい要素に入れ替えることと
全く同じだよ。

擬似命令で書くなれば
element.innerHTMLObject = document.createElement('a');
みたいなもの。

document.createElement('a')した結果に
イベントハンドラがついているかい?
最初っからついてないだろ。

innerHTMLが内部で、文字列から新しい要素オブジェクト郡を作成して
それに入れ替えてるだけってのが、わかってない。
690 : Name_Not - 2014/07/22(火) 21:26:42.30 ID:???.net (+109,+29,-16)
>>685
正しさの判断基準はどこにあるんだよ
逆に「間違った仕様」があるのか?
691 : Name_Not - 2014/07/22(火) 21:28:24.10 ID:???.net (-6,-29,-2)
'a' が顔文字にみえる
692 : Name_Not - 2014/07/22(火) 21:30:41.87 ID:???.net (+77,+29,-111)
>>690
正しい仕様っていうのは、

innerHTMLを取得した時にそれはHTML表現を取得するものであって
DOM要素をシリアライズしたものではないということ

つまりHTMLで表現でされているものだけが取得され
HTMLでない情報は存在しない。

だって、その名の通り inner "HTML" なのだから。

そこにHTMLで定義してない情報まで
シリアライズされるべきだと思ってるのが「間違った仕様」
693 : Name_Not - 2014/07/22(火) 21:43:07.57 ID:???.net (+23,-30,-42)
>>644
Element.clientWidth,
Element.clientHeight
かな
694 : Name_Not - 2014/07/22(火) 21:45:18.24 ID:???.net (+31,+5,+2)
>>693
ありがとうございました
695 : Name_Not - 2014/07/22(火) 21:45:36.76 ID:???.net (+75,+30,-82)
それは正しい仕様ではなくただの「仕様」、間違った仕様ではなく「間違った認識」である

>>689
長文書いてるところすまんけど
> そもそも参照が最初っから存在しないんだよ。
こんなこと書いてるから「お前参照とか使ったことないだろ」って突っ込まれたんじゃないのかい
参照を作る→参照先が消滅(&別の新しい要素が生まれる)→作った参照が失われる
この流れを話してるのに「参照が最初っから存在しない」は無いわ、と
696 : Name_Not - 2014/07/22(火) 21:48:29.30 ID:???.net (+77,+29,-5)
意地になってるだけの奴に何言っても無駄だろ
697 : Name_Not - 2014/07/22(火) 21:56:12.59 ID:???.net (+57,+29,-17)
GCの原理が理解出来てないんだろうなあ
698 : Name_Not - 2014/07/22(火) 22:10:16.02 ID:???.net (+3,-29,-14)
text-overflow: ellipsis;
で省略されているかされていないかを判定するにはどうしたらいいでしょうか?
出来ないなら、自前で同じことをするしかないと思いますが・・
699 : Name_Not - 2014/07/22(火) 22:10:26.74 ID:???.net (+13,-29,-176)
>>695
innerHTMLに代入する値はただの文字列で、
代入した後に内部で処理されるまで
オブジェクトの参照は存在しませんが?

元々の参照とは全くの別なんだ?
それをわかっていて代入してるんだが?
innderHTMLに代入するということは
別のオブジェクトを作ろうとしてるんだよ。

イベントハンドラとかdataとかリセットされるべきじゃないか。
700 : Name_Not - 2014/07/22(火) 22:11:29.02 ID:???.net (+52,+29,-3)
ほんと何言っても無駄だな
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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