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

    私的良スレ書庫

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

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

    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
    801 : 795 - 2015/02/05(木) 07:45:32.92 ID:???.net (+70,+29,-7)
    >>800
    すまん俺がムキになってた
    もうレスしない
    指摘ありがとう
    802 : 796 - 2015/02/05(木) 07:47:21.97 ID:???.net (+9,-30,-148)
    ただ、>>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 : Name_Not - 2015/02/05(木) 08:41:39.79 ID:???.net (+91,+30,-85)
    パブリッシュ・サブスクライブパターンで
    パブリッシュ側のハンドラを解除せずに
    サブスクライブ側のオブジェクトを削除したらメモリーリークになるそうですが
    どんな解決法がありますか?
    804 : Name_Not - 2015/02/05(木) 10:57:23.83 ID:???.net (+53,+20,-68)
    例外処理の目的には
    エラーが起きた理由を明らかにする
    問題が生じた箇所を絞り込み易くする
    エラーが起きても正常運転を続行できるようにする
    という異なる目的がある所から考えるべきでないか?

    例えば、処理の副作用を容易に取り消せるまたはエラー時の副作用はない、
    かつ正常運転のみが目的なら

    try{ 処理 } catch {フォールバック}

    が最も単純だろう
    805 : 783 - 2015/02/05(木) 12:00:54.65 ID:???.net (+77,+29,-38)
    >>795
    > そもそもエラー毎に個別のエラー処理が必要になることはまず無い。
    だったらエラー処理とは言わない
    ただの成功失敗の条件分岐だろ

    このレスでエラー処理とか何も分かってない事が分かったよ
    806 : Name_Not - 2015/02/05(木) 20:49:41.19 ID:???.net (+61,+28,-48)
    > だったらエラー処理とは言わない
    じゃあ何をエラー処理というのか?

    > ただの成功失敗の条件分岐だろ
    条件分岐したあとのコードがエラー処理でしょ?
    今回の例で言えばalertでエラーを画面に表示すること。
    807 : Name_Not - 2015/02/05(木) 21:16:32.92 ID:???.net (+11,-29,-75)
    window.openする時にアドレスバーを表示したのですが、アドレスバーに変なURLを入力されたくありません。
    なので、アドレスバーにユーザが入力出来ないようにしたいのですが、可能でしょうか?

    ブラウザはIE11です
    808 : Name_Not - 2015/02/05(木) 21:36:34.39 ID:???.net (+14,-20,-47)
    >>807
    不可能です
    開いたウインドウをユーザに操作させないのなら window.open を使わず、擬似ウインドウを使うべきです
    809 : Name_Not - 2015/02/05(木) 21:41:31.56 ID:???.net (+5,-28,-41)
    自分の手元だとlocation=noで、アドレスバー表示&変更不可になるけどな…
    でも確かに>>808の言うように擬似的なウィンドウを作るのが一番確実かもしれないですね
    iframe使う方法とか
    810 : Name_Not - 2015/02/05(木) 21:53:16.39 ID:???.net (-1,-29,-15)
    >>809
    location=noでアドレスバー変更できなくなるね
    感謝
    811 : Name_Not - 2015/02/06(金) 03:13:45.23 ID:???.net (+103,+29,-1)
    >>803が分かる人はこのスレにいないんですか?
    812 : Name_Not - 2015/02/06(金) 06:37:29.01 ID:???.net (+71,+29,-5)
    >>811
    1. なんについての話かわからない。
    2. 弱参照にすればいいだけ
    813 : Name_Not - 2015/02/06(金) 06:57:21.57 ID:???.net (+2,-29,-10)
    pushStateと使えば読み込みなしでurlを変えられますが
    これはどんな時に使うんですか?
    814 : Name_Not - 2015/02/06(金) 08:03:49.46 ID:???.net (-1,-29,-25)
    >>813
    pushstateを誰でも使えるようにした pjax メリット でググるべし
    815 : Name_Not - 2015/02/06(金) 13:01:08.94 ID:???.net (+51,+23,-37)
    ありがとうございます
    ajaxでのページ更新を可能にして反応速度アップした上で
    通常のページ遷移のように扱えるようですね
    816 : Name_Not - 2015/02/07(土) 01:04:49.48 ID:???.net (+53,-30,+0)
    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 : Name_Not - 2015/02/07(土) 01:29:24.05 ID:???.net (+10,-30,-204)
    >>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 : Name_Not - 2015/02/07(土) 01:40:27.76 ID:???.net (+11,-30,-153)
    >>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 : Name_Not - 2015/02/07(土) 02:03:14.20 ID:???.net (+58,+24,-65)
    >>816
    c)だと思うのなら、その部分をjQueryなしで書いてみな
    問題の切り分けをしよう
    たとえば1.でひとつも選択できてない場合でも 2.で undefined が返ってくるわけだし
    820 : Name_Not - 2015/02/07(土) 02:29:56.99 ID:???.net (-1,-29,-56)
    developer tool だか console みたいな名前のツール開いて一行ずつオブジェクトの中身見て行けば、どういう値の取り出し方があるかすぐ分かるだろ。
    821 : Name_Not - 2015/02/07(土) 09:48:52.93 ID:???.net (+10,-30,+0)
    >>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 : Name_Not - 2015/02/07(土) 09:53:33.84 ID:???.net (+4,-30,+0)
    >>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 : Name_Not - 2015/02/07(土) 10:00:14.31 ID:???.net (+4,-29,-174)
    あと>>817も書いているけど、alertの動きは特殊で
    JavaScript実行処理のタイミングに影響をあたえることがあるから
    こういった場合にはconsole.logを使った方がいいよ。

    alertの動きが特殊っていうのは、alertはJavaScriptの命令の中で
    数少ないJavaScriptの処理を一時停止させることが出来る命令で
    かつ、画面描画を伴うから、alertが表示される直前直後で
    ブラウザ内部で何かしらの処理が行われることがある。
    824 : 533 - 2015/02/07(土) 10:11:39.23 ID:???.net (+51,+23,-21)
    IE8 に対応する方法はなさそうなので諦めます
    お読みいただいた方、ありがとうございました
    825 : Name_Not - 2015/02/07(土) 12:00:29.69 ID:???.net (+96,+29,-109)
    jQuery の質問をすると堰を切ったように聞いてもいない jQuery の仕組みを長々と説明する人が出てくるのでやはり、ライブラリスレで質問した方が良かった気がする
    ここまでのアドバイスを試しても解決しないようなら、ライブラリスレに行く事を推奨する
    826 : Name_Not - 2015/02/07(土) 12:30:57.91 ID:???.net (+104,+29,-2)
    >>825
    でもお前はなんにも役に立ってないよね。
    827 : Name_Not - 2015/02/07(土) 12:35:58.74 ID:???.net (+71,+29,-13)
    >>826
    回答した上でいってる
    不用意に「なんにも役に立ってない」とはいわないように
    828 : Name_Not - 2015/02/07(土) 13:02:26.90 ID:???.net (+57,+29,-21)
    そういうあからさまに荒らし本人なのはスルーしとけよ
    煽られてムカつくのはわかるけどさ
    829 : Name_Not - 2015/02/07(土) 13:20:30.38 ID:???.net (+52,-30,-53)
    var a = [];
    a['a'] = 1;
    console.log(a['a']); // 1
    console.log(a.length); 0

    なんでサイズが0なんですか?
    830 : Name_Not - 2015/02/07(土) 13:25:24.17 ID:???.net (+57,+29,-12)
    数え上げ出来ない添え字はループで使えないんで長さに含めない事にしたんじゃね?
    831 : Name_Not - 2015/02/07(土) 13:29:44.94 ID:???.net (+52,+29,-2)
    そりゃaの中が空っぽだからさ
    832 : Name_Not - 2015/02/07(土) 13:32:00.58 ID:???.net (-1,-29,+0)
    a['a']には入ってるので空っぽではないです
    833 : Name_Not - 2015/02/07(土) 13:48:09.38 ID:???.net (+10,-30,-43)
    配列の要素ではなくプロパティの方に追加されたから、だっけ?

    var a = {};
    a['a'] = 1; //OK
    a.push(2); //ERROR

    上記はObject型なんでArray型の特性を備えてない
    しかし>>829はArray型なんでObject型の特性も併せ持つ
    834 : Name_Not - 2015/02/07(土) 14:22:55.41 ID:???.net (+11,-30,-80)
    >>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 : Name_Not - 2015/02/07(土) 14:37:09.87 ID:???.net (+61,+8,-16)
    そもそもlengthは要素数を表しているわけではないからな
    836 : Name_Not - 2015/02/07(土) 14:37:34.78 ID:???.net (+3,-29,-23)
    連想配列的な挙動を望むなら ES6 の Map が便利
    http://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Map
    837 : Name_Not - 2015/02/07(土) 14:40:14.03 ID:???.net (+83,+6,-42)
    >>835
    >>829を理解した上で配列の要素数を返すプロパティだと認識していた
    要素数でないなら length は何を返すものなんだろう?
    http://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/length
    838 : Name_Not - 2015/02/07(土) 14:51:11.27 ID:???.net (+80,+29,-54)
    >>837
    厳密に言うと、最大添字数+1でしょうね
    添字が0から始まって要素が隙間なく埋まってたら要素数と一致するが

    そこにも書いてあるじゃない lengthの値と実際の要素数は一致しないこともあると
    839 : Name_Not - 2015/02/07(土) 15:23:50.86 ID:???.net (+26,-30,+0)
    >>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 : Name_Not - 2015/02/07(土) 15:50:07.14 ID:???.net (+15,-29,-67)
    lengthは「長さ」だからなあ
    サイズとはまた違うものだと思う

    このスレのどこかにあったけど、サイズを調べるのは Object.keys(a).length でできるよ
    841 : Name_Not - 2015/02/07(土) 15:53:15.73 ID:???.net (+15,-30,-40)
    >>839
    こんなんでもいいんじゃない?
    var a = [];
    a[100] = 'a';
    これでlengthは101だけど要素数は1だよね

    要素数を返すという根拠にそのページを挙げてたと思われたので、
    そのページでも実際の要素数とは区別して書いているんだよと言いたかった > 書いてあるじゃない
    842 : Name_Not - 2015/02/07(土) 16:16:48.65 ID:???.net (+7,-30,-127)
    >>839
    for 文だと hasOwnProperty を使わないと Array.prototype.forEach と同じ挙動にならないんだな…

    >>840
    Map.prototype.size と Array.prototype.length の挙動が違うようなものか
    Object.keys のコードは>>534だな
    843 : Name_Not - 2015/02/07(土) 16:52:03.22 ID:???.net (+10,-30,-165)
    >>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 : Name_Not - 2015/02/07(土) 17:32:01.07 ID:???.net (+43,-30,-208)
    >>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 : 840 - 2015/02/07(土) 17:49:30.41 ID:???.net (+100,+29,-39)
    >>844
    なるほど、そこまで考えて回答してるとは思わなかったわ、すまん
    確かにES5の日本語化は不足してるからなあ…
    唯一見れるのはhttp://tsofthome.appspot.com/ecmascript.htmlくらいかな?
    Arrayの部分はきれいに飛ばされてるけどw
    846 : 841 - 2015/02/07(土) 21:14:40.37 ID:???.net (+76,+29,-238)
    >>845
    いや、私も全ての仕様を熟知しているわけではないので細かな点まで指摘してもらえるのは有難い
    今にして思えば、「厳密には違うが、簡単に説明すれば」の前置きを置いたり、ES3, ES5 のURLを併記すれば良かったように思う
    私も積極的に指摘するので今後も指摘して貰えると助かるのが正直な気持ちだ

    ところで、「プロパティ名はすべて String型」だが、正確にはプロパティ名に型は存在しないので、内部処理で「プロパティ名は String 型にキャスト(型変換)される」が正解だと思う
    プロパティアクセス演算子で扱える型に制限はなかったはずなので a[NaN] も a[true] も問題なく評価できるはずだ
    (ES6 では Symbol 型、Map、WeakMap だけ扱いが特殊だが)

    > 唯一見れるのはhttp://tsofthome.appspot.com/ecmascript.htmlくらいかな?
    知らなかったが、部分的でも和訳があるのはいいな
    テンプレに入れてもいいぐらいだと思う
    847 : Name_Not - 2015/02/07(土) 23:51:52.56 ID:???.net (+130,+29,-58)
    http://tsofthome.appspot.com/ecmascript.html をテンプレの>>4に入れようと思ったが、行数制限で入らなかった
    >>4から不要なリンクを削除して入れる事を試みる
    ES5 で標準化された JSONhttp://www.json.org/json-ja.html は削除してもいいと思うのだが、どうだろう?
    848 : Name_Not - 2015/02/08(日) 01:26:47.31 ID:???.net (+107,+29,-1)
    >>847
    だめだな。勝手なことするな。
    849 : Name_Not - 2015/02/08(日) 01:27:42.26 ID:???.net (+119,+27,-2)
    >>847
    分けて入れればいいだろ
    850 : Name_Not - 2015/02/08(日) 01:34:16.45 ID:???.net (+117,+29,-12)
    俺としては、>>3を消したいな。
    あれIE6ぐらいの時代のもので
    今となっては説明不足&間違ってる&どうでもいい話
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / JavaScript スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

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


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