のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,690,373人
昨日: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
701 : Name_Not - 2014/07/22(火) 22:18:46.53 ID:???.net (+96,+29,-5)
>>698

> 出来ないなら、自前で同じことをするしかない
なんで?
702 : Name_Not - 2014/07/22(火) 22:18:47.08 ID:9sE25qaT.net (-5,-29,+0)
>>622
遅くなってすまなかった

> 問題点を理解して使っていくうえで賢いやり方とかあるかな?
最も確実なのは「全てのノードを置換しなければ実現できない状況でのみ innerHTML を使う」になる
http://jsfiddle.net/Pc87X/1/http://jsfiddle.net/Pc87X/7/ のようにノードを置換しなくて良いケースでは innerHTML は使わない、ということだ
これなら innerHTML を使わなくても全てのノードを置換しなければいけないのだから問題はない

addEventListener の参照エラーのみに対応するならバブルするイベントは document で定義し、バブルしないイベントは useCapture を利用して document で定義すれば回避できる
ちなみに、jQueryでは useCaptuer を使えないのでバブルしないイベントには対応できない
また、http://jsfiddle.net/Pc87X/9/ のように jQuery.data() に対応できない等、完全な対策にはなっていない

---
ただし、「innerHTML が楽だ」という人は大抵、「ノードを置換しなくて良いケース」や「部分的な置換でよいケース」でもらくだからという理由で全体を置換しようとすることが多い
正直、お勧めはしないが、その場合は下記対策が考えられる

1. チームで参照を保持しているノード情報を共有する
2. 参照が切れてはいけないノードでinnerHTMLを使用した際に例外を投げる仕組みを作る(問題の早期発見)

1. はまあ、当然だな
2. は例えば、下記URLのようにする
http://jsfiddle.net/Pc87X/10/
欠点としては要素ノードの参照にしか対応できていない事か
また、addEventListener のように参照を保持するタイプのメソッドは全てユーザ定義関数でwrapする必要があるので少し手間はかかる

---
ところで、jQuery.data() のように全DOMノードにオブジェクトを格納できる DOM 仕様があって廃案になったと記憶しているのだが、該当仕様をどうしても思い出せない
どなたかご存知の方がいたら教えて頂けないだろうか?

廃案後、代替仕様が出来たかも気になっている
全ノードに js-refered フラグを付けられれば、http://jsfiddle.net/Pc87X/10/ でテキストノードの参照エラーにも対応できるのだが…
703 : Name_Not - 2014/07/22(火) 22:23:20.40 ID:???.net (+70,+29,-4)
>>701
出来ないからじゃん
何言ってんの?
704 : Name_Not - 2014/07/22(火) 22:42:16.21 ID:???.net (+57,+29,-10)
そもそも「省略されているかされていないかを判定する」必要性がわからん
705 : Name_Not - 2014/07/22(火) 22:47:26.77 ID:???.net (+55,+29,-1)
勝手に分からなけりゃいいだろ
馬鹿じゃねえの
708 : Name_Not - 2014/07/22(火) 23:07:48.84 ID:???.net (+19,+29,-27)
>>702
ありがとう、むしろ手間をかけさせて申し訳ない
> 全ノードに js-refered フラグを付けられれば
まさにこういう類のことを考えてたんだけど
やっぱり地道な対応しかないか…
709 : Name_Not - 2014/07/22(火) 23:15:31.79 ID:???.net (+52,+29,-1)
>>707
なるほどrangeですか・・
たしかになんとかなるかもしれません
ありがとうございました
710 : Name_Not - 2014/07/22(火) 23:17:10.44 ID:???.net (+62,+29,+0)
まだやってんの? いま来た人用にわかりやすい例え思いついたわw

innerHTMLには根本的な問題がある
代入演算子=には根本的な問題がある

innerHTMLに代入したら古い値が消えることだ
代入演算子=で代入したら古い値が消えることだ

前の値を残しておきたいときはDOM操作をしなければならない
前の値を残しておきたいときは足し算をしなければいけない

