+ JavaScript の質問用スレッド vol.121 +
JavaScript に関する何でも質問スレです。
お気軽にどうぞ。
>>1 またお前か
教えて君を擁護するためのテンプレで新スレを無駄に量産するな
6 :
Name_Not_Found:2014/09/14(日) 20:59:18.42 ID:xbdCvSRU
どんだけスレ立てるんだよww
まぁスレ立てる手間省けていいけど
乙!
乙なわけないだろ
この手の擁護はワンパターンすぎるわ
8 :
Name_Not_Found:2014/09/15(月) 16:18:51.11 ID:gtUjIHaV
phpのstrip_tag()と同じことができる
方法を考えて
>>8 ここは荒らしが立てたフライングスレだから他所へ行け
10 :
Name_Not_Found:2014/09/16(火) 16:49:17.38 ID:6H52XqM3
ひさびさに来たんだが
なにが荒らしなん?
11 :
Name_Not_Found:2014/09/16(火) 18:10:51.54 ID:pcL6/osK
文字列がすべてASCIIかを調べる正規表現を教えて頂きたいのですが、
自分で調べたところ
/[\x01-\x7F]/g
と
/[\x20-\x7E]/g
この2つが見つかりました。
これはどっちを使えばいいのでしょうか?
詳しい方教えてください
>>10 vol.119がある状況でvol.121をたてる必要はないから
14 :
Name_Not_Found:2014/09/20(土) 16:06:26.93 ID:MSLISnVY
あげあげ
このスレはそのスレの次次スレだろ
だから荒らしだろ
立てたのは荒らしかも知れないが、
スレ自体はまともなので問題ないのでは?
スレに問題があるっていう人、何人もいたっけ?
俺の知る限り一人しかいないよ。
一人かどうかは知らんが、問題があるのは明らかだろ
問題あるよ
おかしな文句言ってる奴の頭にww
21 :
榎本行宏 忍法帖【Lv=10,xxTP】(1+0:5) 【ponponfine95916】 ◆aXy7M764q2 :2014/09/28(日) 15:46:50.85 ID:e8x8AMN5 BE:901796151-2BP(1000)
この問題の答え誰かわかりますか?(*ω*)
《演習ドリル JavaScript(1)》
【01】JavaScriptの標準化されたものをなんと呼ぶか書きなさい
【02】JavaScriptは、「 」で動くスクリプトです。空欄を埋めなさい。
1. サーバー 2.クライアント
【03】命令文(ステイタス)の終了を表す記号を書きなさい
【04】jsフォルダー内にある sample.js を読み込む記述をしなさい
【05】警告ウィンドウを表示するスクリプトを記述しなさい(値は不要)
【06】ブラウザに文字列を表示するスクリプトを記述しなさい(値は不要)
【07】JavaScriptでの変数宣言をするために必要な語句を書きなさい
【08】文字列「こんにちは」を、ブラウザに表示するコードを記述しなさい(script要素内)
【09】変数 msgに、ダイアログボックスに入力された値を代入しブラウザに表示する記述をしなさい
【10】変数 aに8を、変数 bに6を代入し、a を bで割った余りををコンソールに表示しなさい
> 【01】JavaScriptの標準化されたものをなんと呼ぶか書きなさい
LiveScript
>【02】JavaScriptは、「 」で動くスクリプトです。空欄を埋めなさい。
サーバーサイド等
> 【03】命令文(ステイタス)の終了を表す記号を書きなさい
なくてもよい
> 【04】jsフォルダー内にある sample.js を読み込む記述をしなさい
cat js/sample.js
> 【05】警告ウィンドウを表示するスクリプトを記述しなさい(値は不要)
<dialog id="alert">警告ウインドウ</dialog>
document.getElementById('alert').show()
> 【06】ブラウザに文字列を表示するスクリプトを記述しなさい(値は不要)
document.body.innerHTML = 'test';
> 【07】JavaScriptでの変数宣言をするために必要な語句を書きなさい
let
> 【08】文字列「こんにちは」を、ブラウザに表示するコードを記述しなさい(script要素内)
<script>document.write('<' + '/script>こんにちは<' + 'script>')</script>
> 【09】変数 msgに、ダイアログボックスに入力された値を代入しブラウザに表示する記述をしなさい
bootbox.prompt("input", "cancel", "ok", function(msg) { alert(msg) });
> 【10】変数 aに8を、変数 bに6を代入し、a を bで割った余りををコンソールに表示しなさい
[a,b]=[8,6],console.log(a/b)
JavaScript を自ら学ぶ人のための質問スレッドです。
>>24-27のテンプレを読んだ上で質問してください。
■質問を書く上で
(1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。
(2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。
(ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など)
(3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。
(4) 常に自発的に調べる心構えを持ってください。
具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。
わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。
(5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。
(6) 出来るだけ「問題の事象が再現されること」を確認したサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。
(7) サンプルコードに HTML が含まれる場合は
http://validator.w3.org/ で [Check] してみてください。
(8) 質問を具体的かつ詳細に書くと回答を得られやすいです。
>>2の質問テンプレートを活用してみてください。
(9) ライブラリ関連の質問は禁止です。関連スレにあるライブラリ質問スレで質問して下さい。
(10) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。
■質問テンプレート
【環境】OS, ブラウザをバージョンと共に記入してください。(ex: IE8, Firefox4)
【何をしたのか】何をしたら問題の現象が発生するのか。再現手順を具体的に書いてください。
【エラーメッセージ】エラーメッセージがあれば正確に書き写してください。(Windows なら「コピット」を活用)
【期待する結果】最終的にどういう結果を望んでいるのか、を書いてください。
【サンプルコード】現象を再現可能な最小限のコードを書いてください。
1レスに収まらないならコード投稿サイトを利用してください。
http://jsdo.it/ http://jsbin.com/ http://jsfiddle.net/ http://ideone.com/
■主要FAQ (全部は
http://fiddle.jshell.net/vSqKr/33/show/ )
Q1. 別窓・フレーム内容やローカルファイルを読み書きしたいのですが…
A1. 別サーバのページやファイルの内容はセキュリティ制約でアクセス不可です。
Q2. document.write()でページ内容を追加したいのですが…
A2. 一度表示完了後にwriteするとページ内容が消去されます。DOM等別手段を。
Q3. table内容のinnerHTMLやDOMでの変更がうまく行かないのですが…
A3. IEではtable/tbody/trのinnerHTML書き換え不可です。DOMを使いますが、
DOMの場合tableの直下にはtbody要素が(作らなくても)あることに注意。
Q4. フォーム部品名を変数にした「...myform.変数名.value」が動きません…
A4. 「document.forms.myform.elements[変数名].value」でどぞ。
JavaScriptでは一般に「obj.x」と「obj['x']」は同じ意味です。
グローバル変数はwindowのプロパティなので「x」と「window['x']」も。
Q5. CSSで設定した背景色がe.style.backgroundColorで取得できないのですが…
A5. 取得には document.defaultView.getComputedStyle() を使う必要あり。
IEでは要素オブジェクトのプロパティcurrentStyleを使う。
Q6. setAttribute("class","foo")、setAttribute("onclick","bar()")が動きません…
A6. IEではそれは不可。「obj.className="foo"」「obj.onclick=bar」でどぞ。
Q7. タイマーやイベントハンドラに設定するコードにthisを含めたいのですが
「"...this..."」とか「function(){...this...}」ではうまく行きません。
A7. 実行時にthisが別のものを指してしまってる。以下のようにthisを束縛保存。
「function(x){return function(){...x...};}(this)」
Q8. input type="file"の値を設定(参照)できないのですが…
A8. セキュリティ制約のため設定は絶対に不可。参照はブラウザにより不可。
Q9. getElementById('ID名')や$('ID名')で要素が取れないのですが…
A9. コード実行時点でHTMLがそこまで読まれてない。window.onload 中でやるとか。
■諸注意
vol.115でlodashを不必要に推奨して啓蒙する行為が多く確認されており、ライブラリ系の質問はvol.116から禁止されました。
vol.115,116ではライブラリ禁止する発言が見られた直後にライブラリを許可する意図で次スレを立てる行為が確認されています。
本スレッドでライブラリ許可を求める発言が確認された場合は不要な争いを避ける為、スルーすることを推奨します。
ライブラリの質問はライブラリスレへ誘導し、誘導行為への反論はスルーしてください。
お疲れ
とりあえずお疲れ
30 :
Name_Not_Found:2014/11/01(土) 23:10:29.60 ID:0xdu+1aq BE:194272503-2BP(2000)
HTML5のdrag&drop機能との連携について質問です
下のような図になっていて
http://i.imgur.com/MWODR7N.png 要素をdrag&dropすることは出来ました
次にドラッグしてきた時に重なった下の要素を取得しようと思い四角い要素にondragoverの属性を付けてドラッグしてみましたが
(図で言うと上の枠からドラッグしてきて既にある赤い四角と重なった時に下の赤い四角を取得しようとした)
重ねるとドロップされるボックス自体の要素が返ってきました
四角い要素を取得するにはどうしたらいいのでしょうか?
31 :
Name_Not_Found:2014/11/01(土) 23:18:59.79 ID:0xdu+1aq BE:194272503-2BP(2000)
すいません書き方が間違っていただけでした
>>30 こんなサンプル見つけたよ。
http://cdn.liginc.co.jp/demo/2014/07/zuya/dd/index4.html 参考になるかな?
$(function() {
$(".dragDiv").draggable();
$( "#div3" ).droppable({
accept : ".dragDiv" , // 受け入れる要素を指定
drop : function(event , ui){
// dragされてきたオブジェクトを取得してクローン作製
var dragId = ui.draggable.attr("id");
if($(this).find(".drop" + dragId).length == 0){
$(this).append('<span class="drop' + dragId +'">' + ui.draggable.text() + 'が置かれたよ</span>');
}
} ,
out : function (event , ui){
var dragId = ui.draggable.attr("id");
$(this).find(".drop" + dragId).remove();
}
});
});
本スレ上げ
>>33 幼稚なことすんなゴミ
新陳代謝の低い板なんだからスレがえんえん残るだろボケ
テンプレなんて意味ないんだから立った順番に粛々と使っていけばいい
ここはvol22として利用する
ここは実質vol.22なのか
では、
>>33に移動しようか
(function(a){
})(a||a=[]);
こんな感じだったかよく覚えてないけど
括弧の中で代入してるコード見たことあるんですけど自分で描いてみたらエラーになりました
aっていうのが存在しなかったら[]を渡したい場合はどう書けばいいですか?
>>39 var a = a || [];
(function(a){
})(a);
spanをgetElementsByTagNameで取得して
obj.style.color = 'red'ってやってbodyに挿入したんですけど
この挿入した要素をquerySelectorで取得したいんですがdocument.querySelector('span[style="color: red"]')で取得できません
javascriptからstyleを設定しないで直接HTMLに<span style="color: red"></span>って書くと取得できました
どうやったらjavascriptでstyleを設定した要素をquerySelectorで取得できるかおしえてください
setAttribute使うのはなしでおねがいします
なかったらないでいいです
>>42-43 それは恐ろしく悪い実装だからお勧めしない
素直に class や id を使え
それは無理ですそういうコードを書いているWEBサービスを僕が使わせていただいている身で、便利にするブックマークレットを作りたいからです
そういえばJavaScriptでCSSを書き換えると自動的に値が変換されることがあるよな
elm.style.color = "#ff0000"; // => color: rgb(255, 0, 0);
elm.style.width = "0"; // => width: 0px;
elm.style.margin = "0 1px 0 1px"; // => margin: 0px 1px;
どういう風に変換するのかは、仕様で決まってるのかな?
それともブラウザが勝手に決めてるのだろうか
47 :
Name_Not_Found:2014/11/07(金) 23:25:25.62 ID:rGU/ECK3
>>39 (function(a){
})(a || []);
こうじゃねーの?
Uncaught ReferenceError: a is not defined
49 :
Name_Not_Found:2014/11/07(金) 23:30:59.88 ID:rGU/ECK3
じゃあこうだろw
(function(a){
})(window.a || []);
それでもいいけど、aがfalseyだったら思わぬことになるから
(function(a){
})("a" in window ? a : []);
がいいんじゃない?
>>39 関数外で宣言する必要がまるでない
(function(){
var a = a || [];
})();
>>45 では、面倒くさいが、
span[style="color:red"], span[style="color: red"], span[style="color : red"], span[style="color:#f00;"], span[style="color: #f00"]
のようにホワイトスペースやカンマの有無の全ての組み合わせを , 区切りで宣言しろ
ブラウザがstyle属性値をどのような書式で持つかは実装依存
ブラウザがバージョンアップして挙動が変更することも考えられるので必ず「全てのパターン」を宣言しろ
>>51 それだと関数内の var で a が新たに宣言されてしまうので不可
var a = "test";
(function(){
var a = a || []; // 関数外の宣言に関わらず [] が代入される
})();
>>53 "test" でも [] でも良い状況ってどんなケース?
[] で初期化するんだからオブジェクトを想定していたんだが
55 :
54:2014/11/08(土) 01:13:42.72 ID:???
あと、その条件なら普通にグローバルコードで宣言しろよ、と思うね
var a = a || [];
>>54 a = "test"じゃなくても{}でも[]でも同じこと
試せばわかる
>>56 なるほど、これでいいかね?
var a = [];
(function(){
var a = this.a || [];
}).call(this);
>>59 すまん、向こうで回答しなおしてきた
荒らすのもいい加減にして欲しい
>>42 document.querySelector('span[style="color: red;"]')
ただしこっちの方が安定的
Array.prototype.filter.call(document.querySelectorAll("span"), function(e){ return e.style.color == "red;" })[0]
62 :
Name_Not_Found:2014/11/08(土) 08:47:50.81 ID:6IP4Y34A
$('span').filter(function() { return this.style.color = 'red'})
querySelectorの第2引数の情報MDNに乗ってなかったよく知ってるな
65 :
Name_Not_Found:2014/11/08(土) 13:08:58.96 ID:YzcprxwW
荒らしの立てたスレだから荒らしだけが残ればいい
>>46 >どういう風に変換するのかは、仕様で決まってるのかな?
要素 element の element.style の戻り値が実装する
CSSStyleDeclaration インタフェースの
getPropertyValue() メソッドを呼び出したときの
戻り値の書式は CSSOM で決まってる。
(たぶんこれが element.style.xxx でアクセスしたとき得られる値だろう)
color の場合
"rgb(R, G, B)" (不透明度 1 の場合)または
"rgb(R, G, B, A)"
になる(R, G, B は10進数で A は小数、カンマの後はスペース)
element.style.color = ... で設定したときに element の style 属性にも
同じように反映されると考えるのが自然だが、仕様には書かれてないね
HTML 仕様にも style 属性のふるまいについて
www.w3.org/TR/css-style-attr/
を参照しているが
element.style.color = ... で値を設定したときについては
どうも書かれてないみたい
68 :
Name_Not_Found:2014/11/08(土) 14:06:35.92 ID:44JfXZ+T
> span[style="color : red"],
これだと、例えばbackgroudが定義された時
色は赤なのにマッチしなくなるぞ
69 :
Name_Not_Found:2014/11/08(土) 14:08:27.84 ID:44JfXZ+T
というかユーザースタイルシート(CSS)を書いてるのならともかく、
JavaScriptのコードを書いてるのにstyle属性をセレクタで
取得しようというのはセンスが悪いよ。
>>68 span[style="color: red"], span[style="color : red"], span[style="color :red"],
span[style^="color: red;"], span[style^="color : red;"], span[style^="color :red;"],
span[style^="color: red ;"], span[style^="color : red ;"], span[style^="color :red ;"],
span[style*=";color: red;"], span[style*=";color : red;"], span[style*=";color :red;"],
span[style*=";color: red ;"], span[style*=";color : red ;"], span[style*=";color :red ;"],
span[style$=";color: red;"], span[style$=";color : red;"], span[style$=";color :red"],
span[style$="; color: red;"], span[style$="; color : red;"], span[style$="; color :red"]
のように部分一致にすれば良い
これでも足りないが、ホワイトスペースの組み合わせを考えると、気が遠くなる
>>69 querySelector がナンセンスなのは同意だが、querySelectorでないと困ると駄々をこねるので
>>52で回答した
ComputedStyle を取るほうがまだマシだな
>70に付け加えるなら「color: #f00, color: #ff0000, color: red, color: rgb(255, 0, 0)」のパターンもある
ホワイトスペースや ; の組み合わせパターンも考えると、かなり大変だな
ナンセンスな実装には違いない
function abc(){
var result = aaaa();
result.ok = function(e){
〜
}
}
って書くのと
function ok(){
〜
}
function abc(){
var result = aaaa();
result.ok = ok;
}
}
って書くのどっちがメモリにやさしいですか?
前者はabc()を呼ぶたびに中の無名関数が生成されていってメモリの無駄になる気がするんですが
>>72 実際にベンチマーク取ればわかるだろ?
わからければ・・・・違いはないということさ。
なんかあっちはわざと?くだらない話ばかりして
グダグダしてるから、こっちにまともな答え書いておくわ。
Math.random() は0から1未満の数を返す。だから0にはなるが1.0にはならない。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/random > [0,1) 、……つまり、0 以上 1 未満の範囲で疑似乱数を返します。Java と同様に、現在時刻をシードとして乱数を生成します。
求めたい値が、0〜5であれば、0, 1, 2, 3, 4, 5 の6パターンなので
Math.floor(Math.random()*6)が正解。
Math.random()が1がでるのであれば、1×6 = 6になるが、
1未満を返すので6未満、つまり最大でも5.9999・・・の小数点切り捨てで5が最大になる。
0〜1未満を6倍すると以下のようになるから、計算上は公平になる。
Math.floor(0 〜 0.9999・・・) = 0
Math.floor(1 〜 1.9999・・・) = 1
Math.floor(2 〜 2.9999・・・) = 2
Math.floor(3 〜 3.9999・・・) = 3
Math.floor(4 〜 4.9999・・・) = 4
Math.floor(5 〜 5.9999・・・) = 5
Math.floor(Math.random()*6) - 1; だとrandom() = 0の時
Math.floor(0*6) - 1 = Math.floor(0) - 1 = -1 なので明らかに間違い。
75 :
Name_Not_Found:2014/11/08(土) 19:34:02.86 ID:CMgSWh8C
偽スレと本スレの格の違いがでたなw
76 :
Name_Not_Found:2014/11/08(土) 19:39:24.23 ID:/Hj0O7lg
>例えばさ、乱数が0.0から0.9まで出るとするじゃん
>そうすると
>0.0*6=0.0
>0.1*6=0.6
>0.2*6=1.2
>0.3*6=1.8
>0.4*6=2.4
>0.5*6=3.0
>0.6*6=3.6
>0.7*6=4.2
>0.8*6=4.8
>0.9*6=5.4
>になって偏りがでるよね
>実際には問題にならないだろうけど
>凄い気になる
ってのがあったんだけど、まあいいや
ありがとう
こっちもぐだぐだ感あふれてるわ
さっきはあっちのスレにたまたま人が多かっただけで何も変わらん
>>76 >例えばさ、乱数が0.0から0.9まで出るとするじゃん
それは精度が低い(小数点第一位で終わってる)から。
random()が浮動小数点数を返すのは
精度が高く無いと、数値をかけた時に狂うから。
例えば0〜5ではなく、0〜99の時は
Math.random()*100になるが
0.4 だと 40、0.5 だと 50。41〜49が出る確率は0になってしまう。
これが0.4〜0.5の間もちゃんとでるのであれば、
0.41*100 = 41、0.42*100 = 42 のようにちゃんとでてくれる。
random()が0〜1未満の浮動小数点数(なるべく小数点以下が多い数)を
返すのは、ある範囲の整数を返すときに必要な「任意の数をかける」時に
問題ないようにするためなんだよ。
君が言ってる隔たりの原因は精度が低いから。
>>77 なんで始まってからすぐグダグダになるんだよw
80 :
Name_Not_Found:2014/11/08(土) 19:50:31.28 ID:/Hj0O7lg
81 :
Name_Not_Found:2014/11/08(土) 19:53:36.68 ID:/Hj0O7lg
なんでこんなこと聞いてたかっていうと
以下のコードで円周率を計算しようと思ったんだけど
ちゃんとした数値が出なくて
どこがおかしいのか添削してくれ
凄い遠回りしてるのは、自覚してるので
出来れば大幅な改変は無しでお願いします
var arr = new Array();
for (m = -50; m < 51; m++) {
for (n = -50; n < 50; n++) {
arr.push([m, n]);
}
arr.push([m, n]);
}
function crd() {
var rdm = arr[Math.floor(Math.random() * 10201)];
return Math.pow(rdm[0], 2) + Math.pow(rdm[1], 2);
}
var j = 0;
for (i = 0; i < 100000; i++) {
if (crd() < 2500) {
j++;
}
}
document.write("π≒" + j * 4 / 100000);
> 0.2*6=1.2
> 0.3*6=1.8
> 0.4*6=2.4
> 0.5*6=3.0
ここだけを見ると2が出る確率が低いようだけど、実際は
0.00000 <= x < 0.16666… = 0
0.16666 <= x < 0.33333… = 1
0.33333 <= x < 0.5 = 2
0.5 <= x < 0.66666… = 3
になるから、どれも0.166666…ずつで、
ちょうど同じ数なんだよなね。
>>81 そのコードが何をやってるのかさっぱりわからんけど
(SQUEAKとかいうやつみたいだけど考えるの面倒くさいw)
以下のように数値変えたらそれっぽくなったよ。
何か計算間違ってるんじゃね? 点の取り方とか個数とか枝切の値とか
var arr = new Array();
for (m = 0; m < 1000; m++) {
for (n = 0; n < 1000; n++) {
arr.push([m, n]);
}
arr.push([m, n]);
}
function crd() {
var rdm = arr[Math.floor(Math.random() * 1000000)];
return Math.pow(rdm[0], 2) + Math.pow(rdm[1], 2);
}
var j = 0;
for (i = 0; i < 100000; i++) {
if (crd() < 1000000) {
j++;
}
}
console.log("π≒" + j * 4 / 100000);
>>81 初めから10201個の点の位置を決めている、というのがナンセンス
この時点で π の正確な値は出せない
極端な例で言うと、3x3の9個の点だと、中央の1点しか円の内側にないでしょ?
改善する方法は、点の位置を毎回ランダムに決めること
頑張れば100文字ぐらいでコード書けるよ
87 :
70:2014/11/08(土) 20:31:19.43 ID:knhGBN36
>>84 つまり、CSSOM 仕様準拠の実装なら
document.querySelector('span[style^="color: red;"], span[style*="; color: red;"]');
で
>>42の目的を達成できるわけか
勉強になった、ありがとう
88 :
Name_Not_Found:2014/11/08(土) 20:35:53.57 ID:/Hj0O7lg
89 :
Name_Not_Found:2014/11/08(土) 20:37:13.71 ID:/Hj0O7lg
>>86 10201個じゃ少ないってこと?
これだと上手くいく
var arr = new Array();
var j=0;
function f(){
return Math.pow(Math.random(),2);
}
for(i=0;i<10000000;i++){
if(f()+f()<1){
j++;
}
}
document.write("π≒"+j*4/10000000);
90 :
85:2014/11/08(土) 20:44:34.93 ID:???
> var arr = new Array();
> for (m = -50; m < 51; m++) {
> for (n = -50; n < 50; n++) {
> arr.push([m, n]);
> }
> arr.push([m, n]);
> }
50と51の違いも気持ち悪いが、ここを変えても変化はなかった。
2番目のarr.pushも気持ち悪いが、arr.length = 10201で
ランダムの最大とも一致するから間違ってないだろう。
> for (i = 0; i < 100000; i++) {
この100000はサンプル数だろう。単純に10倍したら結果も10倍になった。
j * 4 / 100000 の 100000と同じであれば数が多ければなんでも良さそうだ。
で最期に怪しかったのが、
> if (crd() < 2500) {
2500という数字で2500というのは50 * 50 だが
これは51 * 50 = 2550ではないのかね?
と思って変えてみたら、それらしくなったぞw
相変わらず数学的な意味はさっぱりわからんが(笑)
コードの一貫性における違和感のみからバグ取りしてみた。
91 :
86:2014/11/08(土) 20:46:12.07 ID:???
92 :
Name_Not_Found:2014/11/08(土) 21:44:59.37 ID:/Hj0O7lg
>>90 確かにその違和感は自分でも感じた
でも理論的には間違っていない・・・はず
円周率を求めると言う課題は89のコードでクリアしたから
あとは何故このコードが上手く動かないかだけ
すっきりしたい
半径50の円を描いていることになるから2500で
間違いないはずなんだけどな
少しそこんとこ突き詰めて考えてみるか
3.1454ってなるじゃん。ただの誤差だよ
94 :
Name_Not_Found:2014/11/09(日) 00:41:50.23 ID:BwBDaWrA
<<93
そうだな
こうしたら多少良くなったから
多分初期値が少なすぎたんだと思う
レス下さった皆さん有難う御座いました
var arr = new Array();
for (m = -500; m < 501; m++) {
for (n = -500; n < 500; n++) {
arr.push([m, n]);
}
arr.push([m, n]);
}
function crd() {
var rdm = arr[Math.floor(Math.random() * 1002001)];
return Math.pow(rdm[0], 2) + Math.pow(rdm[1], 2);
}
var j = 0;
for (i = 0; i < 100000; i++) {
if (crd() < 250000) {
j++;
}
}
document.write("π≒" + j * 4 / 100000);
>>94 これ、ループでランダムに要素をとる意味が全くないぞ
まずはプログラミングじゃなくて数学の勉強しろ
96 :
Name_Not_Found:2014/11/09(日) 08:55:16.54 ID:BwBDaWrA
>>95 こういうこと?
var j=0;
function f(){
return Math.pow(Math.random(),2);
}
for(i=0;i<10000000;i++){
if(f()+f()<1){
j++;
}
}
document.write("π≒"+j*4/10000000);
97 :
Name_Not_Found:2014/11/09(日) 09:10:59.68 ID:BwBDaWrA
総当り法ってことかな
いまだにinnerHTML使ってる奴見ると吐き気がする
場合によると思うけどね
jQueryにも使われてるし、仕様に書かれているくらいだし
意味不明
innerHTMLは普通に使っていいっていう結論が出たはずだが?
>>100 なにいってんのjQueryもメインはremoveChildで消してるんだけど
だいたいベンチ取ればinnerHTMLが猛烈に遅いのは分かることだろ
適材適所
原理主義はアホ
っていう結論になったはずだが?
適材適所ってなんだよ遅くて非効率なものを使う必要はねえんだよ
106 :
Name_Not_Found:2014/11/09(日) 12:36:22.89 ID:1ma5/uRs
>>103 > だいたいベンチ取ればinnerHTMLが猛烈に遅いのは分かることだろ
速かったよ。
一見文字列を解釈する必要がある分時間がかかるから
不思議に思えるが、JavaScriptがネイティブでないのが原因。
innerHTMLだと、代入した後は
すべてネイティブで処理されるから早いが、
それと同等なことをネイティブでないJavaScriptでやると
1つずつオーバーヘッドが加わる。
あとさすがにブラウザ、HTMLテキストを解釈するのが仕事だけあって
相当チューニングされてる。
一度に代入できるのに遅いわけないだろw
>>103 遅くなるのは
innerHTML += string
を繰り返す場合だけだと思うが
これは前に挿入されたHTMLの構文解析を重複して繰り返す
ことに他ならない。遅くなるのは当然でベンチマークとして不公平
純粋な意味で innerHTML が劇的に遅いとされるベンチマーク結果はあるの?
遅くないって逝ってた奴出てこいよ
innerHTMLが敬遠されるのは速さじゃなくてXSS問題の方が大きいと思う
>>96がinnerHTMLを使ったコードだったら、>>07は吐き気を覚えるのだろう
初心者がinnerHTMLが1番って結論を出したらそれがこのスレの総意のように扱うな
innerHTML推し派はDOM XSSとか知らない
両者の長所短所を知っている人ならば、どっちか片方だけがいいだなんて言わない
いいえ、innerHTMLはデメリットしかない
XSS問題はinnerHTMLが抱える根幹の問題
XSSの発生しない方法があるなら、セキュリティ意識の高い人はinnerHTML以外を選択する
XSSに目をつぶるとしても、textContent, TextNode#data, insertAdjacentHTML に言及されるべきなのだが、既に>101で語り尽くされてる
>>116 DOM追加でinnerHTML使ったらXSSが発生するよ?
< と > をエスケープすればいいだけじゃん
appendChildがわざわざエスケープしてくれるのに手動でやるのか?
おっと、appendChildがエスケープって語弊があるな
手動ですればいいじゃん
innerHTMLの大きな問題点はXSSじゃない
はあ?
innerHTMLの問題はXSS以外にもあるが、既に
>>101で議論されたので改めて議論する事もない
125 :
Name_Not_Found:2014/11/09(日) 18:33:06.53 ID:DNSyM79S
>>118 > DOM追加でinnerHTML使ったらXSSが発生するよ?
なら、XSSが発生しないように
チェックすればいいだけじゃないの?
>>125 テキストノード操作すればチェックする必要がない
故にチェックミスも発生しない
>>125 テキストノード操作すればチェックする必要もない
innerHTMLはXSSが問題だと言っている人は、innerHTMLを使ってはいけないっていう主張なの?
遅くてDOMを壊す恐れがあるものを使う必要はない
ふーんじゃあjQueryも使わないんだね
jQueryを立てにして逃げんなよ
お前の言葉で反論どうぞチキン
jQueryは使わないって言えばいいだけなのに、なんで煽るんだろうね
自分の言葉で考えたことを述べましょう
例えば elm に <p id="a" class="b" style="color:red;">test<b>test</b>test</p> を入れたいと思ったらどうします?
innerHTML なら一行で済みます。十分大きな利点です
このコードも innerHTML を使わずに書くというのなら、私の負けです。毎日仏壇に掲げて尊敬します
基本的にjQueryでもinnerHTMLを利用しているAPIは使わない
使わなくて困ったことがない
>>134 > 例えば elm に <p id="a" class="b" style="color:red;">test<b>test</b>test</p> を入れたいと思ったらどうします?
まず、JavaScriptコード内にコンテンツを埋め込むという設計があり得ないから、そういうコードがあるなら設計から見直す
HTML上に用意されているコンテンツをJavaScriptで改変するのが基本
外部コンテンツを利用する場合は XML, CSV, JSON 等の整形フォーマット化されたデータをJavaScriptで取得して一定規則に則った方法でHTML出力する
137 :
136:2014/11/09(日) 19:42:37.16 ID:EDVOS3A9
これらを実装する時には innerHTML は使わない
createTextNode, createElement, appendChild 等のDOM操作を使う
138 :
134:2014/11/09(日) 20:07:11.50 ID:???
確かに。言われてみればそうですね
innerHTMLを使うこと自体は問題ないけど、そもそも使う機会がないですし、使うような設計は見直すべきですね
大変失礼しました。今から仏壇に掲げてきます
>>136 >XML, CSV, JSON 等の整形フォーマット化されたデータを
コード内に埋め込むかどうかは別として
HTML 自体も整形フォーマット化されたデータなので
外部から取得したHTMLデータをinnerHTMLで直接的に放り込むことは
ありだと思うよ
140 :
136:2014/11/09(日) 21:50:57.54 ID:EDVOS3A9
>>139 > HTML 自体も整形フォーマット化されたデータなので
ここでいう整形フォーマットとはデータフォーマットを指し、次の効果を期待する
- 他のフォーマットに容易に変換できる
- JavaScriptで解析できる
- DOMとして再構築できる
例えば、2列のCSVフォーマットがあるなら、Excelで編集可能な上にJavaScriptからdl要素、table要素として出力可能だろう
データはシンプルでなければならないし、JavaScriptで出力する時に様々な形式で出力可能な事を期待する
HTMLは論理構造といわれるが、データ構造としては余計な要素が多すぎる
table要素は比較的データ構造として使えるが、2次元データなら CSV, JSON の方が容易に扱えるだろう
DOM操作前提ならXMLの方が拡張性が高い
HTML Templatesが普及すれば万事解決
142 :
Name_Not_Found:2014/11/09(日) 22:15:30.68 ID:EDVOS3A9
>>141 テンプレートHTMLは現状、JavaScriptでincludeするのは筋が悪い
もし、そういう意味で innerHTML を使用しているのならサーバサイドに任せるべきだ
>>142 あ、HTML Templatesっていうのは、HTML5のtemplate要素のことね
144 :
Name_Not_Found:2014/11/09(日) 22:32:31.81 ID:EDVOS3A9
すまん俺は141や143でがあるが139ではない
146 :
Name_Not_Found:2014/11/09(日) 22:51:12.56 ID:DNSyM79S
また意味もなくinnerHTMLはXSSが起きるって
言ってる奴いるのか?
XSSが起きる条件わかってないだろ。
外部から渡された任意のHTMLを処理するときだけだぞ。
ここまで言えば、まずありえない話だって気づくよな?
反論したいなら、具体的に起きる条件を書いて反論してくれよな。
外部ってなんのこと?
148 :
Name_Not_Found:2014/11/09(日) 22:56:09.37 ID:DNSyM79S
>>147 どんなデータが来るのかを
知ることが不可能なもののこと
例えばユーザーが入力するデータは
知ることが不可能。
じゃあ内部は?
150 :
Name_Not_Found:2014/11/09(日) 23:00:55.60 ID:DNSyM79S
>>149 内部は自分で書いたコード
例えば、自分で、HTMLに
<script>document.write('
http://example.com/?' + document.cookie')</scrpt>
って書いたら、cookieの内容が外部サイトに漏れて危険じゃないですか。
document.writeは危険です!っていう馬鹿はいないだろう?
151 :
Name_Not_Found:2014/11/09(日) 23:02:24.95 ID:DNSyM79S
152 :
Name_Not_Found:2014/11/09(日) 23:10:53.11 ID:DNSyM79S
>>144 > HTMLにコンテンツを持ってくるのは良いとして、この使い方ではHTMLとJavaScriptで依存関係が出来てしまって管理しづらいと思うのだが
物による。
処理がJavaScriptだけで完結するようなものは、JavaScriptで生成して良い。
例えば、OKボタンだけのalertや、入力項目があるだけのconfirmの
代わりとなるダイアログライブラリとかね。
でも、任意のHTMLの内容をダイアログにだす。なんてものは
JavaScriptだけでできないので、こういうのはtemplate要素を使った方がいい。
というかそういうことをするためにtemplate要素がある。
「テンプレートの内容が引数になる場合」と考えればいい。
なお、外部から渡されるHTMLではない場合、
XSSは発生しないので、innerHTMLを使うとシンプルで分かりやすくなる。
> そうするぐらいならJavaScript側でtemplateとなる要素ノードを生成して cloneNode で使いまわす方がシンプルで汎用性が
つまり「JavaScript側でtemplateとなる要素ノードを生成」するときにHTMLで
var html = '<table><tr><td>なんとか</td></tr></table>'; みたいに書いて要素ノードを生成すると
わかりやすいだろう? これだけのものがたった一行で書けたしね。
153 :
Name_Not_Found:2014/11/09(日) 23:20:29.85 ID:DNSyM79S
本質はHTML断片をHTMLに置きたいか
JavaScriptに置きたいかってことなんだよな。
HTMLに置きたいならば、template要素。
JavaScriptに置きたいならば、・・・ヒアドキュメントが欲しい。
工夫次第でヒアドキュメントっぽいことができるのは知ってるけどね。
154 :
136:2014/11/09(日) 23:33:25.23 ID:EDVOS3A9
>>152 少なくとも私の運用法ではtemplate要素にメリットは感じなかった
既存のHTML改変ならtemplate要素を使う必要がないし、外部データからDOMを起こすならノード管理するほうが便利
innerHTML を利用したい場面は見つからなかった
> でも、任意のHTMLの内容をダイアログにだす。なんてものは
> JavaScriptだけでできないので、こういうのはtemplate要素を使った方がいい。
「ダイアログ」の定義が不明だが、HTMLで出来ているのならノード操作だけで十分に完結できる
後は元となるデータをどこから引っ張るかによるのだが、いずれにしてもデータを取得してDOMを構築する手法は何も変わらない
155 :
Name_Not_Found:2014/11/09(日) 23:37:15.63 ID:DNSyM79S
> HTMLで出来ているのならノード操作だけで十分に完結できる
完結できるかどうかではなく、
重要なのはシンプルに完結できるかどうかだ。
その点が見えてないと、コードはムダに複雑になるばかりだぞ。
156 :
136:2014/11/09(日) 23:39:29.59 ID:EDVOS3A9
>>153 > 本質はHTML断片をHTMLに置きたいか
> JavaScriptに置きたいかってことなんだよな。
私に言わせれば、そこは本質じゃない
そもそも、HTML断片で管理せず、データで管理する
HTMLはデータとしては余計な情報が多い
157 :
Name_Not_Found:2014/11/09(日) 23:42:00.54 ID:DNSyM79S
>>156 今話をしているのは、データではない。
"単純にHTMLに変換するデータ" だ
データだけ書いてそれをHTMLに変換するなら
そんな無駄な作業は無くして直接HTMLを生成したほうが
わかりやすい。
反論したいなら、
var html = '<table><tr><td>なんとか</td></tr></table>'
任意の要素.innerHTML = html;
これをシンプルに書いて見せてみ。
158 :
136:2014/11/09(日) 23:46:17.30 ID:EDVOS3A9
159 :
Name_Not_Found:2014/11/09(日) 23:47:25.99 ID:DNSyM79S
>>158 なんで「俺はしない」が反論になると思ってんの?
お前がどうとか関係ねーよ。
innerHTMLをコードで書いたら
シンプルに出来ないだろう?
160 :
Name_Not_Found:2014/11/09(日) 23:54:59.86 ID:EDVOS3A9
>>159 使う必要がないのだから使わない
やろうとしていることがナンセンスなのだから仕方ないだろう
例えば、「CSSを使わずに段組レイアウトしてみて、tableレイアウトでないと出来ないでしょ?」といっても誰も納得しないだろう
161 :
Name_Not_Found:2014/11/09(日) 23:59:08.50 ID:DNSyM79S
>>168 たとえが意味不明。
JavaScriptでHTML(要素ノード)を生成するのが前提の話だろ?
> そうするぐらいならJavaScript側でtemplateとなる要素ノードを生成して
ほらそう書いてある。
わざわざグダグダなコード書いてHTMLを生成するなら
最初からHTMLを書いたほうが楽。
レベルの違う者同士の不毛な言い争い
163 :
Name_Not_Found:2014/11/10(月) 00:08:07.72 ID:vE07iE/R
仕方ないよ。template要素がなぜ必要とされて
作られたのか?も理解できてないんだから。
俺なんか、ウェブの新しい技術を聞くたびに
あー、やっとそれができたんだねって
思うぐらいなんだから。
出来てから、それが必要とされた理由を理解する者と
必要な理由がわかっていて、出来るのを待ってる者の違いさ。
>>159 シンプルに書けるかどうかはパフォーマンスとは全く関係ないよね
165 :
136:2014/11/10(月) 00:16:26.51 ID:9HdTHaj2
よくある間違いとしてはJavaScriptで何でもかんでも要素を生成して出力するやり方
まず、JavaScriptがなくても動作するようにするのが前提としてあるので、JavaScriptで後付する機能の為のコンテンツはHTMLに用意してある場合がほとんど
その場合は既存DOMから必要なデータを抽出してDOMを再構築するだけでいい
あくまで再構築なので innerHTML で上書きせず、ノード管理で変更箇所は最小限に抑える
データがHTML上に存在しないなら外部データを利用することになる
例えば、二次元データをtable出力したい場合はCSVファイルをJavaScriptでパースし、table要素ノードを生成してappendChildする
こうすることでCSVファイルを編集すれば出力されるtable要素にも反映されるようになる
JavaScriptのコードを書き換えれば、table要素でなく、別の要素にする事も出来るし、出力する形式は自由に変更できる
<table> を innerHTML で出力しても実現できるが、csvファイルを基にした方がデータを容易に編集可能だし、csvファイルはシンプルなフォーマットなので別のフォーマットにも容易に変換できる
CSVのパースが複雑だとか、DOMでcreateElementが面倒くさい、とかは大した問題じゃない
データは可搬性が高い方が良いし、データからDOMへの変換処理は安全性/汎用性が高い方が良い
汎用性が高ければ高い程、出力されるDOMの自由度が上がる
保守性、管理性、拡張性もろもろを考えるとHTML断片を扱うよりシンプルなデータから扱ったほうが合理的
>>162 忠告ありがとう
この辺にしておく
166 :
Name_Not_Found:2014/11/10(月) 00:24:04.20 ID:vE07iE/R
>>164 > シンプルに書けるかどうかはパフォーマンスとは全く関係ないよね
innerHTMLだと、シンプルかつパフォーマンスがいいからね。
確かにシンプルとパフォーマンスは全く関係ないけど
167 :
Name_Not_Found:2014/11/10(月) 00:25:02.54 ID:vE07iE/R
>>165 えっと、JavaScript製のテンプレートエンジンの
存在意義もわからない?
そっかぁ。その程度のレベルなんだね。
下らない煽りが多くてうんざり
IDが出ているだけマシか
169 :
Name_Not_Found:2014/11/10(月) 00:32:39.34 ID:vE07iE/R
ID出しておくと便利で、うざいやつからの反論が無くなるんだよね。
だからワンサイドゲームになるw
彼は自己愛性パーソナリティ障害に該当するように見えた
内向的な人は大なり小なりその傾向があるが、流石に酷いな
× 反論が無くなる
○ 呆れて無視される
>>166 逆、innerHTMLのパフォーマンスはよくない
173 :
Name_Not_Found:2014/11/10(月) 00:58:02.62 ID:vE07iE/R
>>171 無視でもなんでもいいわw
言い返さないのなら結構。
それが他の人にどう見えるかが重要なのだから。
174 :
Name_Not_Found:2014/11/10(月) 01:01:07.36 ID:vE07iE/R
>>172 じゃあ、パフォーマンスについてはそれでいいよ。
それで本題。シンプルかどうかで言えば、
シンプルだろ?
議論スレではないのだが…
どのスクリプトエンジンのどのリリースのことなのやら
> それが他の人にどう見えるかが重要なのだから。
最後まで残った人が正しいように見える、と思ってるんだろうな
ID:vE07iE/R を読み返してもそう思えるなら重症
177 :
Name_Not_Found:2014/11/10(月) 01:24:16.93 ID:vE07iE/R
>>176 誰もあんたの意見なんて聞いてないんだよ。
大丈夫
誰も ID:vE07iE/R の意見を聞いてないから、気にするな
179 :
Name_Not_Found:2014/11/10(月) 01:26:52.27 ID:vE07iE/R
気にしてるからレスしてんだろw
嫌ならなんで無視できないのか?
もちろん気にしているならレスしても
構わないがねw
180 :
Name_Not_Found:2014/11/10(月) 01:36:14.97 ID:vE07iE/R
>>165 template要素を使うよくある例がAjaxだね。
Ajaxを使ってデータだけ取ってくる。
そのデータを元にHTMLを生成する。
当然ながらAjaxを使う以上、JavaScriptを使うことになる。
それを加工して表示する。
例えばテーブルのHTMLの一部を加工するなど。
そういった時、JavaScriptは加工するということは知っていても
どのようなマークアップにするかはHTMLしだい。
テーブルの ”一部" ということから推測できるように
その他の部分はHTMLで書かれており、それはJavaScriptはしらない。
どういったマークアップにするかはHTMLできめることなので、
HTMLにテンプレートとして用意しておき、JavaScriptでは
その一部だけ値を入れ込む。
これにより、HTMLとJavaScriptが綺麗に分離される。
181 :
Name_Not_Found:2014/11/10(月) 01:43:36.62 ID:vE07iE/R
CSVデータからテーブルを生成する話も同じ。
<table>
<tr><td>name1</td><td>value1</td></tr>
<tr><td>name2</td><td>value2</td></tr>
<tr><td>name3</td><td>value3</td></tr>
</table>
こういうものをDOM命令で作るのは馬鹿らしい。
createElementでtableを作ってtrを作ってtdを作ってappendして。
何をやってるのかさっぱりわからなくなる。
更にtableやtrやtdに属性を付けられるようにしたいとかなると、
テーブルを生成する命令に、いろんなパラメータを渡さなくければいけなくなる。
デザイナーが「このtableにとあるclassを付けたいんですけど」って言ったら
JavaScriptを修正しなくてはいけなくなる。
HTMLとJavaScriptが密接に結合してしまってるからね。
こういう時はテンプレートを使って、デザイナーが作成したHTMLの断片に
JavaScriptはプレースホルダに値を埋めるだけにするとシンプルに書くことが出来る。
もちろんHTMLだから自由にclassを設定したり出来る。
182 :
Name_Not_Found:2014/11/10(月) 01:45:42.59 ID:vE07iE/R
>>165で
> JavaScriptのコードを書き換えれば、table要素でなく、別の要素にする事も出来るし、
なんて言ってるけど、よく見ればわかるよね。
JavaScriptのコードを書き換える必要があるって書いてある。
テンプレートを使うと、JavaScriptとHTMLは完全に分離されているから、
JavaScriptを一切変更しなくても、table要素ではなく、別の要素にすることも出来る。
HTML、つまりマークアップを書く人が、自分の好み通りの
マークアップを書くことが出来る。これが分離というもの。
>>181 > createElementでtableを作ってtrを作ってtdを作ってappendして。
> 何をやってるのかさっぱりわからなくなる。
この程度でわからなくなるレベルか
innetHTMLの話はどこへいった?
都合が悪くなってtemplate要素に鞍替えか?
>>182 よくわかんないんだけど、HTMLのコーダーでJavaScriptを知らない人っているの?
そもそも、表示を変えたければ、HTMLだろうがJavaScriptだろうが、
何かしらか変更しなきゃいけないんだから、
そんなのはプロジェクトのコーディング基準で決めればいいだけの話しで、
勝手に好みでコーダーがいじったら大問題だとおもうが。
innerHTMLってevalのDOM版のようなものだよなw
evalをどのような場面で使うかというのと似たようなものw
>>185 コーダーって、HTML,CSSだけでしょ?
JavaScriptはプログラマーだよ
JSのクラスは、一般的な静的に派生させるクラスではなく、
動的なプロトタイプ型のクラス
こんなややこしいものを、
簡単にプログラミングできないでしょ?
変数に、var を付けずに、また、"use strict"も付けずに、
プログラムしている人も多いんじゃないの?
>>187 JavaScriptプログラマならブロトタイプを理解できて当然
ただし、table操作にブロトタイプを理解する必要はない
Strict Modeも全く関係ない
最新のjQueryのソース見たけど、初期化の時点でinnerHTMLが5回使われてるね
どのAPIを使うかなんて関係なく、innerHTMLを否応なく使わされているわけだ
jQueryが使われてれば安全なの?
191 :
189:2014/11/10(月) 11:49:17.09 ID:???
いや、innerHTMLを毛嫌いしている人がいるみたいだから教えてあげただけだ
ここでの話とjQueryで使われているのは何か関係あるの?
193 :
189:2014/11/10(月) 11:52:09.54 ID:???
>>135で誤ったことを言っているから正しいことを言っただけだ
自分に関係ないのなら俺のレスは無視していい
まさかjquery使っていてinnnerHTML否定してる奴はいないよな?
jQueryが使ってるからinnerHTMLを使っていいという理屈はからは何の知見も生まれないことに気付こうな
196 :
189:2014/11/10(月) 12:17:00.14 ID:???
>>195 俺はそんなこと言ってないってw
innerHTMLが嫌いな人でjQueryを使っている人がいた(
>>135)から教えただけ
もし他にもそういう人がいたら、jQueryを使うのをやめるか、あるいは自分で書き換えるといいと思う
innerHTML使わない(キリッ
でもjqueryは使ってる←低脳w
その個人攻撃には何の生産性も感じられないからいい加減に自重しろ
jQuery使ってるのにinnerHTML否定した馬鹿が顔真っ赤になって必死だな
率直にいってjQueryには好ましくない実装が結構あるからねえ
innerHTMLに限らず、使う必要性はあまり感じないね
便利なプラグインがあって自分で作る手間を省きたい時に使うぐらいかな
大抵自分で作ろうとするし、jQueryがなくても困らないだろうね
「どうせおまえもjQueryがなかったら困るんだろ?」はただの思考停止の信者発言だし、問題の本質から論点をずらして逃げてるだけ
まともな議論にもなりそうにないね
jQueryが2つ以上のファイル構成なら多くの人が使ってなかっただろう
スタンスの問題では?
コード記述の便利さを取るか、コード実行の最適化を図るか
innerHTMLを毛嫌いするのに正当な理由がないから
jQueryで使っていても何の問題もないんだが。
明日太陽が昇らないかもって
心配しているようなもん。
うーん? innerHTMLを根拠なく否定しているやつが
馬鹿というのが大前提なんだが、それわかってる?
そこから説明しないといかんの?
innerHTMLを否定する理由はないという
コンセンサスは得られているかな?
>>205 スタンスで間違ってないと思うけど、衝突の原因はそこじゃないんだよね
相手を打ち負かす目的で発言している人とは論理的に議論できる気がしないよ
うちの上司は、すぐに、エビデンス!とかフィージビリティ!とか逆に!とか言う。
と思っていたら、気が付いたら自分も言うようになってた。
>>207 「逆に!」だけ別次元の何かを感じさせるな
根拠はもう出てるだろ
innerHTMLはDOMを壊す恐れがあるから使うなっ!
innerHTMLを使ったらダメという根拠は、
代入するHTMLに<script>タグが含まれていたらXSSが起きるから
逆に言えば、innerHTMLに<script>タグが含まれることがないと
保証されているなら使っていい。
ここまでは同意とれてるよね?
ユーザーが入力した値をinnerHTMLで
代入するときは気をつけないといけないが、
プログラマが書いた文字列を代入するだけなら
安全だから問題ないんだよ。
最低限これぐらいは理解してから会話に参加してくれ。
人的ミスがないとは言い切れない
そうなるとサーバサイドで文字列を無害化しなくていいって言ってるるようなもんだね
echo htmlspecialchars($s, ENT_QUOTES, 'utf-8');はしなくていい
ehoc $s;でいいみたいなことをいってるんだね
>>211 他にも問題があるけどいくらいっても理解されないようだからもういい
>>214 人為ミスを起こすという話をすると、
createElement('script')って書いたら、
script実行できちゃうから、
createElementも使ったらダメってことになるけどいいの?
>>101を全く理解してないからXSSだけとか適当な事をいうんだろう
>>215 おいおい、話が全く違うだろう。
その例で言うのなら
echo 'aaa' は危険だから
echo htmlspecialchars('aaa', ENT_QUOTES, 'utf-8'); って書けって言っているようなもんだよ。
違いわかる? ユーザーの入力値がはいった変数じゃないんだ。
プログラマが入れた固定の文字列。
だから安全なんだよ。
echo はミスをするとXSSを起こす。
だからechoを使うな!
↑
え?w
innerHTML はミスをするとXSSを起こす。
だから innerHTML を使うな!
↑
え?w
>>217 >>214はヒューマンエラーでXSS問題が起きるリスクを回避する話をしているのだと思うが
趣旨を理解しない意見で煙に巻くのがお得意のようだな
>>223 だから、ヒューマンエラーが起きるって話をするならば、
echo は使っちゃダメってことですよね?
script 要素に appendChild() とかやったらどうなる?
いつからバグをヒューマンエラーっていうようになったの?
バグをしたら脆弱性が起きるような命令は使ったらダメというのなら
プログラム書けないだろ。
ファイルを削除するdeleteは、バグがあったら
全ファイル消えるから使っちゃダメとか?w
>>224 echoなど知らん
相変わらず、煙に巻くのが得意だな
>>225 > script 要素に appendChild() とかやったらどうなる?
そりゃ、そういうコードを書く奴が悪いというのは誰もが認めると思うが
ヒューマンエラーで「間違ってappendChild しちゃいました」なんて事が起こりうると思っているのか?
>>226 ヒューマンエラーでバグが発生するという理屈も分からないのか
原因と結果を切り分けて考えることも出来ないのか
>>228 いや、単純にscript要素に子要素ノードとか作れてしまうのか
と思って聞いてみたのだが
> 「間違ってappendChild しちゃいました」
例えば script 要素に id が振られていて、
間違ってその id で getElementById で要素を取得して
appendChild するようなことはあり得るかもしれない
>>219 え?固定された文字列でもサニタイズしないとかありえませんよ?
>>230 > 例えば script 要素に id が振られていて、
> 間違ってその id で getElementById で要素を取得して
> appendChild するようなことはあり得るかもしれない
それは appendChild 以前の問題だ
それを認めるなら「間違って innerHTML しちゃいました」も起こりうるのだから
期待しなかった場所に appendChild されたのならデバッグ時に気がつくはずだし、気が付くべきだ
(気が付かなかったのならデバッグが足りない)
XSSの厄介なところは事象が発生しなければ問題にはならないという事だ
ヒューマンエラーでXSSが発生しているのなら意図的にXSSを発生しようとしなければ発見できないだろう
「間違ってappendChildしちゃいました」とは根本的に違う
> それを認めるなら「間違って innerHTML しちゃいました」も起こりうるのだから
ちなみに「間違って innerHTML しちゃいました」の方が想定されるリスクは大きい
script要素でなくてもXSSが起こりうるからな
ヒューマンエラーはありとあらゆるセキュリティホールの可能性があるから超危険だ
人間はプログラムを書くべきではないな
だったらプログラムを書くコンピュータを作ろう
しかしそのコンピューターのプログラムは誰が書こうか
>>231 あほだろ。
固定の文字列に対してエスケープする意味は無い。
固定の文字列をechoする時にエスケープしなくていいのは
リスクが0だから。
同様に固定の文字列。innerHTML = '<span>abc</span>'とか
XSSになりようがない。つまりリスク0だから何の問題もない。
リスクが0なのに、そのリスクがどうとか言うのは
リスク管理じゃなくて、単なる過保護。
間違って innerHTML しちゃっても問題は起きない。
なぜなら、appendChildしちゃいましたと同じだから。
appendChildしても、scriptと入れない限り大丈夫なように
inenrHTMLをscriptを入れない限り大丈夫。
この説明で同じだってことがよくわかったと思うがね。
過保護パターンみたいな名前のアンチパターンありそうだなw
例えば、if (a > 0 and a !== 0) みたいに
明らかにやる必要がないのに、念のためとかいって
やる初心者がいるんだよねw
こういうのは、コードがどう動くか
わかってないから。
>>238 appendChild と innerHTML が同じ?
チェックミスが起きるからヒューマンエラーなんだがな
appendChild と innerHTML を同一視するとか、リスクの規模を測る目を持たない人がいう事は違うな
>>240 はい。同じです。
固定値をinnerHTMLに入れている限りXSSは起きません。
逆に、appendChildの値をユーザーーが入力可能だとXSS起きる可能性があります。
echoも同じです。固定値ならばXSSは起きません。
違い、分かりますか? 変数の内容がユーザーが入れられるかどうかです。
エンドユーザーが入れられるなら、XSSは起きる可能性がありますが、
固定値を入れている限りXSSは起きません。
絶対に起きません。
>>241 チェックミスって何のチェックですか?
コードにバグがないかチェックしないんですか?
まさにこれなんだよね。
echoをミスするとXSS起きるから、
echoを使うなっていう馬鹿はいない。
221 名前:Name_Not_Found[sage] 投稿日:2014/11/10(月) 21:57:31.58 ID:???
echo はミスをするとXSSを起こす。
だからechoを使うな!
↑
え?w
222 名前:Name_Not_Found[sage] 投稿日:2014/11/10(月) 21:58:21.95 ID:???
innerHTML はミスをするとXSSを起こす。
だから innerHTML を使うな!
↑
え?w
>>243 バグがあったら脆弱性になるだよ。
あっ! innerHTML使って、しかも間違って
代入するテキストにscriptタグを書いてしまった!
どんだけありえない話だよwwww
innerHTML使うだけじゃ何の問題も起きないからね。
innerHTMLを使ってなおかつ、ありえない条件を満たさない限りXSSは起きない。
プロなら過保護はやめろよw
いつまでも補助輪付けて
競輪に出場してるんじゃねーよw
>>247 お前がやったことないだろ。
はい論破w
こういう喩え話思いついたわw
あるプログラマが、echo '<p>ほげほげ</p>'というコードを書いていました。
もう一人の知障プログラマがエスケープしろ!固定値でもエスケープしろ!っと喚いて
すべてのプログラムをこう書き換えました。
echo htmlspecialchars('<p>ほげほげ</p>', ENT_QUOTES, 'utf-8');
大損害を与えたため知障プログラマは会社を首になりましたwww
ところどころ全然的を得てない例を出してる人は流れの邪魔
まずエスケープする所は、ユーザーが入力した文字。
固定値はエスケープしないで出力しても安全。
これがサーバーサイドの常識。
クライアントサイドでも同じで、
innerHTMLに固定値を代入するときは
何の問題も起きない。リスクもない。
全然常識じゃない
お前が意味のないコード書いてるだけ。
意味があることだけやれや
過保護やろう
ママーこわいよ。ヒューマンエラー怖いよー
リスクがー、リスクがー。
バグかいても、動くコードかいてー
リスクゼロじゃなきゃだー
innerHTMLに代入する文字が
固定の文字列ならリスクゼロだよw
たぶん「固定の文字列」がわからないんだよ
>>255 innerHTMLを選択する理由もゼロになるな
innerHTML君はいい加減、黙ってくれないかな
言いたいことは全ていっただろうに、いつまで続けるというのか
>>257 コードがシンプルになるよ。
innerHTML = '<table id="tbl"><tr><td class="first">なんとか</td></tr></table>';
これをinnerHTMLを使わないで書こうとすると
複雑になるからね。つまりコストが掛かってバグを起こすリスク(笑)が高くなる。
>>256 なるほど。固定の文字列がわからないのか。
上の、'<table>〜</table>'のことだよ。
値が変わらないからXSSが起きるリスクがない
>>258 > いつまで続けるというのか
え? それ言っておかないとダメ?
反論する人がいる限り叩き潰しに来るし、
この話題が出るたびに再登場するよ。
ちゃんと、いつまで続けるか言ったので
今度から聞かないでね。
innerHTML = '<table id="tbl"><tr><td class="first">なんとか</td></tr></table>';
と書こうとして、ちょっと眠くてうっかりして手が滑って
innerHTML = '<table id="tbl"><tr><td class="first"><script>alert(1)</script>なんとか</td></tr></table>';
って書いてしまったらどうするんだ!
ねーよw
なんとかの部分を可変にしてほしいという変更依頼があったらどうする?
ここまで低次元だという事がないな
>>262 エスケープする。サーバーサイドの常識(笑)だろ
エスケープするの忘れるかもしれないから
echo禁止。ユーザーが入力したものを表示するの禁止。
変更依頼があって、そこからやるのか…
>>263 それだけ過保護が多いんだろ。
うちの会社は馬鹿ばかりだから規則を守れ。
理由は考えるなお前らはただ規則を何も考えずに守ってればいいんだ。
>>266 何か問題?
低次元の人は何考えてるのかわからんので、
ちゃんと書こうね。
>>215あたりがこいつの考えの根底にあるものか
テキスト操作に拘り過ぎてDOMの概念がないんだな
>>267 理由を理解できないおまえにいわれたくないわ
>>264 ネタだと思ってたらお前は絶対にサーバサイドでコード書かないほうがいいよ
>>268 依頼がなくても最初から全部エスケープしていればいいだろ
innerHTML = escapeHTML('<table id="tbl"><tr><td class="first">なんとか</td></tr></table>');
ドヤッ!
>>270 みんなお前が馬鹿だってわかってるから
もうやめたら?w
>>271 へー。あんたエスケープしないんだ?
ユーザーが入力した文字をエスケープしないんだねw
>>271 まさか、まだサーバーサイドで固定値をエスケープしろとか言ってんの?
echo htmlspecialchars('<table id="tbl"><tr><td class="first">なんとか</td></tr></table>', ENT_QUOTES, 'utf-8');
なるほど、こういうコード書けと。
あんた、バグってますよw
>>273 会話のキャッチボールできないのかな?
まともに相手してもらえなくなりますよ
>>274 逆にいちいち区別するほうが変だろ
常にしておけばいい
>>275 相手しなくていいってw
どうせお前だけだろ? 意味もなくinnerHTML使うなって言ってるのは。
俺はしっかり言った。代入するのが固定の文字列であれば
innerHTMLを使うリスクは0だ。
固定値じゃない(ユーザーが入力する文字)ならばエスケープすればいい。
さあ、反論は?
ボール投げたから、ちゃんと投げ返してね。
>>276 だからバグってるだろw
正しく動いてないだろw
バグっていても、リスクが0なら
そっちの方がいいだろう?
初めてだわ、場合によってサニタイズするって考えの人
LTでも勉強会でも見たことないので是非スライドシェアに投稿してほしいね
>>276 「常にしておく」って誰かから聞いたのをそのまま言ってるだけ?
常にしておくっていうのは、変数を出力する時の話であって
固定の文字列の部分は関係ないよ。
ちゃんと理解してないで、言葉だけ覚えてるから
そういう間違いをするんだよ。
え?
>>281 あー、わかったわ。お前が何を勘違いしているのか。
全部エスケープしろって言われて、
echoで出す文字全てをエスケープしろって思ってるだろ?
echo htmlspecialchars('<table id="tbl"><tr><td class="first">$nantoka</td></tr></table>', ENT_QUOTES, 'utf-8');
みたいに。
あのね、よく聞いてね。
みんなが言ってる「常にエスケープしろっていうのは」
<table id="tbl"><tr><td class="first"> <?php echo htmlspecialchars('$nantoka', ENT_QUOTES, 'utf-8') ?> </td></tr></table>;
変数の部分だけだから。
ここまで次元が低いと、降りるまで時間がかかるわw
>>284のコードを
innerHTMLの話に戻すと
innerHTML = '<table id="tbl"><tr><td class="first">なんとか</td></tr></table>';
これはエスケープする必要はない。固定の文字列であり変わることがなくて安全だから。
「なんとかの部分を変えたい」という話であれば、こう。
innerHTML = '<table id="tbl"><tr><td class="first">' + escapeHTML(nantoka) + '</td></tr></table>';
>>284 あんたが一人で騒いでるだけだろう
俺は
>>215と書いたのに勝手に脱線してるのはお前なんだよ
今頃、変数の前後の固定の文字列まで含めて
エスケープしているスライドを探してるのかな?w
>>286 別に騒いでるのが俺だけってことでもいいよ。
俺の言ってることが間違っていると言わないなら
全然問題なし。
で、固定の文字列は安全です。
ここらへんで、一旦まとめを書いておきますね。
Q. innerHTMLは絶対に使ったらダメなの?
A. XSSが起きるような使い方をしなければ使って問題はありません。
Q. XSSが起きる場合とはどんな時ですか?
A. ユーザーからの入力された変数をそのまま出力するとXSSになる可能性があります。
Q. XSSが起きないようにするにはどうすればいいですか?
A. エスケープをしましょう。以下は例です。
innerHTML = '<table id="tbl"><tr><td class="first">' + escapeHTML(text) + '</td></tr></table>';
Q. escapeHTMLが使えません。
A. 残念ながら標準では用意されていないのでライブラリを使うか自分で実装する必要があります。
例
function escapeHTML(str) {
return str.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
}
lodash.js
https://lodash.com/docs#escape Prototype.js
http://api.prototypejs.org/language/String/prototype/escapeHTML/ Q. escapeHTMLと書くのが面倒です。
A. テンプレートライブラリなどを使えば簡単にかけます。
例 lodash
_.template('<b><%- value %></b>', { 'value': '<script>' });
// → '<b><script></b>'
Q. createElementやappendChild等のDOM命令を使ったほうがいいのではないですか?
A. 使ってもいいですがコードが冗長になります。
安全な場合(XSSが起きない場合)は冗長にしてまでDOMを使う理由がありません。
casperjsをインストールして試そうとすると以下のエラーがでてうまく動かないです。
【環境】OS:Win7pro 64bit
【何をしたのか】
コマンドプロンプトでcasperjsを試そうとすると以下のエラー?がでます
【エラーメッセージ】
C:\Users\*******>casperjs --version
1.1.0-beta3
Unsafe JavaScript attempt to access frame with URL about:blank from frame with URL file:///C:/jstools/casperjs-1.1-beta3/bin/bootstrap.js. Domains, protocols and ports must match.
【期待する結果】
PhantomJSとCasperJSをうまくインストールしたいです。
エラーの原因がわかる方、いらっしゃいましたら宜しくお願いします。
早くこの辺の話終わんねえかな…
>>293 終わったよ。まとめ書いたから止まった。
もう次の話に入ったよ。
次からID出すといいかもね
ID出しておくと便利で、うざいやつからの反論が無くなるらしいよ
>>295 昨日だったか一昨日だったかは出したんだけどね。
今回は反論を叩きのめそうと思ったので
あえて隠した。どっちにするかは気分次第。
>>291 ありがとう
なんとなく?読んでみたけど今のところ解決策がない感じ・・・かなぁ
ほんとぱたっとやんだなw
やっぱりinnerHTMLを否定していたのは一人だったか。
俺も寝るから、またあしたな。
>>297 どうやらバグみたいだから
一つ前のバージョンに戻すとかしてみればいいんじゃない?
一人で頑張るならID出したほうがいいぞ
自演を疑われるぐらいなら初めからID出したほうが信用される
後は各自で判断するだろうさ
ようやく向こうのスレが収束したわけだが
> function escapeHTML(str) {
> return str.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
> }
これは酷いな
XSSが発生するコードを披露するとは
Underscpreはこうらしいね。 これだけやっておけば大丈夫みたい。
http://stackoverflow.com/questions/6020714/escape-html-using-jquery There's also _.escape in Underscore, that does it like this:
// List of HTML entities for escaping.
var htmlEscapes = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
'/': '/'
};
// Regex containing the keys listed immediately above.
var htmlEscaper = /[&<>"'\/]/g;
// Escape a string for HTML interpolation.
_.escape = function(string) {
return ('' + string).replace(htmlEscaper, function(match) {
return htmlEscapes[match];
});
};
訂正版はこれでいいのかな。
function escapeHTML(str) {
return str.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">").replace(/'/g, "''").replace(/\//g, "'/");
}
>>300 あえてこちらには書き込まなかったのになぜこっちにコピペするんだよ
>>302 明らかに足りない
「ライブラリで使っているから大丈夫」という信者判断はいい加減に卒業しろ
しかも、「大丈夫みたい」とは何も理解してないだろ
>>304 「足りない」っていうぐらいなら
何が足りないのかいいなよ。
難癖つけてるようにしか見えないからさ
>>304 > あえてこちらには書き込まなかったのになぜこっちにコピペするんだよ
こっちの続きだから
> 明らかに足りない
じゃあ、足りない文字は何?
そいれ付け加えるだけなんだからさ
>>304 あなたよりも、徳丸さんの方を信じますよw
徳丸さんは / はエスケープしてないね。
たしかに要らないように思える。
仕様を読めば分かる事を一々聞くな
仕様も読めない奴が一人前な口を叩くな
この後の展開は読めてる
「知らないんだろ?じゃあ、問題ないってことだな」
煽ってもおまえに教える気は全くないがね
本当、文句だけ言って自分の意見は書かないクズはなんなんだろうな
それじゃだめ
↓
なんで?
↓
いいやだめだめ
↓
だからなんで?
↓
だめったらだめ
↓
駄目だこいつ話にならねぇw
>>308 > この後の展開は読めてる
> 「知らないんだろ?じゃあ、問題ないってことだな」
普通にその通りの展開だよw
でも先が読めてても、対策出来てないんじゃ
片手落ちだけどね。
お前がパンチを出してくるのは読めていた!(勝ったつもり)
そしてパンチで殴られる。(笑)
先が読めてても、殴られる例。
先が読めてるくせに、その先を行けないっていうのは、
言い返せないからってことだと思うw
そういう反論するのはわかっていたが、
その反論の反論はできないってことだから。
なんか向こうでこういうこと言ってる奴がいるわw
>
>>132が向こうのスレにコピペされてるんだが、誰がやったんだ?
> 迷惑だから止めてくれ
こっちの話を移動させようとしてるの見え見えだってのに
見苦しいやつだなw
innerHTML否定厨が完全論破されててワロタw
replaceの回数だけ文字列を全部読んでいてワロタw
>>316 ベンチマークするとそっちのほうが
速かったりするのはなんでなんだろうか?
キャッシュの関係なのかな?
ループが単純=CPUの1次キャッシュに入りきる
ループが複雑=CPUの1次キャッシュに入りきらない
>>288,289
固定の文字列って何?ハードコーディングって用語も知らないの?
文字列は文字列であり変数に入れようが入れまいが代わりはない
ハードコーディングされた文字列だから安全って思い込みはやめるべきだ
"<div onclick='alert(1);'>click</div>"こういうのは文字列じゃないとか抜かすなよ
>Q. innerHTMLは絶対に使ったらダメなの?
>A. XSSが起きるような使い方をしなければ使って問題はありません。
つまり自分でDOMで構築するよりもリスクが高い事を認めているってことだよね
お前が主張する前にもう言っただろ
innerHTMLはパフォーマンスが悪くDOMを壊す
>>303 エスケープ
var DIV = document.createElement('div');
function escapeHTML(str) {
DIV.textContent = str;
return DIV.innerHTML;
}
というやり方もあるんじゃないか?
ただし、この関数の場合
escapeHTML(str1) + escapeHTML(str2) の結果が
escapeHTML(str1 + str2)
に等しくならない場合があるブラウザがあると困るかもしれない
ちなみに逆変換はこれでいけるかな?
function unescapeHTML(htmlStr) {
DIV.innerHTML = htmlStr;
return DIV.textContent
}
innerHTMLはパフォーマンスが悪くDOMを壊す(キリッ
世界中で使われてるのに?
jQueryにも使うなって言ってこいよ
変な宗教か何かやってるのかな?
デタお決まりのjQueryガーwwwwwwwwwwww
文字列操作で構築、変数部分はエスケープって一昔前に戻った感じだね
DOMを壊すって曖昧な表現だな
innerHTMLを使ってもDOMがぶっ壊れたりしないから良く分からんよ
無知がinnerHTML使うなって言ってて笑える
ごちゃごちゃとエスケープ処理を作るよりも
こういう
>>319ハックのほうが個人的には好きだな
>>319 >>325 escapeの為にinnerHTMLを使うことは本当の馬鹿だからやめとけ
innerHTML否定厨よりも頭悪いぞ
>>325 賢い方法だが、テキストノードのエスケープ処理しかない点に注意
属性値のエスケープ処理を追加する必要がある
>賢い方法だが
ブラウザの挙動すら理解できてない馬鹿が一匹沸いたな
DOMOすんません
まあ今日はポッキーでも喰って落ち着け
つ━━━一
一人で回答頑張ってる奴がいるみたいだから、このスレの回答は全てそいつ一人に任せればいいんじゃない?
そいつの認める奴だけが回答する権利を持つと言わんばかりの有り様だし
>>318 > つまり自分でDOMで構築するよりもリスクが高い事を認めているってことだよね
DOMで構築するほうがリスクが高いよ。
DOMで構築するとコードが長くなる。
コードが長くなるということはバグを入れる可能性が高くなる。
つまりバグを入れるリスクが高い。
>>331 それ、いいね。
じゃあ、君の意見に賛成する俺と
君は回答しないことにしよう。
多分君の危険に賛成しない人はいるだろう。
そういう人は回答してもいいけど、
少なくとも俺と君、この二人はもう絶対回答しないよ
>>319 DOM使ってエスケープするのは、可能といえば可能で
意外と遅くないらしいんだけど、やり過ぎだと思うよ。
仕様も実装も簡単なのに、ブラックボックスにするのがね。
あとサーバーサイドで使う時も考えると、
純粋なJavaScript(ECMAScript)の範囲にしておきたいし。
もちろん、DOMベースでやるよりも、文字列ベースのほうが
少ないメモリで実行できるので速くなる。
>>318 > "<div onclick='alert(1);'>click</div>"こういうのは文字列じゃないとか抜かすなよ
あほじゃね? どこのアホがonclickなんて文字を書くんだよ。
そんなマヌケがいたとしたら、createElement使っても
onclick書くだろw
どんだけおっちょこちょいなんだw
論点がずれてる。
JavaScriptを文字列の中に書くのはXSSじゃない。
それは単にaddEventListnerした要素にすぎない。
問題なのは文字列の中にJavaScriptを埋め込むことではなく
文字列の中にXSSを埋め込むこと。
文字列の中にXSSを埋め込むのは相当難しい。
337 :
335:2014/11/11(火) 21:18:01.52 ID:???
>>336 そのとおりですね。
俺が言いたかったのは、文字列の中にXSSを埋め込むようなおっちょこちょいは、
createElement使ってもXSSを埋め込むおっちょこちょいだろだろってことです。
俺がいいたいのは
>>289のようなアホなコードを書く奴は何を書いてもXSSを起こすだろだろってことです
じゃあアホの部分を修正すればいいだけじゃんかw
ここはジャイアンのスレですね
ジャイアンに失礼だろ
結局また始まってんじゃん
仕方ないよ。
innerHTMLなんて、サーバーサイドのechoや
document.writeと同じで、エスケープすればいいだけの話なのに、
エスケープしなかったらXSSになるかもしれないから使うなって
意味不明なことを言ってるようなやつだからね。
頭が悪い奴はいくら言っても理解できない。
ゼビウスの開発コードネーム?
345 :
Name_Not_Found:2014/11/12(水) 01:34:13.10 ID:+zRlwvNM
いま面白いことを言った!
ORMでデータを保存する時、
hoge.save()
のようなメソッドを発行すると思います
それによりajaxのリクエストが投げられるでしょう
しかし複数のデータを保存した場合、たとえばオブジェクトが100個あると、
100回もリクエストが発行されるのでしょうか?
>>346 フレームワークによると思うが
複数のリクエストをまとめる仕組みがあるだろう。
そういうたぐいのフレームワークについて
俺は詳しくないが、そのような仕組みを考えたことはある。
俺程度が思いつくものなのだから、普通にあると思う。
そうですか
調べてみます
ありがとうございました
350 :
Name_Not_Found:2014/11/12(水) 23:15:55.68 ID:PMYoTTja
ポップアップ画面のClickイベントでAddClass()をしてもブラウザに反映されません、親のフォームでは反映されました
原因が解る方お願いします。
環境:Chome 38, JQuery 1.10.2
var Sidebar = Spine.Controller.create({
events: {
"click [data-name]": this.click
},
init: function(){
this.bind("change", this.change);
},
change: function(name){ /* ... */ },
click: function(e){
this.trigger("change", $(e.target).attr("data-name"));
}
// ...
});
というコードがステートフルJavaScriptにあるのですが
events:のthis.clickに違和感があります
clickハンドラをSidebarのclickメソッドにマップしているところですが
ここのthisはSidebarではなく、定義時のthisになりますよね
そして関数ではないので、bindでthisをSidebarにする方法もないですよね
つまりどう考えてもおかしいのではないと思うのですが
何か間違っているのでしょうか?
もしかしたらオブジェクト定義の中にthisを書いたらオブジェクトがthisになるのかと思って
たしかめたけどやはりそんなことはありませんでした
記述ミスですかね〜
winXPを久しぶりに起動したらwindows updateが来ていました
またXPのサポートが終わった時から
avg2014が使えなくなっていたのですが
avg2015を入れたら問題なく使えるようになりました
なんだかサポート期限なんてなかったみたいな雰囲気になってますが
ということはIE6が延命していくのでしょうか?
延命? 命を延ばすわけ無いだろ。
余命過ぎてもまだ生きてるぐらいの意味だ。
355 :
Name_Not_Found:2014/11/13(木) 04:00:55.93 ID:OMP0ufSZ
>>351 コード見てないからわからないけど、
click関数が前後のどこかにあるんじゃないの?
thisは文脈で変わる
各インスタンスのメソッド内では、そのインスタンスを指すけど、
関数がグローバルスコープで呼び出されていたら、
thisはグローバルオブジェクトを指す
thisを出力して確かめて
ECMA Script 3 では、入れ子になった関数内で、thisを使うと、
グローバルオブジェクトを指すというバグがあったが、
ECMA Script 5 では、修正されるらしい
greasemonkeyスクリプトなんですが、
スクロールを一定回数止めるため以下のように書きました。
var count = 1;
var scrollY;
start();
function start(){
scrollY = document.body.scrollTop;
window.addEventListener('scroll', scrollStop,false);
}
function scrollStop(){
count++;
window.scrollTo(0, scrollY);
if(count > 20) window.removeEventListener('scroll', scrollStop,false);
}
firefoxでは正常に動くのにchromeだとremoveEventListenerがうまく動きません。
chromeに対応させるにはどうしたらいいのでしょうか?
>>351-352 Spine.Controller.create の中身が不明なので答えようがない
結構メモリを食うjavaプログラムをjs(+HTML)に移植しています。
メモリエラーが出る関係から、sshを使って他のスペックの高いマシンでjava実行を
していたのですが、jsを同様にスペックの高いマシンの方で実行する方法はあるのでしょうか?
Node.jsのサイトなどを見ていたのですがこれでいいのかよく分からず・・・。
スレチ、文が意味不明、だったらごめんなさい
>>359 多分nodeでいいよ。
hello.js というファイル名でconsole.log('hello') って書いて
node hello.js とやるとちゃんとhelloって言ってくれる。
ただ、ブラウザで動かしているものをnodeで動かすとしたら
ちゃんとJavaScript(ECMAScript)の仕様の範囲にしておかないとダメだけどね。
ブラウザで動かすJavaScriptは、純粋なJavaScriptではなくて
DOMというブラウザ専用ライブラリが組み込まれた状態。
だからDOMを使わないコードにしておかないといけない。・・・原則的には。
NodeはNodeでその実行環境にはブラウザを超える能力があるから
ライブラリ次第でDOMも使える。
話がそれたけど、別のマシンで動かすならNodeでOK
そのコードの書き方はDOMを使わないように気をつけることだね。
>>360 周りに聞ける人がいないので本当に助かります。
DOMを使わず書けるならそれが望ましい(結果的に楽?)のですね
とりあえずnodeで良さそうなので、もう少し書籍等調べてみます。
ご丁寧にありがとうございました。
>>356 > ECMA Script 3 では、入れ子になった関数内で、thisを使うと、
> グローバルオブジェクトを指すというバグがあったが、
> ECMA Script 5 では、修正されるらしい
初耳ですが、具体的にはどのようなコードでバグが再現されるのでしょう?
ES3での該当箇所や参考URLがあれば、掲示していただけると助かります
ソースは2ちゃんです
バクじゃなくて仕様だよ
ES6のアロー関数では外のthisと同じものを指すらしいけど
365 :
362:2014/11/14(金) 16:04:47.03 ID:???
>>363 具体的な2chのURLはどこになるでしょう?
また、バグと判断できる根拠は?
>>364 ES3では this はグローバルオブジェクトを参照する仕様ですが、ES5 でも変わってはいません
Strict Mode でのみ this は undefined を参照します
このように理解しているのですが、
>>356の勘違いのような気がしてきました
>>357ですが自己解決しました
あれこれ試した結果、案外単純にwindow.onscrollで一時停止と解除ができました。
結局なぜremove出来なかったのかわからずじまいでしたがお騒がせしました
367 :
Name_Not_Found:2014/11/16(日) 17:53:05.70 ID:EXTL8bVR
子Windowで選択した要素を親Windowに追加がしたくて
子Windowで
window.opner.item = selectItem;
親Windowで
$('#itemList').append(item.cloneNode(true));
としてみたのですがIEだけappendの時にHierarchyRequestErrorと出ます
ぐぐってみると子Windowからappendするときはwindow.opnerをつけるという感じのものしか見つからず解決しませんでした
どうしたらいいのでしょうか?
368 :
Name_Not_Found:2014/11/24(月) 02:14:18.29 ID:0uSHMMOL
>>367 ウインドウが違うのに要素って移動していいのかな?
子ウインドウであればセキュリティ的には問題ないはずなんだけど
仕様的にどうなんだろう。
興味があるので詳しい人お願い
配列a(a[3000][3000]くらい)の中身を関数(js)B,C,D・・・で書き換え操作するプログラムを作っています
HTMLでファイルを読み込み、ロードが終わり次第、関数Bを呼び出し、Bが終わり次第
B内でCを呼び出し・・・としています。
これで上手くいけばいいのですが、メモリエラーになってしまいます。
BやC内でもaと同サイズの配列を新たに生成しているためメモリを食うとは思うのですが
やり方としておかしなところがあったりしますでしょうか?
GCのために使わなくなった大きな配列データはnullで初期化してるつもりなのですが・・・
>>369 >GCのために使わなくなった
それだとGCのタイミングに依存するかも
js 側の処理を中断して一度制御をブラウザ側に返す必要があるかもしれない
可能なら作業用の配列を何度も使い回す方がいいだろう
371 :
369:2014/11/26(水) 08:06:28.71 ID:???
>>370 GCという機能があるというのは知っていましたが
タイミングを含めて、どのように実行しているか調べていなかったので
開発者ツール?でチェックしてみようかと思います。
どちらかというと、未だによく理解できていないクロージャーの方が
問題かと思っていたのですが、そうでもなかったのですかね。
ご返答ありがとうございました。
DTならよく知っています。
>>369 > GCのために使わなくなった大きな配列データはnullで初期化してるつもりなのですが・・・
GCだと推測して対策ししたが効果はなかったということは、
GCは関係ないってことだよ。
>>369 どうやってHTMLでファイル読み込んでるのかしらんけど、
非同期処理の問題でしょ?
375 :
369:2014/11/26(水) 23:50:50.66 ID:???
>>372-374 今確認したところ非同期処理でファイルを読み込んでいるみたいでした。
同期処理のもあるみたいなのでそれで一度試してみます。
ただ、非同期のために値が取れていないという訳ではないんですよね・・・。
>>375 原因追及のために同期処理でやってみるのもいいけど
同期処理はあまりやらないほうがいいよ
無限ループって怖いよね
(function f(){f()})()
みたいな
githubとかってjavascriptの勉強に使えますか?
英語読めないし、使い方がさっぱり分かりませんでした。
英語が分からなくても、JavaScriptという万国共通語があれば大丈夫
perlワンライナーで語るみたいな
385 :
Name_Not_Found:2014/12/01(月) 22:17:14.50 ID:R7CxMEcr
backbone.jsを勉強しています
ビューの中でモデルにハンドラをセットし、モデルの変更をビューに反映させる、
ということは分かりましたが、
マウスなどの入力をモデルに反映させるのはどこでやるんですか?
ボタンを押した時の処理をどこで受けるのか的なことです
viewのeventsプロパティがハンドラとしてセットされ、
viewのメソッドで受けるようです
なんとなくコントローラの役割のような気がするのですが違うのでしょうか?
>>381 gitの本は、一杯あるよ
日本のサイトでも、サイト内だけだけど、MITライセンスで、
JSのソースコードを共有しているし、自由に使える。
ゲームも一杯ある
ttp://jsdo.it/
>>387の件ですが、
backboneのコントローラはURLとハッシュによって呼び出されるメソッドの集積のようですね
サーバサイドのコントローラに近いですね
ie7とie8とかでjsコードを実行したい場合、ietesterを使っていたのですが、
ietesterはバグがあるから、〜を使えってこのスレで言われた気がするのですが、
何使えばいいですか?
開発者ツールでいいんじゃね
virtualboxじゃね
実機の挙動にかなうものなし
昼休みは、会社の食堂でメシ食ってるときにテレビ見てるんだけどさ、
今どきのjs(女子小学生)のファッション特集とかよくやってんだけど、
マジでJS(女子小学生)って普通にテレビで言うようになったんだな。
うかつに「休日はJS(Javascript)の勉強してます」っていうと
「JS(女子小学生)の勉強・・通報しなきゃッ!」って感じで
通報されかねないやん
別に会話中にJavaScriptをJSなんて言わないよ
「はじめてのC」
Backbone.jsのViewで、classNameやidというプロパティは
スカラー値にすることも関数にすることも出来、
関数だった場合は返り値を設定したことになるそうですが
これナイスな方法ですね?
>>396 はい。ナイスな方法でよく使われます。
よく使われるので、汎用JavaScriptライブラリのlodashは
まさにそのための関数_.resultを用意しています。
https://lodash.com/docs#result var object = {
'cheese': 'crumpets',
'stuff': function() {
return 'nonsense';
}
};
_.result(object, 'cheese');
// → 'crumpets'
_.result(object, 'stuff');
// → 'nonsense'
ほお
lodash使ってたのに知りませんでした
ありがとうございます
lodashはいい加減3.0をリリースして欲しい所。
全体のどれくらい終わったんだろうか。
qiitaに投稿した記事がやたらアクセス数が多い(3500超えた)と思ったら、
「Javascript 〜 〜」って検索すると一番上にqiitaに投稿した記事が来た
ストック6しかないのにな、業務とかでググってる人が多いのだろうか?
backboneはドキュメントサイトが見にくいな
左フレームの幅が固定なのがアカン
403 :
400:2014/12/06(土) 08:36:37.42 ID:???
>>401 違います。特定されたかと思って焦ったじゃないか。
何qiitaって?お金になるの?
backbone.jsでset時にvalidateした場合、invalidな値がセットされることはありませんが
そうでない場合はsave時にvalidateされるので
invalidな値が属性に入ってくることになりますよね?
そうなるとinvalidな値を元にrenderすることになると思います
そうすると対応が面倒なので、バリデートはset時にするのが当たり前なのでしょうか?
テンプレートはHTMLにtext/templateとして書く方がいいのでしょうか?
そうなるとテンプレートの断片がHTMLの中に並ぶわけで、
それならJavaScriptファイル中に書くのと分かりやすさ大差なくね?
いやむしろJavaScriptファイル中に書いた方が分かりやすくね?
って思います。
HTML自体がテンプレートのようなものなので、
テンプレートの中にテンプレートの断片を入れているような気持ち悪さがあるのです
ドットインストールのbackbone.jsのレッスン見終わりました
やはり本を読んだりするより映像で学ぶのが一番効率いいと思います
もう少し詳しい学習をしたいのですが、そういうムービーどこかにないですか?
>>408の件ですが
英語の動画は沢山あるのですが日本語のものはないようですね
スライドを見ればある程度は何してるのか分かりますが
それなら最初からスライドを探した方がいいかもしれません
JavaScriptを独学で勉強しようと思うのですが、一番初めに見るおすすめの参考書はどれでしょうか?
observerパターンについてですが
ハンドラを解除しないままobserverの方を削除してしまったら
ハンドラが残り続けてメモリリークになるんじゃないかと思うのですが、
大丈夫なのでしょうか?
observerのデストラクタで解除するようにすればいいと思いますが
JavaScriptではデストラクタがないので、そういう方法は取れないと思います
>>411 中級者以上ならオライリーのJavaScriptがいいと思うけど
初心者向けとなると逆に何がいいか分からないな
qiitaにたまに芸能人の画像貼り付けてる奴がいるから通報してる
>>411 My UNIXシリーズの奴は解りやすかった。
backbone.jsのために
サーバ側から送るJSONのフォーマットが良く分かりません
ドキュメントにもそれらしき項目がないようですし
ガイドブックにも何故か見当たりません
どこ見たらいいですか?
>>416の件ですが、
ごく当たり前に記述する、で正解でした
fetchした直後にcollectionをlogしたら、lengthが0だったので、
JSONの記述の仕方を間違っているのかと思ったのですが
非同期で読まれるのでfetch実行直後にはまだ値が入ってないんですね
backbone.jsで、モデルを新規作成してsaveした時、
サーバサイドで割り振ったidをクライアントに反映すると思うのですが
どうやるのか良く分かりません
POSTのレスポンスとしてidを返すんでしょうか・・?
<div>
<div></div><div>★</div>..
</div>
★のところから自分のノードが親に対して1だという
ことはどうすればわかりますか?
★の2に対する子から親が1かどうかをしらべる
>>418の件ですが
普通に
{"id":100}
みたいなJSONを返せばいいだけでした
JSの癖で、キー名を""で囲まなかったのでエラーになってました
JSONライブラリ使えよ
面倒なので手書きしてました
手書きというのはライブラリを、ではJSONをという意味です
まだやり方をテストしてる段階なので
backboneを使うため、
lodashをunderscore buildにしたら
assignが使えなくなりました
ソースを見るとextendというエイリアスは生きているようです
別にバッティングするわけでもないのだから
assignを生かしておいても問題ないと思うのですが
なぜassignをなくしたのだと思いますか?
質問です。
<dl>
<dt>dt 1
<dd>dd 1
<dl>
<dt>dt 1-1
<dd>dd 1-1
</dl>
<dt>dt 2
<dd>dd 2
</dl>
一番外の dl 直下の dt のみを取得したいと思います。つまり、「dt 1」と「dt 2」を取得したいです。
しかし以下のコードで取得しようとすると、「dt 1-1」まで取得してしまいます。当たり前と言えば当たり前ですが。
elm.querySelectorAll("dt"); //(elmは一番外のdl要素です)
もちろん、取得した後にフィルターを掛ければいい話ですが、あまりスマートではありません。
querySelectorAll()で一発で「dt 1」と「dt 2」を取得する方法はありますか?
childNodes[childNodes.length-1]
>>427 dl直下のdtというのなら、dl > dtでいいんじゃないの?
querySelectorAllがどこまで対応しているかしらないけど、
ブラウザによって動きは違うかもね。
こういう場合はjQueryを使ったら、古いブラウザ含めて対応できるよ。
>>429 dt 1-1もdlの直下なのでダメだね
最上位のdlが特定できればいいんだけど
idとかついてないの?
>>429 ありがとうございます。
確かにjQueryでしたら簡単に実装できますね。ライブラリの使用も視野に入れてみます。
>>430 ループ処理しているので、唯一に特定できるidなどは何もついていません…。
elmに代入されているということだけが唯一の情報です。
やはりフィルター処理しかないでしょうか。
querySelectorAllの前後でidの付け外しをするとか
(上書きのことを考えるとclassの方がいいか)
でもまあフィルタがいいと思うけど
jQueryにするんなら.filter() で結構簡単に書ける
backbone.jsでは、イベントハンドラはviewに付けますが
モデルと関係ないようなイベントハンドラはどこで付ければいいんでしょう?
たとえば画面全体に対するmousemoveなど。
イベントハンドラを付けるために画面全体用のviewも作るんでしょうか?
それもなんか無駄な感じがします
普通のMVCとかだとレイアウトやヘルパー、パーシャルなオブジェクトってのがあるんだから
(ってもCakeしかやった事ねーけどw)そーいう差し込み可能なユーティリティーってのが
backbone.jsにもあるんじゃね?知らんけどw
知らんからこれ以上はひっこむわw
backbone.jsに同梱しているサンプルアプリを見ると
全体を包含するDOM要素をAppViewとして
var App = new AppView;
でアプリケーション自体を起動する感じでした
じゃあそれ拡張してアタッチすりゃあいいのかな?
あ、出てきちゃったw
ですね
サーバサイドMVCのコントローラっぽい感じです
backbone.jsのviewにeventsでイベントを設定する時
セレクタにwindowを設定することは出来ないのでしょうか?
出来ないとすると、eventsで設定したり、自前で設定したりして美しくないですよね
eventsの設計ミスとしか思えませんがどうなのでしょうか
セレクタにwindowを設定するという
設計がミスなんだろ。
実際にwindowにイベントハンドラをセットする必要があるので設計ミスではありませんが?
でもevents=viewが所有するDOMに付けるイベントを管理するもの、
と考えたら別にアグリーでもないかもしれません
ありがとうございました
backbone.jsにはコントローラがないので
それだとviewがやたらでかくなるのでは?
それともコントローラ的な部分は自前で用意するのか?
と悩んでいたのですがコントローラなどを用意したマリオネットっていうやつがあるようです
プレーンなbackboneではなくmarionnetteの方を使うのが今の感じなんですかね?
振分けられる処理は極力ModelやCollectionに振分けましょうって
思想みたいだけどようワカランね。
Routerは大した仕事はしなさそうだし。
サーバーサイドのMVCモデルのように間に何かが入る必要があるか?
を考えてみた方がよいのかも。
やっぱコントローラーとしての役割はRouterぐらいしか見当たらないな
サーバーMVCのView間の遷移なんてものが無いから出番もそんなに無いって事なのかも
質問です。Unix系のファイルで正規表現を書くときに
バックスラッシュを使いますが、これはWindowsで読む
とエラーになりますよね。あちらは\らしいですが、
どう回避してるのでしょうか?
なりませんよ
ファイル名じゃないから関係ないね
447 :
Name_Not_Found:2014/12/18(木) 18:43:47.24 ID:ChiIDXGI
チェックボックスのラベルを変更するにはどうすればよいでしょうか?
jQueryは使わずにおこないたいです。
<input type="checkbox" id="chk1" name="chk" value="1">
<label for="chk1">aaa</label>
のaaaをbbbに変えたいのですが
document.getElementById("chk1").innerText="bbb";ではダメなようで。
ラベルにidフルか、nextsibiling
ちなみにinnerTextはFirefoxで使えないから注意ネ
標準の textContent や data 属性を差し置いて
やたら innerText を見かけるけど何でなん?
ヒント:企業グラマー&ユーザー
>>450 IEのサポートが9からだから。
IE8のサポート期間が2016年1月12日だから
あと1年は対応が必須。
その期間を過ぎたらすぐにIE8のサポートをうちきって
いいのか?って話はあるが。
453 :
Name_Not_Found:2014/12/18(木) 23:32:11.70 ID:xIB+P02h
SHIFT+ENTERのキーコードが13でENTERになっているのですが
SHIFT押しながらENTERおしたときと
単にENTERを押した時の区別って出来ますか?
455 :
Name_Not_Found:2014/12/19(金) 09:18:33.62 ID:+jAv/pOh
>>448 >>449 ありがとうございます。
idをふったらできました。
document.getElementById("chk1").nextSibling.textContent = "bbb";
のほうは、aaa → bbbaaa になってしまいました・・・
使い方が違うんでしょうね ^^;
innerTextとtextContentは若干挙動が違うらしい
支障が無ければinnerHTMLを使ったほうが良いらしい
>>457 そのようなプロパティがあったのですね
動作も確認いたしました
どうもありがとうございます
>>455 まだいるか分からないけど訂正すると
.nextSibling.textContent = "bbb"; で 「bbbaaa」 になるのは、<input>と<label>の間を改行しているせいで 改行だけのテキストノードが存在から。
つまり、<input>と<label>の間を改行しなければ .nextSibling.textContent = "bbb"; で可能
例1:<input type="checkbox" id="chk1" name="chk" value="1"><label for="chk1">aaa</label>
例2:<input type="checkbox" id="chk1" name="chk" value="1"
><label for="chk1">aaa</label>
または、HTMLを変えずに、nextElementSibling.textContent = "bbb"; でもおk
460 :
Name_Not_Found:2014/12/19(金) 13:00:46.02 ID:+jAv/pOh
461 :
Name_Not_Found:2014/12/22(月) 21:51:12.61 ID:r9xSRLJj
Google Maps API V3を使ってカスタマイズしています。
テキストフォーム一つに検索ボタンです。
改行、Enterキーを押して実行できるようにしたいです。
form onsubmit="script()"
input type=text
input type=submit
これだと検索できません。
form
input type=text
input type=button onclick=script()
だとボタンクリックで検索ができますが、Enterキーでは検索できません。
どうしたら良いのでしょうか?
>>461 form onsubmit="script();event.preventDefault()"
input type=text
input type=submit
で、どうだ
463 :
461:2014/12/22(月) 22:27:49.48 ID:???
var a = new Array1();
a[3].x = 1;
a[7].y = 2;
上のようにできる、プロパティの付いた配列のクラスらしきものを実現したいのですが
どのようにすればできるでしょうか?
変数のプロパティだけでいいなら
var foo = new Foo();
function Foo()
{
this.x = null;
this.y = null;
}
みたいな感じにはなると思うのですが・・・
>>464 配列の初期長を決めて、あらかじめインスタンスを必要個数分だけ作っておくのはどう?
function Foo(){
this.x = null; this.y = null;
}
function Array1(len){
for(var i=0;i<len;i++) this[i] = new Foo();
}
var a = new Array1(8); //[0]~[7]のFooのインスタンス配列
a[3].x = 1;
a[7].y = 2;
466 :
464:2014/12/28(日) 22:54:22.94 ID:???
>>465 システムの構成上配列が結構大きく、配列の長さが場合によって結構変化するので
初期に作る方法以外のものがもしあれば、と思ったのですが
やっぱり現実的にはそうなってしまうのでしょうかね・・・
>>466 なるほど、配列の長さが変化するのなら、
>>465はオススメできないね
その条件なら、毎回正直にインスタンスを作るのが普通だろうなあ
function Foo(){
this.x = null; this.y = null;
}
var a = new Array(); //ただの配列
if(!(3 in a)) a[3] = new Foo();
a[3].x = 1;
if(!(7 in a)) a[7] = new Foo();
a[7].y = 2;
この処理は面倒だから関数化するといいかも
あるいは、配列でなくていいなら一次元的に格納するか
var a = new Object(); //ただのオブジェクト
a["3x"] = 1;
a["7y"] = 2;
あるいは、Firefox限定で構わないなら、Proxyを使うという方法もある
468 :
464:2014/12/29(月) 11:06:39.64 ID:???
>>467 inとかよく分かってないのでちょっとまた調べてみます。
ご丁寧に色々な案を提示して下さってありがとうございました。
>>466 疑似配列の長さ(length)の得たいなら Object.defineProperty で出来ると思う
>>468 この場合は Object#hasOwnProperty がいいかな
470 :
464:2015/01/02(金) 10:45:11.06 ID:???
>>469すみません気付いていませんでした
ただ、まだ疑似配列作っていろいろするほどの力も時間も今はなさそうなので
とりあえず初期に作成する方法でやってみます
一段落したら挙げてもらったものを調べてみようと思います
ありがとうございました。
471 :
Name_Not_Found:2015/01/05(月) 00:09:08.26 ID:vo7XD6Y+
10進数の連番IDをhash化したいと思い調べていたところ、
下記の関数を見つけました。
この関数は衝突なく安全に利用できますか?
理解できる方は、各処理の解説もして頂ければ助かります。。。
var shuffleTable = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61];
var create62Hash = function(id, shuffleTable) {
var asciiTable = [65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,48,49,50,51,52,53,54,55,56,57];
var hashTable = new Array();
var i = 0;
do {
hashTable[i] = String.fromCharCode(asciiTable[shuffleTable[(Math.floor(id / Math.pow(62, i)) + i) % 62]]);
i = hashTable.length;
} while(Math.pow(62, i) <= id)
return hashTable.join("");
}
引用するなら引用元のページも欠くのが最低限コードを書いた人への礼儀だぞ
>>471 ハッシュ化したいならその関数は使えません。
なぜならハッシュ化してないからです。
しかも無駄な処理をしていてさらに言えば遅い
473
お前はまずハッシュの定義について勉強しなおしてこい
暗号学的なhashもあれば、単にデータを区別する値もhashと言うよな
何の目的に使うのか知らんが、それを読む限り、10進数を62進数にしているように見える。
若干並びを入れ替えているみたいだが。
単純すぎてパスワード保存用とかには使えないぞ。
ちゃんとしたハッシュアルゴリズムを実装すべきだと思うが。
10進数⇒62進数変換ではなかったな。
62進数に近い何かをやってる
>>476 これでいーですかー?w
http://e-words.jp/w/E3838FE38383E382B7E383A5E580A4.html > 元になるデータから一定の計算手順により求められた、【規則性のない固定長の値。】
> その性質から暗号や認証、データ構造などに応用されている。ハッシュ値を求めるための
> 計算手順のことをハッシュ関数、要約関数、メッセージダイジェスト関数などという。
>
> 【ハッシュ値は元のデータの長さによらず一定の長さとなっており】、同じデータからは必ず同じハッシュ値が得られる一方、
> 【少しでも異なるデータからはまったく異なるハッシュ値が得られる。】
> 【不可逆で情報量の欠損を含む計算過程を経るため、ハッシュ値から元のデータを復元することはできない。】
>
> また、【元のデータよりハッシュ値の方が短い場合(実用上はほとんどの場合が該当する)】、
> 複数の異なるデータから同じハッシュ値が生成される(ハッシュ値の衝突)ことになるが、
> あるデータとそのハッシュ値から、【同じハッシュ値を持つ別のデータを効率よく探索することはできない。】
よってハッシュではありません。
反論あるならどうぞ?
これは最小完全ハッシュ関数だな
shuffleTableをその名の通りシャッフルすれば、shuffleTable毎に一意性のある値が算出されるんじゃね
ただ、確証は無い。衝突の有無は知らん
ちなみに整数を文字列にしているので、
元のデータ量よりもハッシュ値(と称する別のもの)
の方が多くなっている。
>>480 wikipediaくらい見てくれば?反論できないのは君の方と気付くよ
Wikipediaの最小完全ハッシュ関数例を見てもわかるように
最小完全ハッシュ関数は、John Smith -> 1, Lisa Smith -> 0, Sam Doe -> 3, Sandra Dee -> 2
という風に、データが小さくなっているからハッシュなんですよ?
ただの進数変換もどきは逆にデータ量が大きくなっていて
なんのためにあるのかさっぱりわかりませんw
>>484 その結果はただの例だろ
自分で自分の低脳さをさらけ出してるぞ
なお、create62Hash(0,shuffleTable)がA
なお、create62Hash(1,shuffleTable)がB
なお、create62Hash(2,shuffleTable)がC
とハッシュにありまじき予測可能な順番で並んでいるのは
進数変換だからいいとして
create62Hash(61,shuffleTable)が9
create62Hash(62,shuffleTable)がAC
となっており、AAじゃない所を見ると
バグってますねこれ。
>>485 反論しろよw
例が示すものは、俺が言っているとおりだと認めてるのに、
なんで俺が低能になってるんだよw
shuffleTableを変更すればランダムになるというのは
間違いです。
0〜9、A-Z、a-zの文字がそれぞれ置き換わるだけで、
順番はランダムになっていません。
これもハッシュではないことの根拠の一つです。
>>487 だからお前は理解できてないって言ってるだろ
馬鹿に間違いを指摘してるわけ
けど、馬鹿にわざわざ解説して教える気はない
結局、何も言い返せていない(笑)
wikipediaより
>あるデータが与えられた場合にそのデータを代表する数値を得る操作、
>または、その様な数値を得るための関数のこと。ハッシュ関数から得られた数値のことを要約値やハッシュ値または単にハッシュという。
と定義されてる
つまり、データとハッシュ値が結びつくなら固定長である必要も、元の文字より大きくなっても問題ない
単なる進数変換でも広い意味でハッシュと言える
>>492 完全論破ワロタ
このスレにはwikipediaの最初の文も読めない奴がいるのか・・・
> あるデータが与えられた場合にそのデータを代表する【数値を】
数値ではないのでハッシュ変換ではありません
>>494 >>471 の関数は数字を出して、それを文字に置き換えてるでしょ
そんな事もわかってないの?
>>496 数字じゃなくて数値な。
数字というのは数の並び。そこに大小の順番はない。
数値というのは、大小の順番があるもの
違いぐらいわかろうぜ。
>>497 じゃあ訂正する、数値ね
それで、反論は?
create62Hashは入力された引数の数値を
何の処理もせずに、単純に文字列に進数変換しているので
ハッシュ処理としては何もしていません。
499
定義の範囲内でハッシュと呼べるけど?
反論出来てない
間違いを認められないと本当の馬鹿だぞ
お前の出してきた定義はことごとく論破してやったが?
もう根拠残ってねーだろ。
反論しないならレスしなくていいんだよ?
>>499 定義の範囲内ではハッシュです
はい、論破
>>501 お前だけ誤りを叫んでる事にまだ気付いてないの?
反論しないならレスしなくていいんだよ?
って何回言わせるんだw
定義の範囲内ではハッシュニダ
定義の範囲内ではハッシュニダ
定義の範囲内ではハッシュニダ
定義の範囲内ではハッシュニダ
何回言えばわかるニダか?
定義の範囲内ではハッシュニダ
定義の範囲内ではハッシュニダ
定義の範囲内ではハッシュニダ
定義の範囲内ではハッシュニダ
嘘を何回行っても真実にはなりません。
499 Name_Not_Found sage New! 2015/01/05(月) 02:04:25.06 ID:???
create62Hashは入力された引数の数値を
何の処理もせずに、単純に文字列に進数変換しているので
ハッシュ処理としては何もしていません。
↑
ハッシュと呼べます、以上
何か言いたい事ある?
> ハッシュ関数 (ハッシュかんすう、hash function) あるいは要約関数とは、
> あるデータが与えられた場合にそのデータを代表する数値を得る操作、
> または、その様な数値を得るための関数のこと。
どこにも進数変換がハッシュだとは書いてないが?
>>506 何も処理してないなら、ハッシュじゃないのでは?
ハッシュの根拠は何よ?
>>509 なら数値を得ていないから
ハッシュではないですね。
どう見てもデータをに対する数値は得てるよな
理解してないうえに
顔真っ赤にして必死だな
悔しかったら、Wikipedia改ざんしてこいよw
数値を数字に全置換するだけで満足できるだろ?w
はい、逃げた
>>511 > どう見てもデータをに対する数値は得てるよな
どこに計算によって数値は出てきてないですね。
ただ入力された数値を文字に変換しているだけです。
そもそも入力データが数値しか受け付けない時点で
ハッシュじゃないわなw
その数値も整数値しか扱えないという
(数値の最大値を超えるとバグる)
>悔しかったら、Wikipedia改ざんしてこいよw
ねぇ、反論は?
>>515 え? 普通ハッシュって言ったら
文字や任意のバイナリを数値に計算するものでしょう?
ファイル入力できないんですか?
そんなもの使いものにならないでしょ。
あるデータとはすべてのデータという意味ではありません
日本語も理解できないのかな?
>>516 反論はしません。
だって数値を算出していないから
ハッシュじゃないもの。
はい論破w
まあどう見てもハッシュじゃないよなw
521 :
Name_Not_Found:2015/01/05(月) 02:29:33.40 ID:VxoaMy9m
ただの基数変換をハッシュ計算だと
言い張っているアホが居るスレはここですか?
こんな簡単なコードすら読めないのか・・・
テーブルのキーが数値で、その数値を文字にしてるのにね
おやおや、こんな深夜にw
明日仕事じゃないの?
ニートは羨ましいですなw
523 Name_Not_Found sage New! 2015/01/05(月) 02:30:06.89 ID:???
おやおや、こんな深夜にw
明日仕事じゃないの?
ニートは羨ましいですなw
自己紹介かな?
こんな簡単なコードすら読めないのか・・・
テーブルのキーが数値で、その数値を文字にしてるだけで
ただの置換でハッシュ計算は何もしてないのに
ニートだからハッシュというものを理解できないのか
ハッシュを理解できないからニートなのか。
まあどっちでもいいやw
>>525 その数値は同じ結果が生まれます
どう見てもハッシュです
ここまで必死なのは、あの関数の作者かいな?w
ハッシュ関数ではないと言われたのが
よっぽどショックだったのか?
>>528 ハッシュの定義に当てはまっていない。
反論は?
つまり、定義にあるデータに対する数値を得られてるわけ
わかるかな?ん?
データに対する数値を得られている?
じゃあ例えば65を入力したときの
数値はなんですか?
答えるのは簡単でしょう?
数値で答えてください。
>>530 当てはまってるね
お前さっきから間違った反論しかしてないぞ
>>532 それ、とどめだろw
ぜってー答えらんないってw
>>532 このレスでお前がコードを理解していないことがよくわかった
少し質問が曖昧だったかな?
データに対する数値を得られている?
じゃあ例えば65というデータを入力したときに
得られる数値はなんですか?
答えるのは簡単でしょう?
数値で答えてください。
>>536 スクリプト出てるのにそんな事もわからないの?
馬鹿すぎる
例えば、Wikipediaの例から
John Smith -> 1
Lisa Smith -> 0
Sam Doe -> 3
Sandra Dee -> 2
というようにハッシュであるならばデータに対する数値を得られているわけさ
> ハッシュ関数 (ハッシュかんすう、hash function) あるいは要約関数とは、
> あるデータが与えられた場合にそのデータを代表する数値を得る操作
なのだから、数値を得られるわけだね。
それでcreate62Hash によって
65というデータを入力したときに
得られる数値はなんですか?
>>537 分かった! 数値は得られなかった!
これが答えなんだから仕方ない。
認めるしかないな。ハッシュではないと。
>>538 ただの例にしがみついて必死だな
さっきからお前の反論は間違ってばかり
>>541 >>539 >
>>537 > 分かった! 数値は得られなかった!
> これが答えなんだから仕方ない。
> 認めるしかないな。ハッシュではないと。
横ヤリだが、65の数値は65でしょ
それを文字に変換してる
数値連呼してる奴って馬鹿?
>>541 思い込みが激しくて間違いという事に気付けない
これぞ馬鹿の典型だな
>>543 文字に変換しているだけなら
ハッシュではないよ。
>>544 そんな捨て台詞はいらないからさw
説明できない人は引っ込んでいたら?
それをハッシュと言うんだよ、理解できないのかな?
そのうち+1するだけの関数でも
ハッシュ関数だって言いそうだなw
>>547 いういう連呼しても、ハッシュ関数にはなりませんよ。
>>545 いや、単に文字に変換してるわけじゃないでしょ
冷静になってみ?
>>548 マジいいそうで困る。
そこまで馬鹿ではないと思いたいがwww
>>550 コード読めないの?単に文字に変換しているだけだよ。
文字の順番が数値の順番通りじゃないってだけ。
単一換字式暗号ともいう。
これまでの色んなレスで散々結論出てるのに
頑なにハッシュじゃないって言う奴ってなんなの?
否定されたことがよっぽど悔しいのかな?
>>552 ならなんで62より大きな値が文字になってるの?
いろんなレスでハッシュじゃないってさんざん結論でてる
の間違いだろw.
なんでこんなに必死なんだろ?
556 :
Name_Not_Found:2015/01/05(月) 02:54:00.65 ID:7Z1vTrX2
あ、質問だからID出しておくわ
自演と思われたら嫌だからな
>>544 > ならなんで62より大きな値が文字になってるの?
基数変換しているからでは?(ハッシュ計算はしてない)
>>555 はたから見てもお前の負けだ、もう諦めろ
>>558 あ、勝利宣言ってやつですね(笑)
よく負けた奴が言う言葉です。
560 :
Name_Not_Found:2015/01/05(月) 02:56:07.87 ID:7Z1vTrX2
>>557 基数変換を用いるハッシュ法ってあるよね??
>>558 そういうところまで
行動がセオリー通りだなw
>>561 お前さんはとっくに論破されてるのにまだ気付いてないのか
>>560 それはハッシュ計算をした後で基数変換をしているだけだよ。
だから、ライブラリによっては
最終的な表示をバイナリにするか文字にするか、
文字にするなら16進数にするかbase64にするか
決められるわけ。
文字にする変換(基数変換)処理の前段階が、ハッシュ計算という。
>>562 そういうどうでもいいレスするならいなくていいよ
>>564 学歴低そう
理解するためにちゃんと勉強しなさい
質問者も納得したようなのでこれで終了かな。
>>563 この場合、計算されたハッシュはハッシュテーブルでしょ?
やってることはハッシュ化って言えるんじゃないの?
569 :
Name_Not_Found:2015/01/05(月) 03:03:55.33 ID:7Z1vTrX2
シャッフルテーブルだった
あと568は俺です
>>567 間違ってるのに反論してる気になって終了ですか?
>>568 ハッシュテーブル? shuffleTable のこと?
これは、文字に変換する時に使うための
文字を入れ替えるためだけのもので
前段階のハッシュ計算(存在しないが)には使われてない。
だからコードの順番を変えて基数変換した後に
文字を入れ替えることでも同じ結果が出せる
(=ハッシュ計算で使われてない証拠)
>>569 > 569 名前:Name_Not_Found[] 投稿日:2015/01/05(月) 03:03:55.33 ID:7Z1vTrX2
> シャッフルテーブルだった
> あと568は俺です
ID出したり消したりと自作自演してるから忘れるんだよw
573 :
Name_Not_Found:2015/01/05(月) 03:08:46.64 ID:7Z1vTrX2
>>571 ん?基数変換を用いたハッシュ法の話だよね?
そこで言うハッシュ計算って具体的に何を示してるの?
560 名前:Name_Not_Found[] 投稿日:2015/01/05(月) 02:56:07.87 ID:7Z1vTrX2
>>557 基数変換を用いるハッシュ法ってあるよね??
562 名前:Name_Not_Found[sage] 投稿日:2015/01/05(月) 02:57:12.17 ID:???
>>561 お前さんはとっくに論破されてるのにまだ気付いてないのか
569 名前:Name_Not_Found[] 投稿日:2015/01/05(月) 03:03:55.33 ID:7Z1vTrX2
シャッフルテーブルだった
あと568は俺です
>>560==
>>562だろうなw
575 :
Name_Not_Found:2015/01/05(月) 03:09:45.06 ID:7Z1vTrX2
>>572 いや、自動でsageるように設定してるだけ
>>573 だからこのcreate62Hashは、ハッシュ計算を何もしていないから
ハッシュではないという話。
ただの基数変換をしているだけ。
>>574 は?違いますけど?
都合が悪くなるとなんでも自演扱いするんだな
>>577 お前はもういいよ。ID:7Z1vTrX2とまじめに会話するからさw
579 :
Name_Not_Found:2015/01/05(月) 03:15:38.78 ID:7Z1vTrX2
>>576 単なる基数変換じゃないと思うけど。
それなら10進数値の総数がそのまま62進数になるよね?
これは基数変換を用いたハッシュ化だと思う
580 :
Name_Not_Found:2015/01/05(月) 03:19:48.29 ID:7Z1vTrX2
あ、けど俺はハッシュであろうがなかろうがどうでもいい事なんで。
疑問に思ったから質問してるだけです
もう寝る。レス汚しすまん
>>579 基数変換して、単一換字変換しただけ。
だから単純に数字の順番通りに、文字も変わっていって
簡単に次の文字の予想がつく
16進数で0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F の代わりに
6,7,8,2,3,B,9,0,1,C,4,5,A,D,E,F という順番で
単一換字変換させるのと一緒。
だからハッシュ計算と呼べるものは何もない。
質問者も寝たようなので、これで終わりかな。
じゃあ俺も寝るか。
>>581 お前のハッシュは予想が付いたらハッシュと呼べないのか?
散々言われてるように勉強してこいって
乙。途中荒れたけど、終わりよければ全てよしということでw
477 Name_Not_Found sage New! 2015/01/05(月) 00:46:17.29 ID:??? [0]
暗号学的なhashもあれば、単にデータを区別する値もhashと言うよな
ほんとこれ
否定してる奴はこれを100回読んで理解しろ
はい、逃げた
都合が悪いとなんでも自演扱いして
自分の誤りを認めなれない低脳でしたとさ
思い込みって怖い
間違った反論しかしてなくて、それを正しいと思ってるからたち悪いね
581の頭は一生治らなさそう
まだやってるw 必死だねぇ
>>588 だな
どうしてお前はそんなに必死なんだ?
誤りを認めたくない気持ちはわかるが、そんなんじゃこの先生きていけないぞ
必死に否定してる奴って変な宗教でもやってるのかなぁ
コードも理解できてないし学も無いようだし。。。
親も馬鹿なんだろうね。可哀相
ばーかばーか
またはじまったよバカのスレの無駄遣い
1から10までの値の入った配列から指定した値から偶数以外の値をランダムで1個取得する方法で
これ以外に違う書き方を教えてください
var a = [1,2,3,4,5,6,7,8,9,10];
var b = [];
for (var i=0; i<10; i++) {
if (i % 2) {
b.push(i);
}
}
console.log(b[Math.floor(Math.random()*b.length)]);
>>596 1から10は小さい順に10個固定なのか?
そのコードだと
var a = [2,3,4,5,6,7,8,9,10, 1];
時困るだろ?
あと
var a = [2, 4, 6, 8];
の時どうなるのか? とか、
>>596以外にという以前に
>>596があっているのか?
>>597-598 var a = [2,3,4,5,6,7,8,9,10, 1]; でも僕のコードでは困ってませんが具体的にどのような事で困りますか?
1から10までと提示したのでvar a = [2, 4, 6, 8]; というのは考えないで構いません
奇数しか使わないんだったら最初から奇数の入った配列でよくない?
それとaって使っていないように見えるんだが・・・
あ、すいません
var a = [1,2,3,4,5,6,7,8,9,10];
var b = [];
for (var i=0; i<10; i++) {
if (a[i] % 2) {
b.push(a[i]);
}
}
console.log(b[Math.floor(Math.random()*b.length)])
奇数の配列を用意するために必要な処理です
>>599 あっそ? 困ってないんだw
1から10までのが入った配列固定なんだw
じゃあ、答えは
Math.floor(Math.random()*5)*2+1;
これでいいよ。
配列の中に入っている値が関係なくて
固定なら配列を使う理由もない。
ま、あなたに出された宿題の答えとしては
間違ってるんだけどねw
>>603 配列の値をフィルターすることが主体なのでそれは参考になりません
>>596 lodash使えば簡単
var a = [1,2,3,4,5,6,7,8,9,10];
var b = _.filter(a, function(num){return num % 2});
console.log(_.sample(b));
一行で書くなら
console.log(_.sample(_.filter([1,2,3,4,5,6,7,8,9,10], function(num){return num % 2})));
607 :
606:2015/01/21(水) 21:34:03.01 ID:???
アロー関数を組み合わせれば更に短く
console.log(_.sample(_.filter([1,2,3,4,5,6,7,8,9,10], num => num % 2)));
608 :
606:2015/01/21(水) 21:44:15.26 ID:???
filterの所はEMCAScript5を使ったほうがわずかに短いな。
アロー関数を使えるならばEMCAScript5に対応しているはずなので。
console.log(_.sample(_.filter([1,2,3,4,5,6,7,8,9,10], num => num % 2)));
console.log(_.sample([1,2,3,4,5,6,7,8,9,10].filter(num => num % 2)));
これってできませんでしたっけ?
var test;
test.hoge=0;
昔できたような気がするんだけど
webaudioapiでmp3をソースにした時に時間を指定してエフェクトをかけるとかできませんか?
例えば1:05の時のアナライザデータ取得とか
昔できたとしても出来る方がおかしいんだから
そんな書き方しなければいい
はい論破
ダンガンロンパ
>>610 ECMAScriptの方言のActionScript1.0だと、その書き方でもエラーにならない
undefinedにプロパティあるのはどう考えてもおかしい
はい論破
var test = {hoge:0};
これで万事解決
くるりんぱ