+ JavaScript の質問用スレッド vol.25 +
…ポインタなんて実装上の話すっとばしていいと思うんだけど。
「代入演算子は、左辺の変数に右辺の評価結果の値(オブジェクト含む)を代入する」
じゃ、却って混乱するのかな。
>>97-99 あんた黙ってくんないかな。自分一人で混乱してれば。
>>100 たくさん実在するよ。
>>101 どっちかというとプロパティに言及しないと理解しづらい。
var d = document.form1.input1;
では変数dに入力部品オブジェクトが入る。続いて
d.value = なんとか
でその入力部品オブジェクトのvalueプロパティが設定される
から入力欄の中身が書きかわる。
var d = document.form1.input1.value;
では変数dには入力部品オブジェクトのvalueプロパティの値
つまり単なる文字列が入る。続いて
d = なんとか
では変数dにそのなんとか、を入れるだけで、入れる前の値は
失われるし、入力部品には何の影響もない。
javascriptでは数値、文字列、倫理はプリミティブ型です。
オブジェクトはポインタです。
糸冬 了
typeof document.form1.input1; // object
typeof document.form1.input1.value // string
JavaScriptに倫理なんてものがあったとはシラナカータよ(ry
数値オブジェクトも文字列オブジェクトも論理オブジェクトも
存在はするよ。でなかったらメソッドが呼べまい?
最初のころはプロパティの書き換えとメソッドの区別がよくわかんなかった
106 :
Name_Not_Found:04/01/29 17:40 ID:BXjsLdpN
論理オブジェクトって何?
皆様回答ありがとうございますm(_ _)m
とりあえずHTMLに設置済みのオブジェクトの値に対しては
d.value が省略の限界ということですね。
109 :
Name_Not_Found:04/01/29 18:47 ID:BXjsLdpN
>>107 へぇ〜。true や false を専門家は論理オブジェクトと呼ぶのか。
>>109 true/falseという値を論理オブジェクトとは言いません。
論理(Boolean)値と論理(Boolean)オブジェクトは別の概念です。
new Boolean(true|false|null|NaNなど)で論理オブジェクト生成。
112 :
Name_Not_Found:04/01/29 20:23 ID:4AmscsBX
>>112 onmouseover で scrollBy を setInterval で繰り返し実行し
onmouseout で clearInterval、とかその辺では。
114 :
Name_Not_Found:04/01/29 20:55 ID:kWhxi0JQ
ウインドウサイズを最大化するにはどうしたらいいでしょう?
新たにウインドウを開かずに、今見ているウインドウを最大化したいんです。
resizeTo( x , y )
ですることになると思うのですが、
検索しても最大化するのが出てきません。
x=screen.width;
y=screen.height;
moveTo(0,0);
resizeTo(x,y);
が限界でしょうか?
これだと画面いっぱいのサイズにはなりますが、
右上の最大化ボタンが押された状態にはなりません。
右上の最大化のボタンが押された状態にしたいのです。
質問というには漠然としているのだけど、ちょっと書かせてください。
JavaScriptで継承をするとき、どんなやり方をするのが良いと思いますか?
http://starry.night.nu/diary/?key=183 このやり方が割とよいと言われているけど、あまりそうは思えない。
instanceof 演算子が使えないからです。
現代の JavaScript の機能をもっとも生かす形で継承を行えるのは
どんなやり方だと思いますか?
//instanceof が使えないことを示すサンプルコード
var A = function(){};
var A2 = function(){};
A2.protopype = A.prototype;
var B = function(){};
B.prototype = new A2();
var b = new B();
alert(b instanceof B);// true になる。
alert(b instanceof A);// false になってしまう!
116 :
Name_Not_Found:04/01/29 21:57 ID:BXjsLdpN
<style>
.test { color:red; }
</style>
これで、class="test" などとなっているものをあるアクションで全て
color:black; などと変更したいのですが、どのようにしたら良いのでしょうか?
document.getElementsByTagName("style")[0].innerHTML = ".test {color:blue;}";
としてみましたが、この部分のinnerHTMLは書き込み禁止らしくエラーとなります。
>>116 innerHTMLに頼らずにDOM2でスタイルシートを操作すればできるよ。
ただし、IEではスタイルシート回りの構造がDOM2からやや外れていて
DOM2に準拠しているGeckoと振り分ける必要があったように思う。
>>116 document.styleSheets[0].rules[0].style.color='blue';
# DOM2CSS では rules ではなく cssRules
>>116-118 既に用は済んでしまったみたいだけど、過去ログvol.14の534番に
類似したサンプルあったよ。
>>115 × A2.protopype = A.prototype;
○ A2.prototype = A.prototype;
...一瞬ハマッたじゃないか!!
121 :
115:04/01/29 23:10 ID:???
>>120 ×proto[p]ype
○proto[t]ype
これは申し訳ない!
単なる私の間違いでした!
122 :
Name_Not_Found:04/01/29 23:12 ID:BXjsLdpN
>>117-118 有り難うございます。出来ました。
NN7では動かなかったですけど色々やってみます。
>>122 だからGeckoとIE両方対応には振り分けるしかないってば。
>>119 が言及してる例も振り分けてるでしょ?
124 :
Name_Not_Found:04/01/29 23:57 ID:/UEYu4Iv
aを定義しておいてbは特になにもいれないで
test.html?a=b
な感じで来たらaにbを代入するのはJavascriptでできる?
もしできるとしたら特別な記述必要?
126 :
Name_Not_Found:04/01/30 00:46 ID:Z1snyv7K
全てのinput がクリックされた時に動かしたい処理があり、全部にonClick="func()"
と書くのが無駄に思えて、onloadの処理の中に、
var tag = document.getElementsByTagName("input");
for(var i=0; i<tag.length; i++){
tag[i].setAttribute("onclick", "func()");
}
とinputの全タグにonClickをセットしたんですが、動きません(;_;)
何故なんでしょうか?
コンストラクタに関する質問です。
Object クラス以外のオブジェクトを拡張したいときは、普通はコンストラクタの内部で
明示的にオブジェクトを生成して return します。
しかしこれは、プロトタイプに登録したメソッドを参照できませんし、instanceof
も使えません。
他にうまいやり方はないでしょうか?
var A = function(value){
var obj = new String(value);
obj.showMessage = function(){
alert(this);
}
return obj;
};
A.prototype.wrongMessage = function(){
alert(this);
}
var a1 = new A("foo!");
a1.showMessage();//"foo!"と表示。
alert(a1 instanceof A);// false と表示。
alert(a1 instanceof String); //true と表示。
a1.wrongMessage();//エラー。a1.wrongMessage is not a function
>>115 var A = function(){};
var B = function(){};
B.prototype = new A();
var b = new B();
Formのチェックボックスをクリックしたら
その時点の時刻を取得したいのですが
どのように書けばよいでしょうか。
ヒントでもよいので教えてください。
自己解決しました。
<html><head><title>チェックボックスをチェックしたら時間を取得</title>
<script language="JavaScript">
<!--
function getNowTime() {
date=new Date();
year=date.getYear();
mont=date.getMonth()+1;
days=date.getDate();
hour=date.getHours();
minu=date.getMinutes();
seco=date.getSeconds();
if(mont<10){mont="0"+mont;}
if(days<10){days="0"+days;}
if(hour<10){hour="0"+hour;}
if(minu<10){minu="0"+minu;}
if(seco<10){seco="0"+seco;}
document.check.time.value=year+mont+days+hour+minu+seco;
}
//-->
</script>
</head>
<body>
<form action="./test.html" method="get" name="check">
<input type="checkbox" name="time" value="" onFocus="getNowTime();">
<input type="submit" value="submit">
</form></body></html>
montとかminuとかsecoとか初めて見た…
>>128 よく解らんが、こういう話?
var cf = function(){};
cf.prototype = String.prototype;
function A (v) {
this.toString = this.valueOf = function(){return v;}
};
A.prototype = new cf;
A.prototype.showMessage = function (){ alert(this); }
var a1 = new A("foo!");
a1.showMessage(); // "foo!"
alert(a1 instanceof A); // true
alert(a1 instanceof String); // true
>>132 幅がそろってないと気持ち悪かったので…。
自分も初めてそんな書き方しました。
>>126 for(var i=0 ; i<tag.length ; i++){
tag[i].onclick = function(){ func(); };
}
では?
冗長
137 :
Name_Not_Found:04/01/30 12:09 ID:pZ3bqyvu
配列操作についての質問をさせてください。
配列 myarr に7つの整数が入っています。ex. myarr=(0,8,2,0,1,3,0)
ループ1周ごとに全ての値を-1し、全て0にする場合、
while(myarr != (0,0,0,0,0,0,0)){
for(i=0; i<myarr.length; i++){
if(!myarr[i]) myarr[i]--;
}
}
こうしようと思うのですが、どうも冗長な感じます。
配列要素全てが0であることの確認や
配列様子全てにデクリメントする方法が他にあれば教えていただけないでしょうか。
>>137 そういうまとまった扱いがやりたければMLとかLispみたいな言語を使うんじゃ
ないかな。JavaScriptではできない。myarr != (0,0,0,0,0,0,0) もダメね。
地道にコーディングすれ。
139 :
137:04/01/30 14:01 ID:???
実はあれから進めてみると
デクリメントで0ではなくインクリメントで15でした。
最終的にループのチェック部分は
if(myarr != "15,15,15,15,15,15,15")
としインクリメント部分もfor文を使いました。
回答ありがとうございました。
javascriptでperlのファイルテスト演算子みたいなのって存在しますか?
if (-e $file) {
# ファイル有
} else {
# ファイル無
}
上記はperlのコードですが、こんな事をしたいのですよ。
141 :
140:04/01/30 15:12 ID:???
ってよくよく考えたらクライアント側で動作するjavascriptで
サーバ側のファイルを確認出来る訳ないですね。(汗
142 :
Name_Not_Found:04/01/30 16:41 ID:eMmRZmep
サブウィンドウをランダムに開きたいのですが、
僕、もうダメです。
どうか助けてください。
今はこんな状態で、文字列からサブウィンドウを開いてます。
■HEAD〜/HEAD
<SCRIPT language="JavaScript">
<!--
function WinOpen(){
window.open('AAA.html','window2');
}
// -->
</SCRIPT>
■BODY〜/BODY
<a href="javascript:WinOpen();">サブウィンドウを開く</a>
AAA.htmlをどーにかして、
3個ぐらいのhtmlをランダムにサブウィンドウで表示させたいんですが・・・。
他にも方法があるんだろうなーとか思いながらほぼ1日。
頭がぐちゃぐちゃになりました。
どうか助けて下さい。
function WinOpen() {
var pages = ['AAA.html','BBB.html','CCC.html'];
var choice = pages[Math.floor(Math.random()*pages.length)];
window.open(choice, 'window2');
}
過去ログ見ればこういうランダムな選択は山のように載っている。
過去ログ読めない奴は2度と来てほしくない。
144 :
142:04/01/30 16:49 ID:eMmRZmep
>>143 過去ログ読まなくてすみません。
初心者ですみません。
でも、教えてくれてありがとうございます。
僕はあなたのこと好きです。
145 :
Name_Not_Found:04/01/30 17:29 ID:y+ZobYN9
あるページにアクセスされたら、自動でブラウザウィンドウを
クローズしたいのですが、Windows IEだとどうしても一度
「このウィンドウを閉じますか」というダイアログが出てしまいます。
これをダイアログの出現を回避して、ウィンドウをクローズする
スクリプトは書けないものなのでしょうか?
>>145 過去ログ探せ。ブラウザのバグだから修正されたらそこまでだ。
149 :
Name_Not_Found:04/01/30 18:24 ID:0EPY8kK2
すいません、悩んでいるんですが、
HTMLページの中にtextareaがあって、
document.getElementById("txt").value
で、そのテキストエリアの文字列を取得するのですが、
ここで、処理する時の文字コードは、
IEやMacの場合は、Shift_JISになるんですかね?
ちなみにページのエンコーディングはEUC-JPです。
ウニコード
151 :
Name_Not_Found:04/01/30 19:16 ID:Z1snyv7K
>>145 opener = window;
close();
ソース見てわからなければ諦める。
すみません、初歩的なミスかも知れませんが・・・。
<SCRIPT LANGUAGE="JavaScript">
<!--
today=new Date();
Mo=today.getMonth()+1+",";
Mo2=new Array(
Mo2[0]="Jan";Mo2[1]="Feb";Mo2[2]="Mar";Mo2[3]="Apr";Mo2[4]="May";Mo2[5]="June";Mo2[6]="July";Mo2[7]="Aug";Mo2[8]="Sep";Mo2[9]="Oct";Mo2[10]="Nov";Mo2[11]="Dec");
Da=today.getDate()+" ";
switch(Da)
case 1:
Da="1st";break;
case 2:
Da="2nd";break;
case 3:
Da="3rd";break;
default:
Da="Da+th";
Day=today.getDay();
Day2=new Array(7);
Day2[0]="SUN";Day2[1]="MON";Day2[2]="TUE";Day2[3]="WED";Day2[4]="THR";Day2[5]="FRI";Day2[6]="SAT";
document.write("<FONT style='font-size : 16px; color : #666666'>");
document.write(Da+Mo2[Mo]+Day2[Day]+"</font>");
//--> </SCRIPT>
どこが間違ってるかわからないんです。・゚・(ノД`)・゚・。
日付をこーゆー書き方してるサンプルって無いんですね。
どこがいけないのか教えて頂けませんか?
>>155 たぶん数値計算と文字列結合がごっちゃになってるところ。
とりあえずカンマとかスペースとかは表示直前の一番最後に結合すればいいかな。
あと配列に要素代入する時は
Mo2 = new Array("Jan","Feb","Mar","Apr"〜〜"Dec");
でOK。
> Da=today.getDate()+" ";
Da=today.getDate();
<SCRIPT type="text/javascript">
<!--
today=new Date();
Mo=today.getMonth()+1;
Mo2=new Array("Jan","Feb","Mar","Apr","May","June","July","Aug","Sep","Oct","Nov","Dec");
Da=today.getDate()+" ";
switch(Da){
case 1:
Da="1st";break;
case 2:
Da="2nd";break;
case 3:
Da="3rd";break;
default:
Da=Da+"th";
}
Day=today.getDay();
Day2=new Array("SUN","MON","TUE","WED","THR","FRI","SAT");
document.write("<FONT style='font-size : 16px; color : #666666'>");
document.write(Da+Mo2[Mo]+Day2[Day]+"</font>");
//-->
</SCRIPT>
159 :
155:04/01/30 22:15 ID:???
>>156-158 迅速なレスありがとうございました ペコリ(o_ _)o))
プログラミングって奥が深いっすねぇ・・・・。
こんなの覚えられるか不安になりますw
実はこれデスクトップの背景にくっつけようと思ってるんです。
.htmlを背景にすると結構色々出来るから面白いですよねぇ〜。
ちょとイイかい?
str = str.replace(/(.)/g,RegExp.$1+"-");
と書いても RegExp.$1 に値が入らないんだな。
仕様が無いんで
str = str.match(/./g).join("-");
と書いてみるも何か気持ち悪い。
replace(); 中でマッチした値って置き換えで参照できないんかな?
var month_arr = new Array("Jan","Feb","Mar","Apr","May","June","July","Aug","Sep","Oct","Nov","Dec");
var day_arr = new Array("SUN","MON","TUE","WED","THR","FRI","SAT");
var today = new Date();
var month_str,day_str,date_str,display_obj,display_str,b;
month_str = month_arr[today.getMonth()]; // 月の名前
day_str = day_arr[today.getDay()]; // 曜日の名前
switch(today.getDay()%10){
case 1:
date_str = today.getDay() + "st"; break;
case 2:
date_str = today.getDay() + "nd"; break;
case 3:
date_str = today.getDay() + "rd"; break;
default:
date_str = today.getDay() + "th";
}
display_str = document.createTextNode(date_str+","+month_str+","+day_str);
function func(){
display_obj = document.getElementById("disp");
display_obj.style.fontSize = "16px";
display_obj.style.color = "#666666";
display_obj.appendChild(display_str);
}
window.onload = function(){ func(); };
162 :
128:04/01/30 23:17 ID:???
>>133 ご返事遅くなって申し訳ありません。
まさにそれです!
alert(a1.indexOf("!"));// 3
が動作したのには驚きました。
しかし、この方法は汎用的なのでしょうか?
toString()のみをオーバーライドするだけで済む String()は例外のような
気がします。
例えば、Array() について、似たようなものを試みましたが、うまく
行きませんでした。
163 :
128:04/01/30 23:18 ID:???
続きです。
稚拙ですみませんが、試みたコードを載せます。
var cf = function(){};
cf.prototype = Array.prototype;
function A (v) {
this.toString = this.valueOf = function(){arguments.toString()};
};
A.prototype = new cf;
A.prototype.showMessage = function (){ alert(this.toString()); }
var a1 = new A("foo!", "bar!");
a1.showMessage(); // "foo!"
alert(a1 instanceof A); // true
alert(a1 instanceof Array); // true
alert(a1.length);// 0 … 2になって欲しい。
JavaScriptって外部ファイルを読み込むことはできないんでしょうか?
サイトの更新履歴をテキストファイルに書いて、
それをJavaScriptで読み込んで表示させたいのですが。
>164
JavaScript自身にはできないだろね。
でも、フレームとかを上手く使えばできるかもね。
>>163 コンストラクタが引数をどのように処理するかはコンストラクタごとに違うので
汎用的な方法は存在しないだろう。
Arrayの派生クラスのコンストラクタは原理的に作れない(意図した動作をしない)。
length は Array.prototype のプロパティではない(つまり継承されない)し、
あの独特の動作(自動でlengthが変わったりlength=0で他のプロパティが消去されたり)は
Arrayコンストラクタが付与する内部関数を伴うものなので
Arrayコンストラクタから直に作られたオブジェクトでなければああいう動作をしない。
>>165 フレームですか。
それをヒントに頑張ってみます。
ありがとうございました。
>>160 abc を a-b-c- にするのなら
str.replace(/(.)/g,"$1-");
>>168 なるほど、クヲートで括れば$nで参照できるんだ。
すっごいスッキリ。ありがとう!
170 :
128:04/01/31 02:03 ID:???
>>166 ありがとうございます。
やはり、汎用的な方法は存在しませんか。
実は、JavaScript 2.0 からクラスが導入されたのはなぜなのかを考えて
いました。
私見ですが、プロトタイプベースでは、継承を汎用的に扱えないからでは
ないかと思っています。
現行の JavaScript では、(このコードは思いつきですが)
function A () {
arguments.showMessage = function(){ alert(arguments) };
return arguments;
};
など、コンストラクタ内で明示的に return する以外は、Array() を継承できませんし、
しかし継承しても、コンストラクタ A に対して instanceof 演算子は使えないなど、
不便が多いと思います。
クラスがどのような経緯で導入されたか、ご存知の方は教えていただけないでしょうか?
171 :
128:04/01/31 06:01 ID:???
訂正です。
>>170のコードは動かないので、きちんと動くコードを用意しました。
function A () {
var arr = new Array;
for (var i = 0; i < arguments.length; i++) arr.push(arguments[i]);
arr.showMessage = function(){ alert(arr) };
return arr;
};
A.prototype.wrongMessage = function(){ alert(this); };
var a1 = new A("foo!", "bar!");
a1.showMessage(); // "foo!,bar!"
alert(a1 instanceof A); // false … trueになって欲しい。
alert(a1 instanceof Array); // true
alert(a1.length);// 2
a1.wrongMessage();//実行エラー a1.wromgMessage is not a function
>>171 コンストラクタの作り方が分かってないよ。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>???</title>
</head><body>
<pre><script type="text/javascript">
function A() {
for(var i = 0; i < arguments.length; ++i) this.push(arguments[i]);
this.showMessage = function() { alert(this); }
}
A.prototype = new Array();
A.prototype.wrongMessage = function() { alert(this); }
var a1 = new A('foo!', 'bar!');
a1.showMessage();
document.writeln(a1 instanceof A);
document.writeln(a1 instanceof Array);
document.writeln(a1.length);
a1.wrongMessage();
</script></pre>
</body></html>
173 :
128:04/01/31 09:16 ID:???
>>172 驚きました。コンストラクタ内の
this.push(arguments[i]);
こんなことができるとは思っていませんでした。
試したところ、
var o = new Object;
Array.prototype.push.call(o, "hoge");
alert(o.length); //1
alert(o[0]); //"hoge"
これもちゃんと動きました。なるほどねえ。
こうすれば Array も return なしで継承することができるのですね。
恐縮ですがさらに質問です。JavaScript のネイティブオブジェクトの
うち、継承するには必ず、コンストラクタ内で return を書くことを
必要とするものはないのでしょうか?
まだ慣れないので、String, Array は幸運な例外のような気がします。
とりあえず私は Function あたりを試してみることにします。
174 :
128:04/01/31 09:36 ID:???
試作品です。私の実力では、Function をどうやって return なしで
継承できるのか分かりません。
<script type="text/javascript">
function A(string) {
this.toString = this.valueOf = function() { return string; }
}
A.prototype = new Function;
A.prototype.wrongMessage = function() { alert(this); }
var a1 = new A('alert("hoge")');
document.writeln(a1 instanceof A); // true;
document.writeln("<br/>");
document.writeln(a1 instanceof Function); // true
document.writeln("<br/>");
document.writeln(a1);// alert("hoge")
document.writeln("<br/>");
a1.wrongMessage(); // alert("hoge");
a1();//エラー a1 is not a function
</script>
175 :
Name_Not_Found:04/01/31 10:10 ID:C5mD9gOz
良く分からないんだけど...。
a1();で何が動くと希望どおりなの?
pushやpopってネスケ専用と思ってた…
IEでも使えること今まで知らんかった
177 :
128:04/01/31 10:29 ID:???
>>175 一応、
>>174 のコードの目的は、a1(); で "hoge" というアラートが表示
されることですが、それは本質的な目的ではありません。
本題に話を戻しますと、私が知りたかったのは、Class の導入された理由なのです。
JavaScript はプロトタイプを利用することによって、オブジェクト指向言語として
十分な機能を備えていると、よく言われています。
それならばなぜ、Class が導入されたのか、それを私は知りたかったのです。
で、考えているうちに、JavaScriptは継承の機能が不十分ではないかと思うように
なったのです。
具体的には、ネイティブオブジェクトの継承において、
・コンストラクタ内の return なしでは、継承元のオブジェクトについての
かなり詳細な知識なしでは継承ができない。
・return を使うと、 instanceof 演算子が使えない。
・要するに、汎用的な継承の方法がない。
これらは事実だと思うのですが、どうでしょうか?
もし事実だとすると、その機能を補うべく、汎用的な継承の機構を用意するために、
Class が導入されたと考えれば、つじつまが合うように思い、それについて、詳しい方の
意見をお聞きしたいと思ったのです。
どんな言語でも「何でもできる」というわけには行かないわけで、
言語の設計は「機構の簡潔さ」と「記述力のバランス」をいかに
取るかという点がポイントだと思うのね。その点で現行のJavaScript
はよくできてると思うし、個人的にはクラス構文なんて入れるのは
反対だけどね。
クラスを入れる理由は想像するに「その方が読みやすい」からでは。
現状の設計で継承をあれこれいじるのはたとえできたとしても何を
やってるのか後から読んで理解するのが難しい。だから能力的に
不足するかどうかなんて検討してもしょうがないと思うね。
で、自分の意見としては面倒な継承がいるようなものはJavaScript
の守備範囲ではないと思うけどね。だから現行くらいの簡潔な言語
であり続けて欲しいわけさ。
てか単に需要が高いからかと。
何だかんだいってクラスのエミュレーションに終始してるだけのコード多いし。
だったら最初から言語仕様に組み入れてしまった方がいい。
>>179 俺もそれ知りたいな、どっかコピペで簡単に設置できるサンプルないかな・・・
>>179 どこのことだ。「ゲーム」のとことかでプルダウンメニューが
出るところか。
183 :
Jean:04/01/31 13:56 ID:yDMFLiL3
教えてください。
戻る・進むのボタンで、画像を入れ替えるスクリプトを使っているのですが、
そのスクリプトを二つ設置するとうまく画像が入れ替えることができません。
分かりづらいと思うので実際に見てください。
http://betty.jp/mmmmbop/art/ よろしくお願いいたします。
>>183 同じものを2つコピーして設置しようと思うところで既に論外。
同じ名前の関数を2つ定義したら2重定義だからよくて片方だけ
しか残らない。覚えておくとよろしいでしょ。あとは勉強すれ。
185 :
Jean:04/01/31 15:31 ID:yDMFLiL3
>>184 やっぱり無理ですか。
勉強になりました。
javascriptの勉強を頑張って設置できるようにしたいと思います。
いちばん安易には関数の名前を片方だけちょっと変える。
もっといいのは関数は1つで、画像の名前をパラメタで
渡せるようにする。
187 :
128:04/01/31 16:17 ID:???
>>178 私も JavaScript はシンプルで美しい言語だと思っていました。だから クラスの
導入にも賛成でなかったのですが、最近、JavaScript のコーディングルールを
作ろうとしているうちに、実はあんまり統一性のない言語ではないかという気がして
きたのです。
プロトタイプやクロージャも、継承を実現するために後付けで導入されたもので、
機能同士の整合性が低いように感じます。また言語が用意しているある機能を使うと、
別の機能が使えなくなることが頻繁にあると思います。その一例が、先にあげた、
コンストラクタ内で return を返すと、 instanceof が使えなくなることです。
こういうのを、直交性が低いと言うのでしょうか。
また、機能の追加が割と行き当たりばったりで、やがて非推奨になる機能がかなり
多いと思います。例えば instanceof 演算子自体、constructor プロパティの欠陥を
補うために導入されたものですよね。
それにしても、コンストラクタ内で return 値を返す場合でも instacnceof が使える
ようにする方法はないものでしょうか?代替手段があるなら、return 値を返さなくても
良いでしょうが、その方法でしか継承できないオブジェクトがあるので、どうにか
ならないものかと思います。
188 :
179:04/01/31 16:21 ID:???
説明不足でした。
左側のメニューにマウスを持っていくとテーブルで組んである部分の
背景色らしきものが変化します。その仕組みがわかりません。
「製品情報」〜「企業情報」までの部分です。
>>188 それだけならスタイルシートだな。
A:hover
これでボーダーの色は黒で背景は灰だのと指定する。
190 :
179:04/01/31 17:18 ID:???
>>189 a:hover { border-color:#black; background-color:#666666; }
cssも考えたのですが、この場合だと例のようなtableのtd(tr?)部分全体を
変えることが出来ないんです。なのでjavasvriptを使用しているのかなと考えました。
aのwidth, heightをtdに合わせたらできないかな?
tdのpaddingは0で。
だいたいCSSでできない範囲指定がJavaScriptでできるわけがない。
>>187 JavaScriptは継承をサポートしていない。
”できる”だけ。
まともにJavaScriptを使おうと思ったら継承なんて考えてはいけない。
>>193 どういう使い方が「まとも」なの?
いや、煽りじゃなくて、手短でいいから教えてほしい。
だいたいJavaScrptって何百行も書くための言語じゃないんだから、
継承を駆使してあれこれするのは用途違いという感じがする。うまく
使える場面でちょこっと利用するのは構わないと思うけどね。
198 :
179:04/01/31 20:53 ID:???
>>191-192 >>195 cssで上手くいきました。スレ違いになってしまい申し訳ないです。
以降は該当スレに移動します。ありがとうございました。
199 :
Name_Not_Found:04/01/31 23:28 ID:C5mD9gOz
>>197 何百行も書くかどうかは用途によるね。
数千行も書いている俺みたいのもいるし(実際は千ちょっと)。
そのうちコンパイルしてサーバに置けるようになるんだろうな。
個人的には継承とかClassなんかよりも、変数のレキシカルな範囲を
関数単位じゃなくて、{}に変更してほしいんだけどな。
200
そのうちコンパイルどうこうのハナシだったら
素直にC#.NETでいいんじゃなかろうか
203 :
Name_Not_Found:04/02/01 00:44 ID:9pwCI8Ds
>>201 .NETならコンパイルしたもの置いておけるの?
IE限定とか?
継承か…。そしたら多重継承はどうするんだろうね
Javaみたく他の方法を使うかC++のように認めるか
>>199 変数スコープを制限したい場合は
コードを無名変数で区切って、その場で実行するのはどう?
(function(){
// …コード…
// …コード…
// …コード…
})();
こう書けば、内側の変数スコープは独立する。
個人的には、あと package が欲しい…。
訂正:×無名変数 → ○無名関数
>>203 .NETがインストールされてる環境では
アプレットみたいなのを動かせたと思う
.NETが標準インストールされるのは
かなり先の話だろうけど
>>187 クラスのことは分からないが、いくつか書いてみる。
・コンストラクタで return を使わずに ネイティブオブジェクトを継承する
ことは原則的にできない。
コンストラクタ内で 暗黙で this に割り当てられるインスタンスは Object 型
だけだから、それ以外のネイティブオブジェクトは返せない。
String
>>133, Array
>>172 でそれが可能だったのは、Object 型のインスタンスを
加工して String や Array と同等のインスタンスを作ることが可能だったからだ。
しかし、そんな方法がどのネイティブオブジェクトにも存在しているわけでは
ない。だから、これらはあくまで幸運な例外に過ぎない。
・return を返す場合に instanceof 演算子が使えなくなるのは、返された
インスタンスが ネイティブなコンストラクタとだけ関係を持ち、自作の
コンストラクタの prototype プロパティを参照しないからだ。
逆に言えば、無理やりに自作のコンストラクタを参照するようにすれば、
instanceof 演算子は使えるようになる。Netscape 系固有の __proto__
プロパティを使えば、それを実現できる。
以下は、Function オブジェクトを継承するコードの例。
念のためだが、IE では動かない。
function A (string) {
var func = new Function(string);
//Netscape 独自の禁じ手
func.__proto__ = arguments.callee.prototype;
func.showMessage = function(){ alert(this) };
return func;
};
A.prototype = new Function;
A.prototype.wrongMessage = function(){ alert(this); };
var a1 = new A('alert("hoge")');
a1.showMessage(); // function anonymous(){ alert("hoge") }
// どちらも true を返す
alert(a1 instanceof A); // true
alert(a1 instanceof Function); // true
// a1はもちろん実行可能
a1();// "hoge"
// プロトタイプに登録されたメソッドも実行できる
a1.wrongMessage();// function anonymous(){ alert("hoge") }
補足。
今回は Function オブジェクトを継承したが、このやり方なら、どんな
ネイティブオブジェクトでも継承できる。
つまり、__proto__ プロパティさえ使えれば、JavaScriptで汎用的に
あらゆるオブジェクトを継承することが可能になる。
ECMAScript に採用されなかったのは残念だ。
>>211 「プロトタイプを動的に変更できればなぁ」には禿同だけど
プロパティでやるのはちょっとやだな俺は。
ECMA262-4ってたしか今年第1四半期予定だったと思うけど、どうなってんだろうね。
他サイトの変数を参照することは出来ますか?
ちなみに他サイトとは別鯖です。
>>213 そういう悪用し放題なことはできないようにしてあります。
> __proto__ プロパティさえ使えれば、JavaScriptで汎用的に
> あらゆるオブジェクトを継承
継承とは言わないよ。中間変数と言った方が。
というかね、
「JavaScript は Java ではありません。」
と初心者に言う慣例があるのだから、それを徹底した方が良いのではないかな。
つまり、他の言語の用語を使って本質を誤魔化しているのは感心できない、と。
216 :
Name_Not_Found:04/02/01 14:19 ID:Qy1N65B2
>>215 同じ専門用語でも、言語によって意味は変わる。
その通りだが、継承という用語が適切だとはとても思えないがねえ。
この手の「擬似継承」は、内部で new Function とかなんとかしていて、
非道い言い方をすれば、「回り道して遊んでんじゃねえよ」なわけだが、いかがなものか。
>>209-211 __proto__ を使っていいんだったら、インスタンスをコンストラクタを使って
生成することにこだわらなくたっていいでしょ?
どうせ JavaScript の継承は「もどき」に過ぎないんだから、var a1 = new A() という
形にこだわる必要なんか全然ない。
実際、function A() は何もしてないに等しいんだから、コンストラクタを
単なる「プロトタイプの置き場」にしてしまえばいい。
つまり、任意のインスタンス a1 を生成して、それの __proto__ に function A() の
プロトタイプを参照させれば、それだけで a1 は A に属することになる。
ということで、
>>210 と似た動作のサンプルコードを書いてみた。
この方が、実際の動作が判りやすくて、ずっとスッキリしていると思う。
var A = new Function;
A.prototype =
{
showMessage: function(){ alert(this) },
__proto__: Function.prototype//この行がないと、Function の toString が呼ばれない。
}
var a1 = Function('alert("hoge")');
a1.__proto__ = A.prototype;
//(ちゃんと Function の toString() が呼ばれている。)
a1.showMessage(); // function anonymous(){ alert("hoge") }
alert(a1 instanceof A); // true
alert(a1 instanceof Function); // true
a1();// "hoge"
おまけ。
このやり方だと、a1 を生成した後で、別のコンストラクタ B() をこしらえて、
a1.__proto__ = B.prototype;
とかしてやれば、今度は a1 は B に属すことになる。
生成されたインスタンス a1 の属すクラス(つうか、コンストラクタ)を、
あとから動的に変更できるんだ。もちろん、動作も変わる。
これは Java には真似できない。
再利用という奇跡をでっち上げる為に、わざわざこんなものを書いたとする。
Cookie.prototype = new Date;
Cookie.newInstance = function () {
const proto = (new this).__proto__;
return proto;
}
function Cookie ()
{
;
}
const cookie = Cookie.newInstance();
cookie.toGMTString(); // RFC1123
しかし、これは、「ある Date オブジェクト」の参照を使いまわすことになるから、都合悪い。
そういうわけで、210 にあるような、道草擬似継承に逆戻りせざるを得ない。
すぐに、道草して遊んでもなぁ、という結論になるだろう。
最終的には、206 のような使われ方でしか生き残れない、とは思わないかね?
いいかげん熱を冷まさないか。擬似継承、うんざりだよ。
ECMA262-3 は __proto__ じゃなくて __parent__ な方向にあるでしょ。
だから、書式はスコープオブジェクトで統一してはいかがだろう、という提案。
>>212 > プロパティでやるのはちょっとやだな俺は。
これはなぜ?
>>214 クロスサイトスクリプティング脆弱性というのがなかったっけ?
>>222 > 最終的には、206 のような使われ方でしか生き残れない、とは思わないかね?
関連がよくわからない。
>>206は継承とどういう関係があるの?
226 :
Name_Not_Found:04/02/01 16:22 ID:9pwCI8Ds
こういうのを話す新スレ立ててくれ。
>>225 委譲という手法でオブジェクト間の継承を行っているわけなので
「それは継承ではなく委譲だ」と言われても困るような。
> それなのに、クラスベースの言語と同じことをやろうとするから、変な話になる。
これは禿しく同意。
228 :
Name_Not_Found:04/02/01 17:30 ID:V1meDAQb
ステータスバーに何も表示させないようにするには、どうしたらいいですか?
>>228 IEだったらメニューの「表示」→「ステータスバー」のチェックをはずす。
いろいろ調べてみたのですが、たどり着けないので質問です。
java scriptを使用して、あらかじめ定義した複数のフラッシュ(swf)ファイルのうちから
1つをランダム表示させるにはどうすれば良いのでしょうか?
どなたかお教えください。
>>223 > ECMA262-3 は __proto__ じゃなくて __parent__ な方向にあるでしょ。
> だから、書式はスコープオブジェクトで統一してはいかがだろう、という提案。
もう少し詳しく教えていただけませんか?とても興味深いと思いました。
ぐぐったけど、残念ながら参考になるページを見つけられなかった。
ちなみに、Mozilla の JavaScript には __parent__ プロパティがありますが、
試したところ、グローバルオブジェクト(window)に固定されているみたいでした。
>>233 妙なスレだな。「言語の話をしよう」って繰り返し言ってるだけで、ほとんど言語の
話は出てない。単発質問と、こちらへの誘導ばかりだ。
だけど、スレの趣旨にはそちらのほうが沿っているみたい。私はそちらに
行ってみる。
既出だった…
237 :
Name_Not_Found:04/02/02 02:02 ID:5EPozA9N
Document Object Model
(もしくはその他の方法でCGIやSSIを使わないもの)
を使ってNN6で InnerHTMl のような動きを実現させる事って
可能ですか?
具体的には特定のIDを持つタグの中に、スクリプトで作ったHTML文を
挿入させる動作です。
挿入先はHTMLファイルのTDタグです。
240 :
Name_Not_Found:04/02/02 04:03 ID:5EPozA9N
>>239 javascript dom innerhtml
のキーワードで30分位は探してたんですが。
今、同じキーワードで調べたら上から4つめに普通にありましたね・・・。
これからはもう少し念入りに探します。
ありがとうございました
>>240 どうでもいいけど全角英数はキモいのでヤメレ
242 :
TT:04/02/02 10:10 ID:IXRJ7c93
JSが正常に作動しない場合はどうしたらいいのでしょうか?
検索のソフトなのですが、「検索」を押すと「エラーが発生しました」
と表示され、何も起こらないのです・・・。
分かる方教えてください。
>>242 単発質問の重複スレがいかに迷惑か理解しろ。あのクソスレが残っている
間は誰もあんたを相手にしないからそのつもりでいろ。以上まっとうな
煽りでした(w
245 :
Name_Not_Found:04/02/02 11:05 ID:7o4DlR2v
質問があります。
JavaScriptを使って、訪問者の環境(OS&ブラウザ)に合わせた外部CSSを振り分ける方法を教えて下さい。
“WinのネスケとIE、MacのネスケとIE”の4種類あれば良いです。
それ以外の環境でアクセスしてきた場合“WinのIE”用のCSSを振り分けたいです。
すみませんが、よろしくお願いします。
<(..)>
>>245 Netscape 4.xと6以降は別物だけど一緒くたでいいの?
6以降はMozillaと一緒に扱うべきだと思うけどね。
>>245 とりあえず、こうやってmatchで調べて振り分ければいいだけ。何をどう
振り分けるかはこのスレの趣旨と関係ないと思うんでご自由に。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>???</title>
<script type="text/javascript">
if(navigator.userAgent.match(/compatible; MSIE/)) {
document.writeln('<link rel="stylesheet" href="t1.css">');
} else {
document.writeln('<link rel="stylesheet" href="t2.css">');
}
</script>
</head><body>
<h1>Test</h1>
</body></html>
248 :
245:04/02/02 11:42 ID:7o4DlR2v
>>245 Netscape 4.xと6以降は別物だけど一緒くたでいいの?
あ、そうすね!(汗汗汗)
ええっと、おっしゃる通り「6以降はモジラと一緒に扱う」という設定にしたいです。
すみませんが、ご教示下さいませ。
<(..)>
249 :
245:04/02/02 11:45 ID:7o4DlR2v
>>247 どうも、ありがとうございました!
ありがとうございます!
(>o<)
fontサイズや行間をpx指定してもなお、環境によって表示される行数=高さが変わりますが
height:auto; で自動伸縮するdivが結果的にブラウザ上で高さ何pxになったのかを取得できないかと考えているのですが
<div id="div_ID" style="width:固定px;height:auto;">コンテンツ</div>
<script type='text/javascript'>
aaa=document.getElementById('div_ID').style.height;
document.write(aaa);
</script>
これじゃautoという情報しか取得できません。
実際にブラウザ上で高さが何pxになったのか取得する方法はございますでしょうか?
>>250 過去ログ見ると分かるんだけど。styleはあくまでも指定した値が見える
だけで、実際の高さとかが知りたければoffsetWidthとoffsetHeightを参照
する。あとdocument.write()はページが表示完了したらもう使えないんで、
window.alertを使うかステータスバーを使うかとか工夫すれ。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>???</title>
<script type="text/javascript">
function show() {
var d = document.getElementById('d0');
window.status = d.offsetWidth + 'x' + d.offsetHeight;
}
</script>
</head><body onload="setInterval(show, 1000)">
<div id="d0">
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
</div>
</body></html>
252 :
250:04/02/02 15:29 ID:???
251さん、ご親切にありがとうございます。今過去ログ漁っております。。。。
一番の疑問はoffsetHeightはページの描画が全部済んでから渡されるんでしょうか?ということで。
以下のように書くとdiv d0の高さにそろえた別のdivは作れないみたいですね。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>???</title><meta http-equiv="content-type" content="text/html; charset=shift_jis">
<script type="text/javascript">
function show() {
var d = document.getElementById('d0');
alert(d.offsetWidth + 'x' + d.offsetHeight);
var takasa=d.offsetHeight;
}
</script></head><body onload="show()">
<div style="width:400px;height:auto;" id="d0">
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお
</div>
<script type="text/javascript">
document.write('<div style="background-color:gold;width:400px;height:'+takasa+'px;">d0と同じ大きさのdiv</div>');
</script></body></html>
>>252 貴様はとりあえずonloadについて勉強したほうがよいですよ
254 :
Name_Not_Found:04/02/02 16:29 ID:JrM1PDPm
配列をsort()するために、sort用の関数を書いているのですがうまく
ソートしてくれません。構文は間違っていないはずなんですが、何故
ちゃんとソートできないのでしょうか?(★の部分です)
var obj = new Array();
obj[0] = {s:'スズキ'};
obj[1] = {s:'ムラタ'};
obj[2] = {s:'ジンボ'};
obj[3] = {s:'フジキ'};
obj[4] = {s:'サトウ'};
obj[5] = {s:'ワタベ'};
obj[6] = {s:'ソノダ'};
obj[7] = {s:'ミズノ'};
obj[8] = {s:'アキタ'};
// ★データを並び替え
obj.sort(function(a,b){
if(a.s > b.s){
return true;
}else{
return false;
}
});
// データ表示(きちんと昇順になっていない)
var w = window.open();
w.document.open();
for(var i=0; i<obj.length; i++){
w.document.write(obj[i].s + "<br>");
}
w.document.close();
sortの仕様をよく読まないとね。整数を返すんだよね。
obj.sort(function(a,b) { return (a.s > b.s) ? 1 : -1; });
ただしsが同じものはないとする。
256 :
Name_Not_Found:04/02/02 16:44 ID:JrM1PDPm
>>255 有り難うございます。問題はそこだったんだ...。
一生懸命 if(a.s > b.s) の比較部分を頑張ってた(;_;)
257 :
Name_Not_Found:04/02/02 22:00 ID:JrM1PDPm
ある配列(o)で、alert(o.constructor)とすると、
--------------------
function Array(){
[native code]
}
--------------------
と出力されるんですが、
alert(o.constructor == Array)
とするとfalseが出てしまうものがあります。
しかしながら、事象を分かりやすく別のファイルにJavaScriptとして
書くと、ちゃんとtrueになってしまいわけが分かりません。
そのため同事象が起こるスクリプトをここに記述することが出来ない
のですが、何か考えられることはありますでしょうか?
258 :
Name_Not_Found:04/02/02 22:00 ID:L04zfGge
String.fromCharCode(n)を使ってテキストボックス内に韓国語を表示させた場合、
韓国語がインストールされていても文字化けして見えることはありますか?
よろしくお願いします。
>>257 typo が最も有力。
どっかで == と = を間違えて constructor 上書きしてるとかね。
>>258 ブラウザがまともなら心配ないと思われ。
260 :
Name_Not_Found:04/02/03 02:00 ID:kSIMRfZJ
var f = new Func();
とした場合に、f.myself(); としたら変数自身の名前"f"を出力するよう
にしたいのですが、どのようにしたら良いのでしょうか?
現在、以下のようにしてますが、やっぱりダメです。
function Func(){
this.myself = function(){
alert(this.toString());
}
}
>>260 オブジェクトから、自分をさす変数名を知ることはできないと思うから、
変数の一覧からしらみつぶしでやるしかないと思う。
// 変数 f がグローバル変数の場合しか動かないバージョン。
function Func(){};
Func.prototype.myself = function(){
for (var i in window){ //この行がよくない。
if (eval(i) === this) {
alert(i);
return;
}
}
}
var f = new Func();
f.myself();// "f"と表示。
>>261 window オブジェクトを使っているのを、グローバル変数しか検索できないから
良くない、と考えているようだが、ローカル変数を保持する Activation オブジェクト
には触れることができないのだから、それ以上やりようが無いと思う。
263 :
258:04/02/03 15:10 ID:???
264 :
Name_Not_Found:04/02/03 16:10 ID:P/jWbSim
こんにちは。JavaScriptの[window.open()]について教えて下さい。
選択された項目毎に新規に画面を生成する為、window.open("選択された情報へのURL")を利用していますが、
最初の1回目は新規に画面を生成してくれるのですが、2回目からは1回目に生成された画面に情報が出力されてしまいます。
意図する動作としては、[A HREF="選択された情報へのURL", TARGET=_blank]と同じ動きを期待していましたが、
window.open()はそのような事が出来ないのでしょうか?
又は、A HREFと同じ動きをさせる為にはどうしたらよいのでしょうか?
教えて下さい。
OS:Win98
Br:IE6.0(SP1)
266 :
Name_Not_Found:04/02/03 18:04 ID:yVRf5yt+
こんばんは、唐突ですが、質問させてください。クリックでクリップボードに貼り付けたいのですが
以下の>>>>>ここ<<<<<のところが分かりません。よろしくお願いします。
<html>
<head>
<title></title>
<script language="JavaScript">
<!--
function setCB()
{
window.clipboardData.setData("Text",document.color.>>>>>ここ<<<<<.value);
}
// -->
</script>
</head>
<body>
<table>
<form name="color">
<TR>
<TD bgcolor="#000000">.</TD><TD><input type="button" onFocus="this.select()" onClick="this.focus();setCB()" value="#000000"></TD>
<TD bgcolor="#000033">.</TD><TD><input type="button" onFocus="this.select()" onClick="this.focus();setCB()" value="#000033"></TD>
<TD bgcolor="#000066">.</TD><TD><input type="button" onFocus="this.select()" onClick="this.focus();setCB()" value="#000066"></TD>
<TD bgcolor="#000099">.</TD><TD><input type="button" onFocus="this.select()" onClick="this.focus();setCB()" value="#000099"></TD>
<TD bgcolor="#0000cc">.</TD><TD><input type="button" onFocus="this.select()" onClick="this.focus();setCB()" value="#0000cc"></TD>
<TD bgcolor="#0000ff">.</TD><TD><input type="button" onFocus="this.select()" onClick="this.focus();setCB()" value="#0000ff"></TD>
</TR>
</form>
</table>
</body>
</html>
>>266 そういうのは呼び出す方で onClick="this.focus();setCB(this.value)" みたいにやると楽。
>>265 過去スレ見ると分かるんだけど、前はテンプレに入っていたけど
あるとき「とほほはヒドいからやめよう」という話があってそれで
除外した。とほほがいいから入れようという人が多ければ入れるけど。
>>264 window.openの第2パラメタとして「'_blank'」を指定すれ。
>>266 function setCB(x)
{
window.clipboardData.setData("Text", x);
}
<input type="button" onClick="setCB(value)" value="#0000ff">
・onClick 内の this.focus() と onFocus 属性は不要なので消した。
・this.value の this は不要なので消した。
ちなみに this.select() は単に select()と書けばいい。
270 :
Name_Not_Found:04/02/03 18:54 ID:yM0A7uai
あるhtml(元ウインド)上で<a href="JavaScript:ふぁんくしょん()">から
別の鯖にあるCGIに値を渡してCGIで検索させて検索結果をCGI生成し
全面に出し(ポップアップウインド)で表示します。
このぽっぽアップウインド上の中のバリューを元のウインドのフォームの中の
希望の場所に戻したいのですが「アクセスが拒否されたと出てしまいます。」
CGIがある鯖上に元ファイルを置くとうまくいくので問題はここだけなんですが
違う鯖上のCGIで生成されたウインドの中の値を元のウインドのフォームの中に
返すうまい方法はないでしょうか?
以下、ポップアップから元のウインドに値を戻すスクリプト部分です。
<!--//
function modosu() {
window.opener.document.元ウインドのフォーム.hoge.value = document.検索結果のフォーム.hoge.value;
window.close();
}
//-->
検索結果のhogeを元ウインドのhogeに入れてポップアップのウインドを閉じるということがしたいわけです。
そもそもそんなこと不可能?
271 :
Name_Not_Found:04/02/03 19:16 ID:yVRf5yt+
>>267>>269 this.valueの使い方を愚愚っていたらもう出来ていました。
これでパレットが出来ます。267、269さんレスありがとうございました。
P.S. onFocus="select()"は分かりやすいんでとっおきます。
272 :
Name_Not_Found:04/02/03 20:01 ID:yVRf5yt+
>>267>>269さん
266ですが
応用としてテキストフィールドなどに送るときは
document.forms名.テキストフィールド名.value;
として、 window.clipboardData.setData("Text", x);の後に
入れたんですが、動作しません重ね重ね申し訳ありませんが、
こちらもお願いします。
>>271 select()を残したいなら、
<input type="button" onClick="select(); setCB(value);" value="#0000ff">
と書けばいい。onFocus は要らない。
>>272 質問の意味がわからん。書いたコードを見せて欲しい。
>>270 function modosu() {
open(opener.url + "#" + document.検索結果のフォーム.hoge.value, opener.name);
window.close();
}
275 :
Name_Not_Found:04/02/03 21:02 ID:yVRf5yt+
>>273 これなんですが
<html>
<head>
<title></title>
<script language="JavaScript">
<!--
function setCB(x)
{
window.clipboardData.setData("Text", x);
document.out.color_out.value;
}
// -->
</script>
</head>
<body>
<table>
<form name="color">
<TR>
<TD bgcolor="#000000">.</TD><TD><input type="button" onClick="select();setCB(this.value)" value="#000000"></TD>
<TD bgcolor="#000033">.</TD><TD><input type="button" onClick="select();setCB(this.value)" value="#000033"></TD>
<TD bgcolor="#000066">.</TD><TD><input type="button" onClick="select();setCB(this.value)" value="#000066"></TD>
</TR>
</form>
</table>
<form name="out">
<input name="color_out" type="text" value="color" size="20">
</form>
</body>
</html>
>>270 別鯖のページ内容にアクセスすることはセキュリティ制約のため
不可能。おしまい。
>>275 > window.clipboardData.setData("Text", x);
> document.out.color_out.value;
引用してもらうのは、この2行だけでよかったんだけどね。
要するに、クリップボードに入れた値をフォームに表示もしたい、ということ?
なら、↑の2行目を↓のように修正して。
document.out.color_out.value = x;
あと、分かってると思うけど、もうちょっと勉強したほうがいい。
あまりにも初歩的な質問は、叩かれることが多いから。
278 :
Name_Not_Found:04/02/03 21:55 ID:yVRf5yt+
>>277 >あと、分かってると思うけど、もうちょっと勉強したほうがいい。
あまりにも初歩的な質問は、叩かれることが多いから。
おっしゃるとうりです。適切なご指摘ありがとうございます。
出入り禁止にならないよう、もう少し勉強します。
279 :
Name_Not_Found:04/02/03 22:59 ID:kSIMRfZJ
>>261 有り難うございます。
自分自身の名前を知る方法は無いのですね。残念です。
提示頂いたグローバル(window)な変数で取得するのは面白い
アイデアだと思いますので利用したいと思います。
ありがとうございました。
でも、自分自身が分からないなんて、何ででしょうね。
同じクラス?をnewでたくさん作ったりした場合に必要になる
と思うんですけど。
>>279 ちょっと聞きたいたいのだけど。
var a = new Object();
var b = a;
さてこのオブジェクトの名前は何?もちろん、オブジェクトは
1つだけで変数aもbも同じオブジェクトを指しているわけだが。
281 :
Name_Not_Found:04/02/03 23:45 ID:je4f3rem
>>281 ホレ。でもreplace()を使った方がもっと短いかな。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>???</title>
</head><body>
<pre><script type="text/javascript">
var s = '
http://localhost/do_something.cgi?id=100&id=101&id=102&id=100';
var a = s.split('?'), b = a[1].split('&'), c = [], d = {};
for(var x in b) if(!d[b[x]]) { c.push(b[x]); d[b[x]] = true; }
var t = a[0] + '?' + c.join('&');
document.writeln(t);
</script></pre>
</body></html>
283 :
Name_Not_Found:04/02/04 00:02 ID:uVJVRLWT
>>280 どういう意図か分かりませんが。
var b = a;
このオブジェクトは同じものです。同じ"場所"を示しています。
>>283 だから、このオブジェクトの名前は一つに定まらないでしょう?
実際、一つのオブジェクトにはいくつでも名前を付けることができる。
var a, b, c, d, e, f, g...;
a = b = c = d = e =... = new Object;
>>269のメソッドは、そのうち最初に見つかった変数名を返すだけだよ。
285 :
281:04/02/04 00:42 ID:???
>>282 Thanks。かっこいいコードだね。惚れたよ。
286 :
Name_Not_Found:04/02/04 00:45 ID:uVJVRLWT
>>284 >>279では、「newでたくさん作った...」と書きましたが、
"たくさん作った"という言葉の解釈が、
a=b=c=d=e=...=new Object;
だと思われたのでしょうか?
>>286 こちらは、あなたの今回の特定の場合ではなくて、一般論の話をしています。
つまり、
オブジェクトを一つ取り出して、それにつけられた変数名を一意に定めることは
場合によってはできない。逆にいえば、特定の場合を除いてできない。
だから、変数名からオブジェクトを取り出すことはできても、
オブジェクトから変数名を取り出すことの汎用的な手段は存在し得ない、という
理屈を説明しているんです。
つまり、JavaScript のオブジェクトが属性値として変数名を持っていない
ことの理由です。
JavaScript に限らず、私の知る言語はみんなそうなっています。
288 :
Name_Not_Found:04/02/04 01:57 ID:uVJVRLWT
一般論の話ですか。
『変数名からオブジェクトを取り出す』のが可能なら、オブジェクトから変数名
を取り出すことが出来るのは理屈に合うと思いますよ。
"誰から呼ばれたのか"ですから一意には当然ならないと思いますが。
どの変数から呼び出されたのか。callerのようなものがあったとしてもいいと
思いますね。関数ではあるんですから。
>>288 なるほど、こちらもあなたの意図を誤解していたようです。
現在、どの変数からオブジェクトが呼ばれているのか、ということですね?
これは面白いかもしれませんね。
(new Func()).myself() などは null を返すということで。
しかし、実現の可能性は高いと思いません。
caller や callee は、変数スコープの管理機構という既存の仕組みを
利用して実現できますが、変数の場合、実行コンテクストの新たな
管理の仕組みを導入しなければならない。
メリットに比べて、実現にかかる手間が大きすぎると思います。
と言うより、正直に申しますと、これを導入することによる
具体的なメリットが、私には思いつかないです。
オブジェクト同士を区別する方法は、他にいろいろありますので。
290 :
Name_Not_Found:04/02/04 03:10 ID:ejM8mR+O
こんばんは。
あるJavaScriptの解説ページに
「著作権は放棄しません」と書いてあったんですが、
JavaScriptのコードに著作権って発生するのでしょうか?
HTMLタグなどと同じように著作権などないと思いますが、どうなのでしょう?
>>289 Function.prototype.getName = function(){
return ("" + this).replace("function ","").replace(/\(.*\)\s*\{\s*.*\s*\}/,"");
};
function abc(){
}
abc.myself(){
alert(this.getName);
}
>>290 HTMLにもJavaScriptにも著作権は発生します
292 :
Name_Not_Found:04/02/04 04:36 ID:ejM8mR+O
>>291 ご回答ありがとうございます。
それじゃあ、例えば
document.writeと書いただけでも、著作権の所在としてそこのサイトのURLを載せなくてはならないのでしょうか?
>>292 独創性が無いと著作権は発生しないはず
document.writeを考えたのはJavaScriptを作った人だと思うので
その人の名前を書いた方が正確だと思う。
IE6なのですが、↓のようにifがスルーされてるようです。
何か根本的な間違いがあるんでしょうか?
・これだとhoge-hogeのアラートが出ない
var data="abcdef";
var rgexp=new RegExp("(abc)","g");
alert(rgexp.test(data));
if(rgexp.test(data)) alert("hoge-hoge");
・この3つだとhoge-hogeが出る
var data="abcdef";
var rgexp=new RegExp("(abc)","g");
// alert(rgexp.test(data)); ←これをやめる
if(rgexp.test(data)) alert("hoge-hoge");
var data="abcabcdef";// ←2個マッチする
var rgexp=new RegExp("(abc)","g");
alert(rgexp.test(data));
if(rgexp.test(data)) alert("hoge-hoge");
var data="abcdef";
var rgexp=new RegExp("(abc)");// ←gをつけない
alert(rgexp.test(data));
if(rgexp.test(data)) alert("hoge-hoge");
>>294 test() の動作を理解汁。
test() は exec() の結果が null でないかどうかを返すメソッドだが
この exec() はグローバルマッチの時
RegExpオブジェクトのlastIndexプロパティ(次回のマッチング開始位置)を
マッチングが終了した場所に設定し、先頭にリセットしない。
つまり rgexp.test(data) を一度呼ぶと
次回の rgexp.test(data) ではマッチングが "def" の部分から行われる。
というわけでそういう動作になる。
>>295 なるほど、そういう訳だったんですね。
test()を繰り返すとtrue、falseが交互に出てきました。
297 :
Name_Not_Found:04/02/04 13:56 ID:dQZ/MRJz
子ウィンドウを開いて、その子ウィンドウの中に、
親ウィンドウのあるテキストボックスの値を表示させることはできませんでしょうか?
要は、親ウィンドウのnameが取得できなくてこまってます・・・
配列に配列を代入すると中身が連動してしまいます。
これを防ぐ方法はありませんか?
>>299 var a=new Array();
a[0]=1;
a[1]=2;
//var b=a;
var b=new Array(a);//こうする
b[0]=3;
b[1]=4;
alert(a[0]);