だからinnerHTMLを使ってはならない
だから代入演算子を使ってはならない


★普通の人が考えること

前の値が要らない時はinnerHTMLでいいんじゃねーの?
前の値が要らない時は代入演算子でいいんじゃねーの?

そもそも前の値を捨てて新しい値を入れる時にinnerHTMLを使うんじゃねーの?
そもそも前の値を捨てて新しい値を入れる時に代入演算子を使うんじゃねーの?
711 : Name_Not - 2014/07/22(火) 23:19:36.41 ID:???.net (+62,+29,-102)
>>702
> ただし、「innerHTML が楽だ」という人は大抵、「ノードを置換しなくて良いケース」や
> 「部分的な置換でよいケース」でもらくだからという理由で全体を置換しようとすることが多い

その前提がおかしいんだろ。
なんで置換ありきなんだ?

innerHTMLを使う時に一番多いのは、文字列で新しくHTMLを
生成するときだろ。置換なんかしねぇよ。
712 : sage - 2014/07/22(火) 23:28:21.56 ID:???.net (+36,-30,+0)
タブレットでスクロール可能なエリアでスワイプすると、横スクロールするだけでスワイプの動作が取得できません。
どのようなコードを記載すべきでしょうか。下記のようなコードを記載しました。
<html>
<head>
<title>My Page</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/mobile/1.1.0/jquery.mobile-1.1.0.min.js"></script>
<script type="text/javascript">
$(function(){
$('#scrollswipe').bind('swipe', function(){
alert("swipe");
});
});
</script>

</head>
<body>
<div id="scrollswipe" style="width:200px; height:200px; overflow:scroll;">
<h1>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</h1>
<h1>bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb</h1>
<h1>cccccccccccccccccccccccccccccccccccccccccccc</h1>
<h1>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</h1>
<h1>bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb</h1>
</div>
</body>
</html>
713 : Name_Not - 2014/07/22(火) 23:32:37.19 ID:???.net (+62,+29,-59)
>>712
これ使ってる。自力実装は死ぬと思うよ。

http://cubiq.org/iscroll-5

もしくは、jQuery Mobileだね。
俺が試したリリース初期頃は端末が遅いのと
ライブラリが重いので使うのやめたけど。
714 : Name_Not - 2014/07/22(火) 23:33:03.36 ID:???.net (-1,-29,-42)
ってjQuery Mobile使ってるのかw
すまんすまん。
716 : Name_Not - 2014/07/23(水) 00:02:58.31 ID:???.net (+0,-30,-34)
>>636
これは innerHTML の最も酷いパターンだな
$('body').html(str); には驚いた
717 : Name_Not - 2014/07/23(水) 00:34:43.12 ID:???.net (+70,+29,-38)
>>639も使わなくていい場面でinnerHTMLを使ってるので五十歩百歩
ノードを置換しなくてもいいのにinnerHTMLを使ってる時点で使い方がなってない
718 : Name_Not - 2014/07/23(水) 00:36:51.87 ID:???.net (+34,+7,-12)
innerHTML使って無いジャン
719 : Name_Not - 2014/07/23(水) 02:48:39.39 ID:???.net (+25,-30,-65)
1 delete objA;
2 new objB;

