2017-07-10 10 views
0

私は理解を得るための友人から、次のコードを借りてきましたが、私はここまでこだわって: -次のjavascriptコードはなぜ実行されますか?

function menubar() { 
 
    var menu = '{"str":[{"mitem":"Homepage","id":"1"},{"mitem":"About Us","id":"2"},{"mitem":"Contact Us","id":"3"},' + '{"mitem":"Feedback","id":"4"}]}' 
 

 
    var jsobj = JSON.parse(menu); 
 

 
    var stringbody = ''; 
 

 
    for (i = 0; i < jsobj.str.length; i++) { 
 
    stringbody += '<a href="javascript:callme(' + jsobj.str[i].id + ');">' + 
 
     '<div id="menubar">' + jsobj.str[i].mitem + '</div></a>'; 
 
    } 
 
    document.getElementById('menu').innerHTML = stringbody; 
 
} 
 

 
window.onload = function() { 
 
    var x = document.getElementById("items"); 
 
    var y = document.getElementById("iconmain"); 
 

 
    y.onclick = function() { 
 
    x.style.display = (x.style.display == "none") ? "block" : "none"; 
 
    } 
 
}
<html> 
 
    <head> 
 
     <link href="page1.css" rel="stylesheet" type="text/css"> 
 
     <script src="page1.js" type="text/javascript"></script> 
 
    </head> 
 
    
 
    <body> 
 
     <div id="header"><h1>XYZ Gym</h1></div> 
 
     <div id="menu"></div> 
 
     
 
     <script> 
 
      menubar(); 
 
     </script> 
 
     
 
     <div id="iconmain"> 
 
      <div id="icon"></div> 
 
      <div id="icon"></div> 
 
      <div id="icon"></div> 
 
     </div> 
 
     
 
     <div id="items"> 
 
      <ul> 
 
       <hr> 
 
       <li><a href="#">item 1</a></li><hr> 
 
       <li><a href="#">item 2</a></li><hr> 
 
       <li><a href="#">item 3</a></li><hr> 
 
       <li><a href="#">item 4</a></li><hr> 
 
       <li><a href="#">item 5</a></li><hr> 
 
      </ul> 
 
     </div> 
 
     
 
     <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br><br></p> 
 
    </body> 
 
</html>

ので、コードがカッコソフトウェア上で完全に機能しているようです。しかし、(href)タグの下にある関数、javascript:callme()は決して定義されていません。

これは事前定義された関数ですか?あなたが見ることができるように私は他のJavaScriptファイルへの他のリンクを持っていないので、まだコードが実行されるようです。その後、私は次の出力を得るenter image description here

そして、私はそれ stringbody+='<div id="menubar">'+jsobj.str[i].mitem+'</div></a>';

作るようにする場合には、私はその行を削除します - enter image description here だから、明らかにそれがコードの冗長部分ではない..です

+1

あなたは 'a'タグ全体を削除しています。そのため、スタイルが崩れてしまいます。しかし、関数 'callme'が存在しないとしても正しく表示されますが、アンカーをクリックするとエラーになります。 –

+0

ああ、今、あなたのおかげで、あなたの両方を参照してください!私はこのような長い間、私の頭を壊してきました!おそらくあなたのどちらかが私が正しいものとして選択できる答えを書くことができましたか? –

答えて

0

いいえ、あらかじめ定義された関数ではなく、Chromeでコードをデバッグするとこのエラーが表示されます。

VM196:1 Uncaught ReferenceError: callme is not defined 
at <anonymous>:1:1 
(anonymous) @ VM196:1 

CSS sいずれかのリンクを使用することができます

stringbody+= '<a href="http://www.google.com">'+ 
            '<div id="menubar">'+jsobj.str[i].mitem+'</div></a>'; 

をCSSで定義されたセレクタがHTMLで発見された場合tylesは、あなたのHTMLに適用されますので、変更stringbodyは、このようにする必要があり、私は開始アンカータグを省略していなかったという通知

http://www.google.com

関連する問題