2

c# と javascript で asp.net を使用しています。マスター ページと、それを使用する多数の aspx ページがあります。マスター ページには、実際にはメニューである順序付けられていないリストがあります。

順序なしリストには ID と がありrunat ="server"ます。"runat ="server""問題は、順序付けられていないリストに入れるときです。エラーが表示されます:"Microsoft JScript runtime error: Unable to get value of the property 'getElementsByTagName': object is null or undefined."メニューの機能に使用されるscript.jsを指しています。具体的には次の行で:.......

a=c; var w=document.getElementById(p), s=w.getElementsByTagName('ul'), l=s.length, i=0;

マスター ページのヘッドでは、スクリプトは次のように呼び出されます。

<script type="text/javascript" src="script.js">
</script>

script.js の完全なコード:

var menu=function(){
    var t=15,z=50,s=6,a;
    function dd(n){this.n=n; this.h=[]; this.c=[]}
    dd.prototype.init=function(p,c){
        a=c; var w=document.getElementById(p), s=w.getElementsByTagName('ul'), l=s.length, i=0;
        for(i;i<l;i++){
            var h=s[i].parentNode; this.h[i]=h; this.c[i]=s[i];
            h.onmouseover=new Function(this.n+'.st('+i+',true)');
            h.onmouseout=new Function(this.n+'.st('+i+')');
        }
    }
    dd.prototype.st=function(x,f){
        var c=this.c[x], h=this.h[x], p=h.getElementsByTagName('a')[0];
        clearInterval(c.t); c.style.overflow='hidden';
        if(f){
            p.className+=' '+a;
            if(!c.mh){c.style.display='block'; c.style.height=''; c.mh=c.offsetHeight; c.style.height=0}
            if(c.mh==c.offsetHeight){c.style.overflow='visible'}
            else{c.style.zIndex=z; z++; c.t=setInterval(function(){sl(c,1)},t)}
        }else{p.className=p.className.replace(a,''); c.t=setInterval(function(){sl(c,-1)},t)}
    }
    function sl(c,f){
        var h=c.offsetHeight;
        if((h<=0&&f!=1)||(h>=c.mh&&f==1)){
            if(f==1){c.style.filter=''; c.style.opacity=1; c.style.overflow='visible'}
            clearInterval(c.t); return
        }
        var d=(f==1)?Math.ceil((c.mh-h)/s):Math.ceil(h/s), o=h/c.mh;
        c.style.opacity=o; c.style.filter='alpha(opacity='+(o*100)+')';
        c.style.height=h+(d*f)+'px'
    }
    return{dd:dd}
}();

順序付けられていないリスト メニューは、form1 内で宣言されています。

これはリスト メニュー コードです。

<ul class="menu" id="menu" runat ="server"> 
  <li>
    <a href="#" class="menulink">Mant</a> 
    <ul> 
      <li><a href="Mant.aspx">Table</a></li> 
    </ul> 
  </li> 
</ul>

form1 の外では、次のように宣言されています。

<script type="text/javascript">
var menu = new menu.dd("menu");
menu.init("menu", "menuhover");
</script>

script.js を除いて、すべてのコードはマスター ページで宣言されます。

どうすればこれを解決できますか?

ありがとう...

編集された投稿。

4

3 に答える 3

3

具体的な答えを出すのに十分なコードを提供していませんが、私の勘は次のとおりです...

既定では、ASP.Netはを含む要素のIDを変更してrunat="server"、すべてのIDが一意であることを確認します。2つの選択肢があります。

  1. JSのクライアントIDについてASP.Netに問い合わせます。

    var clientID = "<%= txtUsername.ClientID %>";

  2. ClientIDModeプロパティを見てください。Static少なくとも問題の要素については、に設定すると問題が解決するはずです。

このエラーは、ページが完全にレンダリングされる前にJSを実行した結果である可能性もあります。繰り返しになりますが、この判断を下すのに十分なコードが提供されていません。

于 2012-10-15T18:17:20.913 に答える
0

これはnull、要素が作成される前にJavaScriptが実行されたためです。オンロードに追加できます。 http://jsfiddle.net/vwvzN/

ジェームズヒルは正しいアプローチをしているようです。

于 2012-10-15T18:19:42.867 に答える
0

このコードを試してください。

<script type="text/javascript">
var menu = new menu.dd(<%= menu.ClientID %>);
menu.init(<%= menu.ClientID %>, "menuhover");
</script>
于 2012-10-15T20:20:52.477 に答える