結局、innerHTMLは、古いオブジェクトを削除して、
新しいオブジェクトを作っただけかね?
720 : Name_Not - 2014/07/23(水) 07:19:36.35 ID:???.net (+39,-29,-39)
xmlHttpRequestでphpを指定した時そのphpはどこで実行されるんですか?
サーバー側かクライアント側にphpごと来るのか
721 : Name_Not - 2014/07/23(水) 07:44:57.12 ID:???.net (+2,-29,-32)
>>718
.html() は内部的に innerHTML を利用しているから innerHTML を使用しているのと同義
722 : Name_Not - 2014/07/23(水) 07:47:18.56 ID:???.net (+51,+30,+0)
723 : Name_Not - 2014/07/23(水) 07:59:42.30 ID:???.net (+55,+17,-57)
>>719
innerHTML はシリアライズも行う
また、後付で標準化されたので仕様が曖昧で実装依存な処理もそれなりにある
http://domparsing.spec.whatwg.org/#innerhtml
http://msdn.microsoft.com/en-us/library/ie/ms533897.aspx
724 : Name_Not - 2014/07/23(水) 10:33:14.23 ID:???.net (+20,-12,-17)
>>720
サーバに決まってるじゃん
phpってのはサーバで実行されてHTMLやXMLを出力するもので
サーバの外に出てくることはない
725 : Name_Not - 2014/07/23(水) 11:02:24.43 ID:???.net (-1,-29,-23)
>>698
この件ですが、コンテナdivのscrollWidthには省略される前の数値が入るので
これで判定できると分かりました
ありがとうございました
726 : Name_Not - 2014/07/23(水) 12:26:23.02 ID:???.net (+49,-30,+0)
>>723
シリアライズが何を言っているのかわからないが、
innerHTMLはDOMオブジェクトをシリアライズするのではない。

HTML要素とDOMオブジェクトの違いがわかってない人が多いんだよな。
これ理解するのに、jQueryのdata()メソッドの挙動を勉強するのがいい。

たとえばこんなHTMLがあるとする。
<span id="id" data-value="123">test</span>

これを $('#id').data('value') で参照すると123が返ってくる。
そのあと $('#id').data('value', 456) を実行し、参照したら456が返ってくる。
当たり前の動作に見えるが、ここで$('#id').attr('data-value')を参照すると、返ってくるのは123。

つまり、dataはDOMオブジェクトの値をかえるが、HTML要素は書き換えないということ。
DOMオブジェクトの状態とHTMLは全くの別もの。DOMオブジェクトをシリアライズしたものがHTMLなのではない。

HTML要素を書き換えるとDOMオブジェクトに反映されるが、DOMオブジェクトを書き換えても
HTML要素には反映されない。それがDOMオブジェクトに割り当てるイベントハンドラなど。

jQueryのattr()メソッド(DOMでいえばsetAttribute)は "HTML要素を書き換える" メソッド
on(DOMで言えばaddEventListener)はDOMオブジェクトにイベントハンドラを設定するメソッド

それぞれのメソッドで、影響をあたえるものが、HTML要素だったり、DOMオブジェクトだったりする。
innerHTMLが行うのは、HTML要素の取得と設定で、DOMオブジェクト操作用ではない。
728 : Name_Not - 2014/07/23(水) 12:36:30.54 ID:???.net (+68,+29,-47)
>>726
JQueryのdataはDOMと関係無く値を収納してるんだが?
お前が一番違い分かって無いだろ…何長々と馬鹿な事言ってるんだ
729 : Name_Not - 2014/07/23(水) 12:38:55.92 ID:???.net (-1,-29,-2)
そもそも例えに何の前提もなく$(id)を使うのは
730 : Name_Not - 2014/07/23(水) 12:40:35.15 ID:???.net (+12,-29,-181)
>>728
えらいえらい。よく気づいたね。

じゃあ、DOMの話だけでするならば、
フォームのvalueが全く同じ挙動をする。

ページが表示されてからinputの内容を入力した時、
valueプロパティ、つまりDOMオブジェクトの値は最新の値だが、
value属性はページが表示された時のまま。

DOMオブジェクトの内容と、属性は関係してそうで関係していない。
jQueryのdataはこの動作を参考にして作られていると考えれば良い。
731 : Name_Not - 2014/07/23(水) 12:41:44.18 ID:???.net (+91,+29,-30)
実装依存は困るよな…
っていうかHTMLもCSSもJavaScriptも全ブラウザ全部仕様通り全部動作完全に一緒だったらと思うと
732 : Name_Not - 2014/07/23(水) 12:43:35.34 ID:???.net (+104,+29,-51)
>>731
それはネットスケープが悪いんだよ。JavaScriptを初めて搭載したブラウザ。
標準化しないで勝手に言語を作った。

