2006-04-28 [長年日記]

_ [javascript] 続: element.name=

続き

element.name= が使えないのは IE のバグ?らしい。 @ITのフォーラム

で、

document.createElement('<input name="group_ids[' + this.groupId + ']">');

とやると、確かに IE では動くようになる。 けど、Firefox ではこんなエラーに。

Error: uncaught exception: [Exception... "String contains an invalid
character"  code: "5" nsresult: "0x80530005
(NS_ERROR_DOM_INVALID_CHARACTER_ERR)"  location:
"http://127.0.0.1:3000/javascripts/application.js Line: 35"]

しかたないので、

createInputTagWithName: function(groupId){
  return Try.these(
    function(){
      return document.createElement('<input name="group_ids[' + groupId + ']">');
    },
    function(){
      var input = document.createElement("input");
      input.name = "group_ids[" + groupId +"]";
      return input;
    }
  );
}

みたいなことに。で、今度は label タグの for をセットしようとすると、 IE だと label["for"] = checkbox.id; でいけるのに、Firefox だとセットされない。 なもんで、label.setAttribute("for", checkbox.id); で回避。ならばと、 name も setAttribute() *1しようとしたけど、 IE ではやっぱりダメ。まぁチグハグだけど両方で動くようになったからよしとするか。

べた書きの部分は、もう少しなんとかしないと。あと、別のブラウザでも試してみたいな。

*1 これってどこで定義されてるの?

_ [javascript] smjs + prototype.js

動くんだ、これ。ふつうにやると、 トップレベル?で document とかを参照してるところでエラーが出るけど、 そこ以降をばっさり削除*1すれば、 コアを extend とかしてる部分は(全部じゃないけど)動く。 カレントディレクトリに prototype.js を置いて、

$ smjs
js> load("prototype.js")
js> var a = $A([1,2,3,4,5,6,7,8,9,10])
js> a.inspect()
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
js> a.map(function(i){return i*i}).inspect()
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
js> var sum = a.inject(0, function(r,i){return r + i})
js> print(sum)
55

findAll とか sortBy には違和感あるけど。それが javascript。

js> "foo".camelize()
foo

あれ?とか言わないように。

js> "foo-bar".camelize()
fooBar

ですよ(区切りは - なのか)。$H()とか$R()も動く。

js> var h = $H({key1:"value1",key2:"value2"})
js> h.inspect()
#<Hash:{key1: value1, key2: value2}>
js> var r = $R(3,12,true)
js> r.inspect()
#<Enumerable:[3, 4, 5, 6, 7, 8, 9, 10, 11]>

$R()のinspect()は、.. とか ... とかを使って表示するようにした方がよさげ。

js> Object.extend(ObjectRange.prototype, {
      inspect: function(){
        var op = ".." + (this.exclusive ? "." : "");
        return "#<Range:" + this.start + op + this.end + ">";
    }})
[object Object]
js> var r = $R(3,12,true)
js> r.inspect()
#<Range:3...12>
js> var r = $R(3,12,false)
js> r.inspect()
#<Range:3..12>

とりあえずは、function と return だらけだけど、結構刺激的なコードですね。 連休中に読む。

*1 1.5.0pre1 の先頭883行分だけ残す

[]