X



+ JavaScript の質問用スレッド vol.123 + [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001Name_Not_Found2015/01/24(土) 16:23:05.20ID:???
JavaScript を自ら学ぶ人のための質問スレッドです。
>>2-4のテンプレを読んだ上で質問してください。

■質問を書く上で
(1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。
(2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。
  (ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など)
(3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。
(4) 常に自発的に調べる心構えを持ってください。
  具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。
  わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。
(5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。
(6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。
  ※必ず「問題の事象が再現されること」を確認してください。
   必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。
(7) サンプルコードに HTML が含まれる場合は http://validator.w3.org/ で [Check] してみてください。
(8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2の質問テンプレートを活用してみてください。
(9) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。


+ JavaScript の質問用スレッド vol.122 +(c)2ch.net
http://peace.2ch.net/test/read.cgi/hp/1420095379/

(ライブラリ禁止条項は、多数の意見によって廃止されました。ライブラリの質問もOKです)
0644Name_Not_Found2015/04/08(水) 21:42:32.89ID:???
document.queryAll('.class').forEach(el => el.remove());
を正しく書くなら
Array.prototype.forEach.call(document.querySelectorAll('.class'), el => el.parentNode.removeChild(el));
だな

議論に参加しようと思ったら突っ込まれるところを作ってはいけない
0645Name_Not_Found2015/04/08(水) 21:43:26.62ID:???
>>643
> どこがどう分かってないのか説明よろ。

せめて動くコードを書けって言ってる。

想像の中で動くであろうコードを書いて、ほら短いといっても、
それはお前の頭んなかの想像の話だろwってことだ。
0646Name_Not_Found2015/04/08(水) 21:47:11.05ID:???
> el => el.parentNode.removeChild(el)
この書き方は現状Firefoxでしか動かないから、これが現実的なところだろうね。

Array.prototype.forEach.call(document.querySelectorAll('.class'), function(el) { el.parentNode.removeChild(el) });

この後、メソッドチェーンしたいんだけど?と言われたら(笑)
0647Name_Not_Found2015/04/08(水) 21:47:21.33ID:???
>>644
話の流れ的に紛らわしかったかもしれないけど、よく見て。
NodeListを返すquerySelectorAllじゃなくて、Elementsを返すqueryAllを使った。
ElementsはArrayを継承してるからforEachが直に使えるでしょ?
0648Name_Not_Found2015/04/08(水) 21:48:51.19ID:???
>>646
メソッドチェーンしたければmapを使えばいいよ。
0649Name_Not_Found2015/04/08(水) 21:49:12.95ID:???
>>647
え? remove()は?

もしかして、お前の想像の世界ではあるって
ことになっんの?

想像の世界の技術で反論(笑)

そんな感じで、さまざまなメソッドを
オレオレライブラリで作るんだろう?w

だったらjQueryでいいじゃんってなるって
最初から言ってる。
0650Name_Not_Found2015/04/08(水) 21:50:30.15ID:???
>>648
だから動くコードを書けって言ってる。

結局書くと、ばれるのが怖いんだよ。

だから、擬似コード書いて
勝った気になってる。
0651Name_Not_Found2015/04/08(水) 21:51:52.66ID:???
$('.class').remove();

Array.prototype.forEach.call(document.querySelectorAll('.class'), el => el.parentNode.removeChild(el));

可読性が大きく違いすぎるw
0652Name_Not_Found2015/04/08(水) 21:52:50.16ID:???
>>649
Elementはremove()を持ってるよ。
06536442015/04/08(水) 21:55:58.15ID:???
>>647
適当なこと言ってすまなかった
DOMのLS見てきたけど、今までとかなり変わってて驚いた
勉強し直してくる
0654Name_Not_Found2015/04/08(水) 21:57:02.90ID:???
>>652
> オブジェクトは 'remove' プロパティまたはメソッドをサポートしていません。

説明してくれるかい?
0655Name_Not_Found2015/04/08(水) 21:59:12.88ID:???
各ブラウザ間の互換性を取るための
ライブラリが必要だな!



jQuery(ボソッ)
0656Name_Not_Found2015/04/08(水) 22:00:04.50ID:???
>>650
queryAllはまだどのブラウザにも実装されていないけど、モダンブラウザかIE11以降でエミュ可能。
removeはChromeとFirefoxで入ってるのを確認した。
ES6の構文は必要ならトランスパイラを使えばいい。
自分が問題視しているのは、学習コストとそれが古いものになることでの無駄。
もう標準が用意されるってわかった時点で、その機能はポリフィルに切り替えて行くべきだと思ってる。
0657Name_Not_Found2015/04/08(水) 22:01:52.87ID:???
いや、だからjQueryでいいでしょ?

結局お前が示したコードよりも、
さらにjQueryの方が短くて、
どのブラウザでも動くんだし。
0658Name_Not_Found2015/04/08(水) 22:06:06.68ID:???
どんなに頑張っても可読性はjQuery > DOMだからねぇ。
DOMの進化が10年遅すぎた。

その10年の間にjQueryは誰もが持ってる必須の知識となってしまったし、
DOMを使った結果、jQueryより劣ることしかできないんじゃ
なんのためにDOM使うのか理由がない。

せめてこれぐらいは、DOMでも25文字ぐらいでできてもらわないとね。
$('.class').remove();
0659Name_Not_Found2015/04/08(水) 22:08:49.78ID:???
>>655
それは当然大事。
ただ、jQueryが生まれた当初と比べて、互換性がまだまだ取れないという点は未だ残っているが、
そもそも標準機能が不足してるという点は改善されてきてる。
各機能の有り様について標準が提供されているときは、それに従うべきだと思う。
そうするとライブラリというよりポリフィル的なものになる。
そういう意味ではjQueryはとりあえず使っとけと言うものでは無くなった。
特にjQueryは標準にかなり影響を与えていて、標準がjQueryを改善した、
似てるけれど少し違うものを用意しているという問題もある。
つまりjQueryのAPIは腐ってきてるということ。
ただしDOMAPIもそれほど豊富なわけではないのでまだまだDOM操作のフレームワークやライブラリは必要。
とはいえ比較的基礎的なAPIを提供するjQueryをわざわざ使う価値と、合うケースは減ってきてると思う。
0660Name_Not_Found2015/04/08(水) 22:12:23.57ID:???
$ → $ = document.queryAll.bind(document)
on → ES7を先取りしてObserableに切り替える
でいいんじゃない
0661Name_Not_Found2015/04/08(水) 22:18:05.80ID:???
Observableな感じを思い浮かべるとメソッドチェーン指向ってのは正しい気がする
そういうスタイルで書くならやっぱり同期メソッドもチェーンで書きたいよね
でもObservableとjQueryを組み合わせるのは難しそう
ここを標準に期待するのは無理だから、おそらくまたどこかのいいライブラリがデファクトスタンダードになって
それを標準が追いかけるようになるんだろうね
いつまでたってもライブラリからは逃れられずに時代は繰り返される
0662Name_Not_Found2015/04/08(水) 22:20:24.65ID:???
あーでもExtensible Webに則るとそういう世界であってるか
0663Name_Not_Found2015/04/08(水) 22:33:57.57ID:???
もしElementsにElementのメソッドつけようと思ったらこんな感じになる?
Elements.prototype.__proto__ = new Proxy(Array.prototype, {
 get(aryProto, key, elems) { return (key in aryProto) ? aryProto[key] : (...args) => elems.map(el => el[key](...args)) }
});
0665Name_Not_Found2015/04/08(水) 23:41:12.44ID:???
>>663を試そうと思ったけど、なぜか手元のFF37だと上手くいかない…。
原因を調べるとどうやらprototypeとproxyを組み合わせると上手く動かない。
var o = Object.create(new Proxy({ hoge: 1 }, {
 get(){ return 2; }
}));
console.log(o.hoge); // 2
console.log(o.fuga); // なぜかundefined???
これはバグ?
0666Name_Not_Found2015/04/09(木) 00:23:10.37ID:???
バグだよ、もう1年くらい前から放置されたまま
0668Name_Not_Found2015/04/09(木) 08:20:21.95ID:???
バグだったのか
サンクス
0669Name_Not_Found2015/04/09(木) 20:51:58.01ID:???
>>663
標準化される前に、標準のprototypeを拡張するのはよくないよ。
あとから標準化された時に名前がかぶっていたら互換性の問題が発生する。

Prototype.jsがそれで痛い目にあってる。
http://qiita.com/jwhaco/items/b5b474883d3020f6dc5f

標準のprototypeを拡張するぐらいなら、
独自のオブジェクトでラップした方がいいと思う。
それがjQueryでやってることでも有る。
0670Name_Not_Found2015/04/10(金) 04:15:21.28ID:???
良いも悪いもElementsを拡張しようと思えばそうするしか無いでしょ。
まあサブクラスを作るのが一番筋がいいと思うけどな。
0671Name_Not_Found2015/04/11(土) 00:52:09.93ID:???
> まあサブクラスを作るのが一番筋がいいと思うけどな。
それを実現しようと思ったら、document.getElementsByNameの
戻り値をサブクラスにするってことになるんだけど、
getElementsByNameはdocumentだけにあるものじゃない。

すべての要素に、getElementsByNameがあるわけだから
Elementsを拡張するのであれば、Elementを拡張しなければならなくなる。

もちろんgetElementsByNameだけじゃないね。getElementsByTagNameとかもそう

サブクラスを作るって言えば簡単に思えるかもしれないが、
実際には標準のDOMのElementのメソッドを書き換えまくることをしないといけない。

それで安定して動くのか?って考えると難しい話なんだよ。
だから現実には標準のprototypeを書き変えることをしない。

ブラウザという実行環境がユーザーの手にあって開発者の自由にできないものは、
開発者が自由に実行環境を決めることが可能なデスクトップアプリや
サーバーサイドアプリと同じやり方でやったらだめなんだよ。
0672Name_Not_Found2015/04/11(土) 02:06:19.34ID:4ue2DbjV
callで置換されたthisを一時的に変更するにはどうすればいいでしょうか
例えば、
function A(x) {
this.piyo = new B(x);
this.C = x;
};
A.prototype.do = function() {
this.piyo.do.call(this); //(1)
};
function B(x) {
this.B = x;
};
B.prototype.do = function() {
console.log(this.B); // undefined
console.log(this.C); // 10
};

var hoge = new A("10");
hoge.do();

というコードがあったとします。
この時、(1)でthisをhogeとして呼び出したのでthis.Bがundefinedになりますが、
this.Bの時だけthisをpiyoとして呼び出したいのです。
(1)をthis.piyo.do();として、console.log(this.C);をconsole.log(B.C);とすると、クラス変数ではないのでundefinedとなります。
0673Name_Not_Found2015/04/11(土) 03:02:58.80ID:???
>>671
頭が硬いね。
別にそうしなくてもSub.from(hoge)としてラップすればいいんだよ。
jQueryみたいな1から作るのと違うのはElementsのメソッドを活かしながら必要な機能のみを安全に拡張できるところ。
0674Name_Not_Found2015/04/11(土) 03:27:54.79ID:???
必要な機能?

onは必要だしattrやpropやdataも必要
addもremoveも、insertもbeforeもafterもreplaceWithもだし、
eachやgrepも必要だろう。
もちろんメソッドチェーンも必要だし、
逆に必要じゃない機能ってなんだ?

結局jQueryの再実装をしているだけなんだが。
0675Name_Not_Found2015/04/11(土) 03:30:29.40ID:???
>>673
標準のDOM要素に標準化されてないメソッドを追加すると
あとで同じメソッドが標準のDOM要素に追加された時困るから
やるべきじゃないよ。

継承しても一緒。継承元に有る標準のメソッドを
オーバーライドしてしまうことになる。
0676Name_Not_Found2015/04/11(土) 04:42:32.48ID:???
>>675
オーバーライドしてしまうのなら問題ないよ。
>>663が問題なのはオーバーライドしないことで、同名の標準ができた時に壊れることだから。
それに標準のものには追加してないでしょ。
別個体のサブクラスに明示的にラップするという操作を伴うものだから、他への影響はないよ。

誰かがしちゃいけませんって言ったことを理由も考えずに信じ続けるのは良くない。
0677Name_Not_Found2015/04/11(土) 11:07:38.98ID:???
>>676
> オーバーライドしてしまうのなら問題ないよ。
おいおいw 問題を認識してないのかよ。

DOM非標準のものならば、自分しか使わないから問題ないが
DOM標準の場合は、オーバーライドしてしまったら
他のライブラリが改変された関数を使ってしまうかもしれないだろ。

だからjQueryなどはDOMとは全く別のオブジェクトで
ラッピングするという手法をとっているのだが。

話をまとめるか?

1. 標準のElementsにはattr()というメソッドはありませんでした。
2. だから標準のElementsを拡張してattr()を追加しました。
3. このattr()は当然オレオレ実装です。
4. あるときElementsに標準仕様でattr()が追加されました。
5. オレオレattr()と標準attr()で仕様が違いました。
6. 他のライブラリは標準attr()だと思ってるのにオレオレattr()が呼び出されて困りました。

こういう話なんだが。これprototype.jsで実際に起きた話な。

で、お前はサブクラスなら問題無いと言っているわけだが、
サブクラスでも問題有るんだよ。なぜならElementsを返すのは誰?って話。

例えばdocument.getElementsByTagName()だけじゃなくて
全ての要素.getElementsByTagName() やその他多くの全て。

すべての要素のgetElementsByTagName()だけでなく、
createElement('div') で作られた要素のgetElementsByTagName()も
サブクラスを返すように改変しないといけない。
そうすると、DOMのElementのprototypeを改編する話だってのはわかるな?
0678Name_Not_Found2015/04/11(土) 16:10:30.03ID:???
>>677
>>サブクラスを返すように改変しないといけない
だからそうじゃないって言ってるだろ。
>>673を見たのか?
逐一Elementsをサブクラスにラップして使うやり方について言ってるの。
だからElementsを利用してる他のものに影響を与えることはない。
まず人の話をよく聞いてから批判しような。
0679Name_Not_Found2015/04/11(土) 16:24:25.13ID:???
>>678
あんたたサブクラスとラップという用語を
ちゃんとわかってないって言うことがよくわかったよw

ラップするならばサブクラスにする必要はないし普通はしない。
jQueryはDOM要素郡(そこでいうElements)をラップしたもの。
0680Name_Not_Found2015/04/11(土) 16:25:41.48ID:???
> jQueryはDOM要素郡(そこでいうElements)をラップしたもの。

正確に言うならば、jQueryの$()などで返すjQueryオブジェクトは
DOM要素郡(そこでいうElements)をラップしたもの。
0681Name_Not_Found2015/04/11(土) 16:27:48.12ID:???
だーよーねー!
0682Name_Not_Found2015/04/11(土) 16:49:55.33ID:???
そもそもElementsを何のサブクラスにするって言ってるんだろう?
ちゃんとわかってるなら○クラスのサブクラスにするって
具体的に言えるはずだ。 ぜひ○の中身を答えて欲しい。

先回りしていっておくと、世の中には○クラスを引数にする
関数が存在するが、○クラスを互換性がない形に改変すると
その関数の引数に入れられなくなる。(本当にサブクラスなら入れられる)
だが改変しないとメソッドチェーンが使えなくなる。
0683Name_Not_Found2015/04/12(日) 01:02:35.47ID:???
>>679
分かってないのはあんた。
Elementsに元々あるメソッドを使うためにもそうするのが一番自然、
言い訳見苦しいよ。負けを認めなさい。
0684Name_Not_Found2015/04/12(日) 01:39:27.58ID:???
>>683
> Elementsに元々あるメソッドを使うためにもそうするのが一番自然、
Elementsに元々あるメソッドって何のことだよw
なんのサブクラスにしたいわけ?
答えられてないよね?

> 言い訳見苦しいよ。負けを認めなさい。
ワロタw
勝ったつもりでいるんだw
0685Name_Not_Found2015/04/12(日) 02:03:53.43ID:???
元々のメソッドを使う方が絶対にいいはずだって
固定観念を持っているんだろうね。

jQueryのeachではなく、
Elements.forEach(Array.forEach)を使ったほうが
いいはずだって思ってるのだろうけど、
forEachではメソッドチェーンが出来無くなってしまうわけで

元々のメソッドを使うとjQueryからすると劣化してしまう。
劣化しないように作るとなると元々のメソッドはほぼ全て使えなくなってしまう。

ここまで考えずに、元々のメソッドを使う方が絶対にいいはずだって
固定観念を持っているんだろうね。 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
0686Name_Not_Found2015/04/12(日) 02:15:33.98ID:???
forEachでなくmapを使えばいいんじゃね?
0687Name_Not_Found2015/04/12(日) 02:30:38.96ID:???
>>684
queryAllとかあるでしょ。
それらを一々再実装するの?
元からあるのを使った方がいいに決まってる。

>>685
mapを使えばmapはthisのコンストラクタを見て、
きちんとサブクラスのインスタンスに結果を追加していってくれる。
他のArrayのメソッドでも同じ。
そういう意味でもサブクラスにするのは正しい。
0688Name_Not_Found2015/04/12(日) 03:04:21.11ID:???
>>687
> それらを一々再実装するの?
君はライブラリを使うってことを覚えようよw
jQueryが実現しているから使うだけ。

それにqueryAllが返すElementsの話だろ?
Elementsをサブクラスにしろっていう話なんだから。
queryAllがあるのはElementであってElementsじゃない。

mapがあるのはArrayであってElementにはない。
Elementsにも無い。(queryAllが返す要素の配列は、本当の配列じゃないから)

それらを一々サブクラスに再実装するの?w
0689Name_Not_Found2015/04/12(日) 03:48:03.50ID:???
>>688
ライブラリを使えばいいというのはそのとおりだよ。ライブラリはダメとか言ってないだろう。
そういう話ではなく、どういう手法がいいかということで、
jQueryのように丸っと世界を構築するよりも、>>663のようにするよりも、サブクラスを用意するのが一番折り合いがとれてるという話をしてるんだ。
なにを勘違いして一人で苛立ってるんだ?

そしてElements.prototype.__proto__ == Array.prototypeだし、
queryAllが返すのだって列記としたArray exotic objectだから。
ES6からはビルトインコンストラクタはnewTargetを見て適切なプロトタイプを持ったインスタンスを作ってくれるでしょ?
継承するというのはそういうことだよ。

もうホントにね、人の話は聞かない、仕様も読まない知らない、考える力もない、反省もしない。
君と話してると呆れて疲れるね。
0690Name_Not_Found2015/04/12(日) 08:57:02.29ID:???
>>689
焦点がずれてるな。サブクラスにする危険性をわかってない。

まずElementsがArrayだとしてjQueryに比べれば大幅にメソッドが足りない。
onとかattrとかきりがないから全部言わないよ?

そこでElementsのサブクラスを作ってメソッド追加しろって言いたいんだろ?
それが危険だという話。

ElementsのサブクラスはArrayでは無くなってしまうから。

なぜなら、
Elementsのサブクラスにhogeというメソッドを作った。
将来のArrayが拡張してhogeというメソッドを作った。
ElementsのサブクラスのhogeとArrayのhogeは別物
つまり、ElementsのサブクラスのはArrayではなくなる。

型あり言語なら型とシグネチャで正しくディスパッチしてくれるが
JavaScriptのような言語では無理

そして問題はまだある。

Elementsのサブクラスを作ったからといって、
queryAllがElementsのサブクラスを返してくれるわけじゃない。

DOMのあらゆるAPIがElementsの代わりに、
Elementsのサブクラスを返すようにモンキーパッチしまくらないといけない。
何かを忘れていると、よくわからないエラーが発生することになる。

危険性があるうえに、既存のメソッドを間違いなく修正するという大変な作業が必要。
サブクラスの仕様を考えただけで全てがうまくいくって考えてるようだが経験と想像力が足りないよ。
0691Name_Not_Found2015/04/12(日) 09:00:27.79ID:???
あと、想像の世界の話をしてないで
実際の動くコード書きなさい。
jsfiddleって知ってるかい?
0692Name_Not_Found2015/04/12(日) 09:57:34.37ID:???
またjQuery厨が暴れて生温かい視線を浴びてるのか。
0693Name_Not_Found2015/04/12(日) 16:01:40.91ID:???
>>690
論点がずれてるのはあんた。
オーバーライドは問題にならないという話はもう上でしただろ。
想像力がないのか?
もし万が一新しいメソッドがArrayやElementsに追加され、
それがサブクラスと被ったら、ライブラリをバージョンアップすればいいだけ。
サブクラスは元クラスのプロトタイプ拡張と違って、明示的に使ってない周りへ影響を与えないし、
環境が新しくなっても、古いバージョンのライブラリに依存してる古いコードが壊れることもない。

それと、queryAllがサブクラスを返したりすることはやらないと言ってるでしょ。
一度ラップしてやれば、例えばmapなんかはArrayではなくきちんとサブクラスのインスタンスを返してくれるように
ES6では設計されているので、何度もラップしたりすることなくチェーンできる。
0694Name_Not_Found2015/04/12(日) 17:47:51.65ID:???
細かくconsole.log()したいから無意味にチェーンしないさせない。

似て非なる物だが最近は右辺をカンマで長々しく区切るコードを少なからず目にする。
他人にはテストし難くてやや理解困難だから引き継ぐ時には丸ごと捨てられてやり直されるのだろうな。
0695Name_Not_Found2015/04/12(日) 18:19:46.91ID:???
>>661が言ってるようにチェーンという選択肢は間違いではないと思う
但し非同期も同期もあらゆる処理をチェーンで書くメソッドが不足してる
JSの表現力からしたら可能だけど、世界が追いついてない
Observableとそれと共に現れるであろうフレームワークにはかなり期待してる
0696Name_Not_Found2015/04/12(日) 18:38:49.87ID:???
>>693
> オーバーライドは問題にならないという話はもう上でしただろ。

それに対するレスを>>690で書いただろ

ホントお前人の話し聞かないなw
0697Name_Not_Found2015/04/12(日) 18:47:22.12ID:???
将来のES6ではできるようになるんだ!と
言った所で今は使えないわけで、
将来は!将来は!って繰り返し言ってもなぁ
あと10年後にまたおいで。
0698Name_Not_Found2015/04/12(日) 18:54:16.53ID:???
>>694
> 細かくconsole.log()したいから無意味にチェーンしないさせない。

もしかしてチェーンしたらconsole.logできないと思ってる?

そのための有名なメソッドがtapなんだけど。

残念ながらjQueryでは標準対応してないから、
たった4行だけ書かないといけないけど

$.fn.tap = function (callback) {
callback.apply(this);
return this;
};

これであっという間に、console.logができる。
function log() {
console.log(this);
}
$('#id').children().tap(log).children()
0699Name_Not_Found2015/04/12(日) 19:01:29.15ID:???
>>697
ElementsがElementのメソットを使えるようにするにはどうするのがいいかの話をしているんだろ。
ElementsはES6前提だし、今更何言ってるの?
もう知らないのなら無理に話に入ってこなくていいから。
勉強して出なおしてね。
0700Name_Not_Found2015/04/12(日) 19:05:22.99ID:???
ElementsがElementのメソットを使えるようにするにはどうするのがいいか?

全部再実装するんだろ?

で、あとからその実装したメソッドと同じ名前で
新たに標準追加されて大混乱w

既に過去に起きた事件だ
0701Name_Not_Found2015/04/12(日) 20:10:36.78ID:???
Elementsに追加するわけじゃないなら混乱は起こらないでしょ。
そのElementsのサブクラスを使ってる部分だけで閉じてるんだから。
新規で使う上で気になるのならライブラリを更新すればいいだけだし、
古い物に依存してる場合も問題は起きない。
0702Name_Not_Found2015/04/12(日) 20:34:47.08ID:???
え? 自分が言ったこと忘れたのか?
全てのDOM APIが、Elementsの代わりに
Elementsのサブクラスを返すようにするって
言ったばかりじゃんかw
0703Name_Not_Found2015/04/13(月) 05:53:20.16ID:???
誰がそんなこと言ってるんだろう?
>>678が見えないのかな?
0704Name_Not_Found2015/04/13(月) 08:01:00.91ID:???
まあ実際問題サブクラス経由のqueryAllがきちんとサブクラスのインスタンスを返してくれるようになるかは分からないけどな
Arrayとかネイティブの奴はES6できちんと継承が考慮がされた設計にされたけど
DOMの継承を利用した奴はこれから実装される段階だしおそらくissueになると思う

まあ例えElementsのままでもサブクラス側では機能を実装する必要はなくて
queryAll{return new SubClass(super.queryAll())}みたいなのでいいだろうし
全てのメソッドをオーバーライドするのが面倒臭ければそれこそProxyをプロトタイプに挟めばいいか
なんにせよこれは重大な問題提起だと思うね
0705Name_Not_Found2015/04/13(月) 16:25:50.83ID:???
jQueryの質問です。
jQueryオブジェクトをコンソールで見ると配列形式で表示されますが、これはどのようにしているのでしょうか?

http://i.imgur.com/lX94ne4.png
> $("body")
> [ <body></body>]   ←これのことです

配列という訳でもないみたいですし…なにか条件があるのでしょうか?
0706Name_Not_Found2015/04/13(月) 16:38:07.56ID:???
配列だよ^^
0707Name_Not_Found2015/04/13(月) 16:42:46.69ID:???
>>706
すみません説明不足でした。
配列というのはArrayのインスタンスという意味です。
Array.isArray($("body")) が false であることから分かるように、Arrayのインスタンスではありません。
Arrayのインスタンスでもないのに、なぜ配列形式で表示されるのか?という疑問です。

そしてその方法を使って、自分で定義したArrayのインスタンスでないオブジェクトにも同様のことをしたいと思っています。
0708Name_Not_Found2015/04/13(月) 18:38:58.89ID:???
>>707
「配列のようなオブジェクト」で検索してみたら、こんな感じだった

{
"0": "0番目の内容",
"1": "1番目の内容",
"length": 2
}
0709Name_Not_Found2015/04/13(月) 18:46:30.39ID:???
Arrayのインスタンス出ない≒配列でない
0711Name_Not_Found2015/04/13(月) 22:22:38.14ID:???
>>704
結局それ、jQueryの実装そのものじゃないかw
0712Name_Not_Found2015/04/13(月) 22:29:10.64ID:???
>>710
結論はそれかもしれないけど、各ブラウザのデバッグ機能は
jQueryに対して特別な対応をしていたはず。

NightlyのFirefoxではDOM要素にどんなjQueryイベントが紐付いているか見ることができる!
http://blog.mah-lab.com/2014/08/30/nightly-firefox-dev-tool/

http://www.buildinsider.net/web/chromedevtools/01
> ConsoleパネルからはDOM操作でページを直接編集できる。documentオブジェクトなどの
> 基本的なJavaScript機能を操作できるだけでなく、jQuery構文も利用できるようになっている。
0713Name_Not_Found2015/04/13(月) 22:59:01.55ID:???
>>712
ありがとうございます!
ブラウザ自体がjQueryに対して特別な配慮をしてるんですね。
spliceの件もその配慮の一環なんですかね。

ただGoogleChromeの方は、ただ単にページにjQueryが使われているから使えるだけなのでは…?
0714Name_Not_Found2015/04/13(月) 23:03:43.50ID:???
>>713
about:blankでも表示される。

そしてページにjQueryが使われているのであれば
$.fn.jqueryでjQueryのバージョンが表示されるが
それがない。
0715Name_Not_Found2015/04/13(月) 23:04:47.09ID:???
jQueryじゃなくて、$が使えるだけかも^^
0716Name_Not_Found2015/04/13(月) 23:08:55.31ID:???
>>714
あれ、そうなんですか?
すくなくとも手元のGC41のabout:blankではjQuery方式の書き方はできませんでした。
なにかフラグとか必要なのでしょうか?

$("body") === document.body; // true
$("body").text("hoge"); // Uncaught TypeError: string is not a function
0717Name_Not_Found2015/04/14(火) 04:23:04.72ID:???
こいつさっきから何を言ってるんだ???
ただコンソールにおいて$がdocument.querySelectorAll相当になってるだけじゃん
それ以上でも以下でもない
0718Name_Not_Found2015/04/14(火) 09:37:23.79ID:???
$ はこれ
https://developer.chrome.com/devtools/docs/commandline-api#selector
Build Insiderのような非公式サイトを参考にするから間違いが起きる

あと、こんな荒らしが立てたスレで質問するよりライブラリ総合質問スレで質問した方が有用だと思うけどね
自分もほとんどここ見てないし
0719Name_Not_Found2015/04/14(火) 13:28:42.59ID:???
>>718
やはりそうですよね。
記憶違いかと焦りました。
ありがとうございます!
0720Name_Not_Found2015/04/14(火) 19:57:30.56ID:???
だからすぐに訂正してあるじゃん?

715 自分:Name_Not_Found[sage] 投稿日:2015/04/13(月) 23:04:47.09 ID:???
jQueryじゃなくて、$が使えるだけかも^^
0721Name_Not_Found2015/04/14(火) 20:44:54.91ID:???
ここは回答者が認められるスレではない
質問者を助けるスレだ
思い上がらないように
0722Name_Not_Found2015/04/15(水) 07:12:43.88ID:???
>>720
かも、とか可能性レベルの話で回答する前にちゃんと確認しろよ
Aかもしれないし、Bかもしれないなんて回答にならん
0723Name_Not_Found2015/04/15(水) 12:25:11.32ID:???
もうそういうのいいから
このスレには質問と回答しかいらない
0724Name_Not_Found2015/04/15(水) 17:40:16.74ID:???
いや宗教論争は必要。
ツーチャンネルの技術板の価値は宗教論争だけ。
他の場所で宗教論争なんて本質に突っ込む議論を始めたら単なるキチガイだから。
0725Name_Not_Found2015/04/16(木) 08:17:41.20ID:???
>>723
回答になってないから指摘されてるんだろ
0726Name_Not_Found2015/04/16(木) 19:37:20.15ID:???
指摘はいりません
0727Name_Not_Found2015/04/16(木) 19:51:03.98ID:???
指摘される事が嫌ならキータに日報だか月報だかにしか見えない剽窃猿真似技術ブログでも書いて裸の王様やっとけよ雑魚が。
0728Name_Not_Found2015/04/16(木) 21:21:40.63ID:???
煽りはいりません
0729Name_Not_Found2015/04/17(金) 08:18:39.86ID:???
参考にならない回答はいりません
0730Name_Not_Found2015/04/17(金) 08:19:12.63ID:???
参考にならない回答はいりません
0731Name_Not_Found2015/04/17(金) 18:01:54.71ID:???
回答でない参考はいりません
0732Name_Not_Found2015/04/17(金) 21:44:13.15ID:???
日本語のおかしい意見はいりません
0733Name_Not_Found2015/04/17(金) 22:01:51.21ID:???
池のおかしい日本はイリン
0735Name_Not_Found2015/04/29(水) 23:00:49.36ID:???
var small_option=0;
if(document.chbox3 && document.chbox3.elements[0]){
small_option = document.chbox3.elements[0].checked ? 1 : 0;
}
って書いてますが、この場合、存在チェックって、
document.chbox3 && document.chbox3.elements[0]でよろしいでしょうか?
何かいい手がありますでしょうか?
0736Name_Not_Found2015/04/30(木) 06:53:06.96ID:???
>>735
document.chbox3 &amp;&amp; document.chbox3.elements &amp;&amp; document.chbox3.elements[0]
0737Name_Not_Found2015/04/30(木) 20:29:34.61ID:???
>>735
jQuery使っていいのなら

var small_option = $('[name="chbox3"]').prop('checked') ? 1 : 0;
(「? 1 : 0 」はいらん気もするが)

要素がなければundefinedになってくれる。
0個以上の要素として扱うと、こういう風にシンプルに書くことが出来る。
07387352015/04/30(木) 20:58:08.64ID:???
>>736-737
ありがとうございます。
small_optionはajaxで、php側に投げるデータで、php側でpostで受け取り、
1か0でないなら「small_optionが不正」ってエラーメッセージを出す仕様なので、
undefinedだとまずいです。
0739Name_Not_Found2015/04/30(木) 22:07:02.76ID:???
じゃあ仕方ないね。? 1 : 0は必要ということで。
0740Name_Not_Found2015/04/30(木) 22:08:38.99ID:???
と思ったけど、これでいいのか

var small_option = $('[name="chbox3"]').prop('checked') || 0;

もしくはこれ。(checkboxのvalueの1が設定されている前提)
var small_option = $('[name="chbox3"]').val() || 0;
0741Name_Not_Found2015/04/30(木) 22:09:42.22ID:???
話がそれた。

存在チェックの話だったね。

jQueryを使えば存在チェックそのものが不要になる。ということで。
0742Name_Not_Found2015/05/01(金) 04:47:49.35ID:???
jQueryみたいなライブラリ勧める上で決してお手軽ではないことは注意として挙げるべき
一部分だけjQueryのセレクタ使ってるようなコードに違和感がないならいいが
0743Name_Not_Found2015/05/01(金) 19:34:06.86ID:???
ていうか、戻り値の型が場合によって違うのに平気とか、もうね、jQuery厨のショボさハンパないな。
0744Name_Not_Found2015/05/01(金) 19:45:25.87ID:???
> 戻り値の型が場合によって違うの

え? どこが???
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況