まずいきなり実装しないで、標準団体を設立して標準化するべきだった。
733 : Name_Not - 2014/07/23(水) 13:11:41.52 ID:???.net (+71,+29,-6)
>>732
今更何を…
むしろマイクロソフトに言うべきだろ
734 : Please C - 2014/07/23(水) 14:16:35.87 ID:???.net (+47,+24,-1)
msは話しにならん
735 : Name_Not - 2014/07/23(水) 14:48:27.81 ID:???.net (-2,-30,-34)
var tes=$("div");
上はDOMオブジェクトであってますか?
736 : Name_Not - 2014/07/23(水) 14:59:44.93 ID:???.net (+42,+24,+0)
あってません
737 : Name_Not - 2014/07/23(水) 19:07:59.95 ID:???.net (+9,-30,-134)
>>726
innerHTML は WhiteSpace のノーマライズとか tagName, attributeName の大文字化or小文字化を実装依存で処理してるんだが

この人は何を言ってるのかわからないのになぜ自信満々なんだ
仕様書にも " running the HTML fragment serialization algorithm" とあるが、 読んでいる様子が全くない
738 : Name_Not - 2014/07/23(水) 19:58:16.27 ID:???.net (+63,+30,-51)
自分が変なこと言って指摘されても「よくきづいたね」と初めから指摘される事がわかっていた装いをする図々しさがあるぐらいだからな
未知の分野を勉強する事を忘れ、自分の知識をひけらかすのが目的化してるんだろう
少なくとも、このスレではお呼びではない
739 : Name_Not - 2014/07/23(水) 20:11:21.19 ID:???.net (+115,+29,-18)
2chで情報を得るには知ったかぶりすればいいと聞いた事がある
740 : Name_Not - 2014/07/23(水) 20:17:08.71 ID:???.net (+57,+29,-32)
innerHTML の実装間での違いって主にどんなものがありますか?
741 : Name_Not - 2014/07/23(水) 20:23:25.99 ID:???.net (+56,+22,+1)
>>739
知ってる
742 : Name_Not - 2014/07/23(水) 20:27:48.22 ID:???.net (+57,+29,-56)
質問して満足する答えが得られなければ、自分の都合が良いように解釈して先の自分の発言が正しいと主張する人もいるんだよな..
743 : Name_Not - 2014/07/23(水) 20:32:50.94 ID:???.net (+98,+26,+0)
>>739
ばらすな
744 : Name_Not - 2014/07/23(水) 20:57:44.90 ID:???.net (+71,+29,-14)
>>743
「実は答えを引き出すために知ったかぶってたんだぜ」というポーズはいいから
745 : Name_Not - 2014/07/23(水) 21:02:16.24 ID:???.net (+57,+29,-8)
いずれにせよ好意的に接されることはないのであった
746 : Name_Not - 2014/07/23(水) 23:09:17.44 ID:???.net (+3,-29,-41)
ファイルのアップロードをしたいのですが対象ブラウザーにIE9があります。
FormData()はIE10からなので画面遷移させずにアップデートを行う場合はiframeなんかを利用するしかないでしょうか?
747 : Name_Not - 2014/07/24(木) 00:29:02.77 ID:???.net (-1,-29,-17)
送信URLが204 No Contentを返せば画面遷移しないで済むけど。
748 : Name_Not - 2014/07/24(木) 09:15:23.57 ID:???.net (+2,-29,-34)
あるjqueryオブジェクトがactiveElementかどうか調べる
一番いい方法は何ですか?
749 : Name_Not - 2014/07/24(木) 09:23:49.14 ID:???.net (+8,-30,-26)
$('#test').get(0) === document.activeElement
以上にいい方法ありますか?
750 : Name_Not - 2014/07/24(木) 10:02:21.77 ID:???.net (-1,-30,-52)
>>748の件ですが、
$('#test').filter(':focus').length
みたいなやり方がjquery流だと気付きました
←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
スレッド評価: スレッド評価について
みんなの評価 :
タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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