元スレ+ JavaScript の質問用スレッド vol.122 +
JavaScript覧 / PC版 /みんなの評価 :
801 = :
>>800
すまん俺がムキになってた
もうレスしない
指摘ありがとう
802 = :
ただ、>>690は TypeError を発生させずに静かに処理させたいようだから、try-catch で例外を catch して強制停止させる提案は>>690の希望に適わない
例外を明示的に発生させる場合というのは「処理を強制停止させたい場合」に限定される
> (o.a.b.c.d.e.f.g.h.i.j.k.l.m.n == 1)
もし、あなたが o === null だった場合に処理を停止させたいのなら下記のように書けば良い
var o = null;
o.a.b.c.d.e.f.g.h.i.j.k.l.m.n == 1; // TypeError: Cannot read property 'a' of null
何もせずとも ECMAScript 規定によって TypeError で処理を停止してくれる
「仕様書を読め」と口をすっぱくして言われているのはこういう事
ES 規定による例外で対応できない場合は>>781のように独自に例外を定義しても良い
803 = :
パブリッシュ・サブスクライブパターンで
パブリッシュ側のハンドラを解除せずに
サブスクライブ側のオブジェクトを削除したらメモリーリークになるそうですが
どんな解決法がありますか?
804 = :
例外処理の目的には
エラーが起きた理由を明らかにする
問題が生じた箇所を絞り込み易くする
エラーが起きても正常運転を続行できるようにする
という異なる目的がある所から考えるべきでないか?
例えば、処理の副作用を容易に取り消せるまたはエラー時の副作用はない、
かつ正常運転のみが目的なら
try{ 処理 } catch {フォールバック}
が最も単純だろう
805 = :
>>795
> そもそもエラー毎に個別のエラー処理が必要になることはまず無い。
だったらエラー処理とは言わない
ただの成功失敗の条件分岐だろ
このレスでエラー処理とか何も分かってない事が分かったよ
806 = :
> だったらエラー処理とは言わない
じゃあ何をエラー処理というのか?
> ただの成功失敗の条件分岐だろ
条件分岐したあとのコードがエラー処理でしょ?
今回の例で言えばalertでエラーを画面に表示すること。
807 = :
window.openする時にアドレスバーを表示したのですが、アドレスバーに変なURLを入力されたくありません。
なので、アドレスバーにユーザが入力出来ないようにしたいのですが、可能でしょうか?
ブラウザはIE11です
808 = :
>>807
不可能です
開いたウインドウをユーザに操作させないのなら window.open を使わず、擬似ウインドウを使うべきです
809 = :
自分の手元だとlocation=noで、アドレスバー表示&変更不可になるけどな…
でも確かに>>808の言うように擬似的なウィンドウを作るのが一番確実かもしれないですね
iframe使う方法とか
811 = :
>>803が分かる人はこのスレにいないんですか?
812 = :
>>811
1. なんについての話かわからない。
2. 弱参照にすればいいだけ
813 = :
pushStateと使えば読み込みなしでurlを変えられますが
これはどんな時に使うんですか?
815 = :
ありがとうございます
ajaxでのページ更新を可能にして反応速度アップした上で
通常のページ遷移のように扱えるようですね
816 = :
jQueryも混じっていますが、核心となる置換部分はJavaScriptなので
こちらでのご質問をお許し願いたいと存じます。
下記のようなスクリプトがあります。
1 var aTag = $(currentImg).parent('a');
2 var aTagHref = aTag.attr('href');
3 aTagHref = aTagHref.replace(/hoge/, '');
※ currentImg は、画像を取得保存した変数。
■ やりたいこと
1)aTag.attr('href') から文字列「hoge」をすべて取り除いて
変数 aTagHref に保存しておきたいのです。
2)aTag.attr('href') 自体は別途使うので、ここでは変更しません。
※ 別のところで、条件に応じてaTag.attr('href', '任意のURL')
の形で置換することはある。
■ 質問
a)上記のスクリプトはPCのFirefoxやChrome、Sleipnirでは意図通りに動作し、
aTagHref の内容を取り出すことができるのですが、
一部のモバイル環境(例えばiOS7やMac版Safari)でエラーを起こしてしまい、
処理が止まってしまいます。
3行目をコメントアウトすれば、ここでやりたい置換処理を除いては処理自体は完遂します。
Safari では、alert(aTagHref); としてみると、undefinedobject を返してきます。
aTagHref にURLを取得し、文字列を置換するにはどうすればよいでしょうか。
b)aTag.attr('href') は文字列ではなく、オブジェクトか何かで環境によっては
そこを文字列に明示的に置き換える処理が必要なのかな、と思ってもいます。
置換できる環境とそうでない環境の違いはなんでしょうか。
c)あるいは、aTag.attr('href'); という取り出し方がそもそも良くないのでしょうか。
817 = :
>>816
> jQueryも混じっていますが、核心となる置換部分はJavaScriptなので
aTag.attr('href') の戻り値の問題なら、どう考えても jQuery の問題であり、ライブラリスレで扱うべき問題のように思えます。
2. までは期待通りに動作し、3. で問題が起きているなら根幹は JavaScript だと思いますが…。
> Safari では、alert(aTagHref); としてみると、undefinedobject を返してきます。
console.log() で [aTag, aTag.attr('href')] を出力して中身を確認してみてはどうでしょう?
> b)aTag.attr('href') は文字列ではなく、オブジェクトか何かで環境によっては
> そこを文字列に明示的に置き換える処理が必要なのかな、と思ってもいます。
attr() の戻り値は String 型です。
http://api.jquery.com/attr/#attr1
818 = :
>>816
ひょっとして、これですかね…。
"As of jQuery 1.6, the .attr() method returns undefined for attributes that have not been set."
http://api.jquery.com/attr/#attr1
あと、jQuery は iOS7 もサポートしていますが、モバイル用途に jQuery Mobile も用意されているのでそちらも試して動くようなら jQuery のバグとして報告した方がいいんじゃないかと。
http://jquery.com/browser-support/
819 = :
>>816
c)だと思うのなら、その部分をjQueryなしで書いてみな
問題の切り分けをしよう
たとえば1.でひとつも選択できてない場合でも 2.で undefined が返ってくるわけだし
821 = :
>>816
まず、このコード自体に間違いはないよ。
ブラウザによって、attr('href')で返ってくるのが絶対URLなのか
相対URLなのかという違いがあったと思うが、それは今回関係ないはず。
(なお絶対URLなのか相対URLかの違いはDOM APIの
hrefそのものの問題だったはずなのでjQueryには直接関係ない)
で、a)を見る限り、aTagHref に undefined object が返って来ているのが問題。
考えられることの一つは、hrefに何も値が入っていない場合。
おそらくこっちは間違えることはないだろう。
もう一つは要素が見つからなかった場合。
つまりcurrentImgもしくは'a'が見つからなかった場合。
jQueryの設計は、0個以上の要素群に対して処理を行うので
たとえ、1 で要素が見つからなくても処理は進む。
PCでは意図的に動作をし、モバイルでエラーを起こす。ブラウザ的に大きな違いはないので
あるとしたらPCスペックと転送速度の問題。
とまあ長々と書いたが、要するにそのコード、ready関数(の短縮形$(function() { ・・・ }))の
中で書いてないんじゃね?(または</body>の直前にコードを入れてもOK)
つまり、PCでは処理が早いから、DOM構築が終わった後でJavaScriptのコードが走っているが、
モバイルでは処理が遅いから、DOMの構築が終わる前にJavaScriptのコードが走っていると考えられる。
JavaScriptの実行タイミングの問題だからjQueryで便利メソッドが用意されているとはいえ
jQueryとは直接関係ない問題だね。
822 = :
>>818
> モバイル用途に jQuery Mobile も用意されているのでそちらも試して動くようなら
jQuery MobileはjQueryではないよ。
jQueryを使って動くjQuery UIと同じような扱いで
jQueryを使って動くモバイル風UIを実現したのがjQuery Mobile
jQuery Mobileを使っても、jQueryをその前に読み込む必要がある。
なお、IE8以下をサポートする時に使用するのがjQuery 1系であり
IE9以上のサポートで十分ならばjQuery 2系を使う。
モバイル用途かどうかで使い分ける必要はないが、
モバイル用途限定であればIE8以下をサポートしなくていいのでjQuery 2系を使える。
(ただしAPIは全く一緒。どちらを使っても同じように動く)
823 = :
あと>>817も書いているけど、alertの動きは特殊で
JavaScript実行処理のタイミングに影響をあたえることがあるから
こういった場合にはconsole.logを使った方がいいよ。
alertの動きが特殊っていうのは、alertはJavaScriptの命令の中で
数少ないJavaScriptの処理を一時停止させることが出来る命令で
かつ、画面描画を伴うから、alertが表示される直前直後で
ブラウザ内部で何かしらの処理が行われることがある。
824 = :
IE8 に対応する方法はなさそうなので諦めます
お読みいただいた方、ありがとうございました
825 = :
jQuery の質問をすると堰を切ったように聞いてもいない jQuery の仕組みを長々と説明する人が出てくるのでやはり、ライブラリスレで質問した方が良かった気がする
ここまでのアドバイスを試しても解決しないようなら、ライブラリスレに行く事を推奨する
826 = :
>>825
でもお前はなんにも役に立ってないよね。
827 = :
>>826
回答した上でいってる
不用意に「なんにも役に立ってない」とはいわないように
828 = :
そういうあからさまに荒らし本人なのはスルーしとけよ
煽られてムカつくのはわかるけどさ
829 = :
var a = [];
a['a'] = 1;
console.log(a['a']); // 1
console.log(a.length); 0
なんでサイズが0なんですか?
830 = :
数え上げ出来ない添え字はループで使えないんで長さに含めない事にしたんじゃね?
831 = :
そりゃaの中が空っぽだからさ
833 = :
配列の要素ではなくプロパティの方に追加されたから、だっけ?
var a = {};
a['a'] = 1; //OK
a.push(2); //ERROR
上記はObject型なんでArray型の特性を備えてない
しかし>>829はArray型なんでObject型の特性も併せ持つ
834 = :
>>829
プロパティ名が Number 型でなければ length の値が変動しない仕様だから
http://web.archive.org/web/20140802215704/http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/15-4_Array_Objects.html#section-15.4.5.1
>>833
Array 型は存在しない
835 = :
そもそもlengthは要素数を表しているわけではないからな
836 = :
連想配列的な挙動を望むなら ES6 の Map が便利
http://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map
837 = :
>>835
>>829を理解した上で配列の要素数を返すプロパティだと認識していた
要素数でないなら length は何を返すものなんだろう?
http://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/length
838 = :
>>837
厳密に言うと、最大添字数+1でしょうね
添字が0から始まって要素が隙間なく埋まってたら要素数と一致するが
そこにも書いてあるじゃない lengthの値と実際の要素数は一致しないこともあると
839 = :
>>838
あなたがいいたかったのはこういうことだろうか
var numbers = [1, 2, 3, 4, 5];
console.log(numbers.length); // 5
delete numbers[1];
console.log('1' in numbers); // false
console.log(numbers.length); // 5
numbers.forEach (function (element) {
console.log(element); // 1 -> 3 -> 4 -> 5
});
> そこにも書いてあるじゃない lengthの値と実際の要素数は一致しないこともあると
MDN で説明している不一致になるパターンは「length プロパティを実際よりも大きな値に書き換えた場合」であなたの説明とは無関係だと思うのだが…
(実際にはほぼ使わない例外的な挙動なので私はこれを考慮していなかった)
結論としては、下記のようになるということか
・length は「最大数値添字値+1」を返す
・ただし、ユーザが実際の要素数よりも大きな数値で length プロパティを書き換えた場合はその値を返す
840 = :
lengthは「長さ」だからなあ
サイズとはまた違うものだと思う
このスレのどこかにあったけど、サイズを調べるのは Object.keys(a).length でできるよ
841 = :
>>839
こんなんでもいいんじゃない?
var a = [];
a[100] = 'a';
これでlengthは101だけど要素数は1だよね
要素数を返すという根拠にそのページを挙げてたと思われたので、
そのページでも実際の要素数とは区別して書いているんだよと言いたかった > 書いてあるじゃない
842 = :
>>839
for 文だと hasOwnProperty を使わないと Array.prototype.forEach と同じ挙動にならないんだな…
>>840
Map.prototype.size と Array.prototype.length の挙動が違うようなものか
Object.keys のコードは>>534だな
843 = :
>>834
その理解でもまああんまり問題ないけど、正確に言うと違う
JavaScript の Object のプロパティ名はすべて String型(ES6 から Symbol型 も加わったが)
Array の添え字ももちろん String型 で管理されている
var a = [];
a[5] = true;
a["1"+"0"] = true; // a[10] = true; と同じ
alert(a.length); // 11
for(var i in a) alert(typeof i + ": " + i); // 「string: 5」「string: 10」
あとそのサイトはES3なので、今更そのサイトを参照元にするのはお勧めできない
844 = :
>>843
> JavaScript の Object のプロパティ名はすべて String型(ES6 から Symbol型 も加わったが)
わかってはいたが、>>829が理解できる説明をする自信がなかったので簡略化してしまった
下記のように理解してる
---
var newLenDesc = ToUint32(propertyName),
oldLenDesc = this.length;
if (newLenDesc !== ToNumber(propertyName)) {
throw new RangeError;
}
if (++newLenDesc > oldLenDesc) {
this.length = newLenDesc;
}
--
> あとそのサイトはES3なので、今更そのサイトを参照元にするのはお勧めできない
これは大分迷ったが、>>829に紹介するなら日本語でないと読めないと思ったのであえて古い ES3 を紹介した
読めそうな人には ES5 を紹介するんだが…
http://es5.github.io/#x15.4.5
845 = :
>>844
なるほど、そこまで考えて回答してるとは思わなかったわ、すまん
確かにES5の日本語化は不足してるからなあ…
唯一見れるのはhttp://tsofthome.appspot.com/ecmascript.htmlくらいかな?
Arrayの部分はきれいに飛ばされてるけどw
846 = :
>>845
いや、私も全ての仕様を熟知しているわけではないので細かな点まで指摘してもらえるのは有難い
今にして思えば、「厳密には違うが、簡単に説明すれば」の前置きを置いたり、ES3, ES5 のURLを併記すれば良かったように思う
私も積極的に指摘するので今後も指摘して貰えると助かるのが正直な気持ちだ
ところで、「プロパティ名はすべて String型」だが、正確にはプロパティ名に型は存在しないので、内部処理で「プロパティ名は String 型にキャスト(型変換)される」が正解だと思う
プロパティアクセス演算子で扱える型に制限はなかったはずなので a[NaN] も a[true] も問題なく評価できるはずだ
(ES6 では Symbol 型、Map、WeakMap だけ扱いが特殊だが)
> 唯一見れるのはhttp://tsofthome.appspot.com/ecmascript.htmlくらいかな?
知らなかったが、部分的でも和訳があるのはいいな
テンプレに入れてもいいぐらいだと思う
847 = :
http://tsofthome.appspot.com/ecmascript.html をテンプレの>>4に入れようと思ったが、行数制限で入らなかった
>>4から不要なリンクを削除して入れる事を試みる
ES5 で標準化された JSONhttp://www.json.org/json-ja.html は削除してもいいと思うのだが、どうだろう?
848 = :
>>847
だめだな。勝手なことするな。
849 = :
>>847
分けて入れればいいだろ
850 = :
俺としては、>>3を消したいな。
あれIE6ぐらいの時代のもので
今となっては説明不足&間違ってる&どうでもいい話
類似してるかもしれないスレッド
- + JavaScript の質問用スレッド vol.122 + (116) - [100%] - 2018/5/2 18:30
- + JavaScript の質問用スレッド vol.125 + (1001) - [97%] - 2015/10/7 17:45
- + JavaScript の質問用スレッド vol.123 + (966) - [97%] - 2020/10/20 2:30
- + JavaScript の質問用スレッド vol.120 + (1002) - [97%] - 2014/11/8 1:15
- + JavaScript の質問用スレッド vol.124 + (1001) - [97%] - 2015/7/16 1:30
- + JavaScript の質問用スレッド vol.121 + (1001) - [97%] - 2022/11/29 16:30
- + JavaScript の質問用スレッド vol.132 + (1001) - [97%] - 2018/4/19 11:00
- + JavaScript の質問用スレッド vol.142 + (984) - [97%] - 2020/8/27 19:15
- + JavaScript の質問用スレッド vol.112 + (1001) - [97%] - 2013/11/27 16:46
- + JavaScript の質問用スレッド vol.121 + (1001) - [97%] - 2015/1/1 18:30
- + JavaScript の質問用スレッド vol.129 + (981) - [97%] - 2016/5/5 8:16
- + JavaScript の質問用スレッド vol.129 + (926) - [97%] - 2017/7/27 13:45
- + JavaScript の質問用スレッド vol.128 + (1001) - [97%] - 2016/2/26 6:45
- + JavaScript の質問用スレッド vol.123 + (1002) - [97%] - 2015/4/27 23:30
- + JavaScript の質問用スレッド vol.127 + (1001) - [97%] - 2016/2/4 0:15
- + JavaScript の質問用スレッド vol.127 + (160) - [97%] - 2021/7/16 9:30
- + JavaScript の質問用スレッド vol.142 + (926) - [97%] - 2019/12/23 13:15
トップメニューへ / →のくす牧場書庫について