アプリ版:「スタンプのみでお礼する」機能のリリースについて

条件付きコンパイルステートメントの/*@cc_on@*/を使用してaddEventListenerとattachEventを切り替えるという方法を教えてもらいましたが、IEで動作確認をすると、「サポートされていないオブジェクトまたは、メソッドです」といったエラーを返されます。
ifで分けて書いてみるとオブジェクトではないかNULLですといったエラーで返ってきます。
どなたかご存知の方がいらっしゃれば、ご教授いただけると助かります。

教えていただいたソース>selectメニューに応じてdivを変換する
<!--/*@cc_on @*/

var changer = function(evt){
 var sel = evt./*@if(1)srcElement @else@*/target /*@end@*/;
 changer.set(sel.value);
}

changer.set = function(val){
 if(!val) return;
 var pa, ch, i, target = this.target;
 var reg = new RegExp("\\b" + val + "\\b");
 for(i=0; i<target.length; i++){
  if(!(pa=document.getElementById(target[i]))) continue;
  ch = pa.firstChild;
  while(ch){
   if(ch.nodeType==1) ch.style.display = reg.test(ch.className)?"":"none";
   ch = ch.nextSibling;
  }
 }
}

changer.init = function(id, ids){
 var sel = document.getElementById(id);

 if(!sel || sel.nodeName != "SELECT") return;
 this.target = ids.split(",");
 this.set(sel.value);
★ sel./*@if(1)attachEvent('on' + @else@*/addEventListener(/*@end@*/'change',changer, false);
sel = null;
}

// 引数1:select要素のid
// 引数2:選択表示する対象となる要素(ラッパー)のid(カンマ連結)
changer.init("sel","dir1,dir2");
//-->

★の部分がサポートされていないようです。

ifで書き換えてみたところ
var ie = /*@cc_on@*/false;
if(ie){sel.attachEvent('onchange',changer);}
else{sel.addEventListener('change',changer,false);}

'value'はNULLまたはオブジェクトではありませんというエラーになります。

A 回答 (2件)

どこかで見たような… と思ったら私の回答のようですね。




>教えていただいたソース>selectメニューに応じてdivを変換する
><!--/*@cc_on @*/

     ↓

<!--
/*@cc_on@*/

(改行のあるなしで変わります)
回答をもう一度ご確認ください。
 http://oshiete.goo.ne.jp/qa/6524472.html
    • good
    • 0
この回答へのお礼

fujillin先生!!ありがとうございます。これでいけました。色々と試行錯誤していたのがウソみたいに動作しました。ほんとうにありがとうございます。

お礼日時:2011/02/25 08:58

#1です。



某所で、このスクリプトだと複数回initを呼び出すと都合が悪くなることを指摘されたのを思い出しました。(失念してました)
なので、応急処置。(init部分を以下にいれかえ)

changer.init = function(id, ids){
 var sel = document.getElementById(id);

 if(!sel || sel.nodeName != "SELECT") return;
 this.target = ids.split(",");
 this.set(sel.value);
 sel. /*@if(1)attachEvent('on' + @else@*/addEventListener(/*@end@*/ 'change', changer, false);
 changer.init = new Function;
}


本来なら複数の呼び出しに対応するべきですが、単に2回目以降を無効にしただけというお粗末な「応急処置」です。
お粗末だけれど、無いよりはよいだろうということで・・・
    • good
    • 0
この回答へのお礼

fujillin先生ありがとうございます。前述の改行の処理で上手く動作してくれましたので、この応急処置の方法は知識として私のEvernote行きとなりました。前回に引き続きご回答いただき、ありがとうございました。

お礼日時:2011/02/25 09:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!