2016-12-15 78 views
1

我的JavaScript組件沒有渲染,我發現了以下錯誤:JavaScript是不是一個函數

TypeError: $(...).cytoscape is not a function 

下面是引發錯誤的代碼。

本質上我試圖隔離什麼JavaScript呈現到行的內容。當我運行這個沒有嵌套在一個容器中,然後它工作正常。

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 

 
    <title>Main Page</title> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
 
    <!-- Bootstrap --> 
 
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> 
 
<link rel="stylesheet" type="text/css" href="/static/css/graph4.css"> 
 

 

 
    <!--[if lt IE 9]> 
 
      <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script> 
 
      <script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script> 
 
    <![endif]--> 
 

 

 
    </head> 
 
    <body> 
 
    
 
    
 
<nav class="navbar navbar-default"> 
 
    <div class="container-fluid"> 
 
    <!-- Brand and toggle get grouped for better mobile display --> 
 
    <div class="navbar-header"> 
 
     <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> 
 
     <span class="sr-only">Toggle navigation</span> 
 
     <span class="icon-bar"></span> 
 
     <span class="icon-bar"></span> 
 
     <span class="icon-bar"></span> 
 
     </button> 
 
     <a class="navbar-brand" href="#">Brand</a> 
 
    </div> 
 

 
    <!-- Collect the nav links, forms, and other content for toggling --> 
 
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
 
     <ul class="nav navbar-nav"> 
 
     <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li> 
 
     <li><a href="#">Link</a></li> 
 
     <li class="dropdown"> 
 
      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a> 
 
      <ul class="dropdown-menu"> 
 
      <li><a href="#">Action</a></li> 
 
      <li><a href="#">Another action</a></li> 
 
      <li><a href="#">Something else here</a></li> 
 
      <li role="separator" class="divider"></li> 
 
      <li><a href="#">Separated link</a></li> 
 
      <li role="separator" class="divider"></li> 
 
      <li><a href="#">One more separated link</a></li> 
 
      </ul> 
 
     </li> 
 
     </ul> 
 
     <form class="navbar-form navbar-left"> 
 
     <div class="form-group"> 
 
      <input type="text" class="form-control" placeholder="Search"> 
 
     </div> 
 
     <button type="submit" class="btn btn-default">Submit</button> 
 
     </form> 
 
     <ul class="nav navbar-nav navbar-right"> 
 
     <li><a href="#">Link</a></li> 
 
     <li class="dropdown"> 
 
     <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a> 
 
      <ul class="dropdown-menu"> 
 
      <li><a href="#">Action</a></li> 
 
      <li><a href="#">Another action</a></li> 
 
      <li><a href="#">Something else here</a></li> 
 
      <li role="separator" class="divider"></li> 
 
      <li><a href="#">Separated link</a></li> 
 
      </ul> 
 
     </li> 
 
     </ul> 
 
    </div><!-- /.navbar-collapse --> 
 
    </div><!-- /.container-fluid --> 
 
</nav> 
 
    <div class="container-fluid"> 
 

 

 
    <div class="row"> 
 
    <div class="col-xs-12 col-sm-12 col-md-12" style="background-color:lavender;"> 
 
\t <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
 
\t <script src="http://cytoscape.github.io/cytoscape.js/api/cytoscape.js-latest/cytoscape.min.js"></script> 
 
      <script> 
 
\t \t $(function(){ // on dom ready 
 
\t \t 
 
\t \t $('#cy').cytoscape({ 
 
\t \t  layout: { 
 
    \t \t  name: 'cose', 
 
\t \t  padding: 10, 
 
\t \t  randomize: true 
 
\t \t }, 
 
\t \t 
 
\t \t style: cytoscape.stylesheet() 
 
\t \t  .selector('node') 
 
\t \t  .css({ 
 
\t \t   'shape': 'data(faveShape)', 
 
\t \t   'width': 'mapData(weight, 40, 80, 20, 60)', 
 
\t \t   'content': 'data(name)', 
 
\t \t   'text-valign': 'center', 
 
\t \t   'text-outline-width': 2, 
 
\t \t   'text-outline-color': 'data(faveColor)', 
 
\t \t   'background-color': 'data(faveColor)', 
 
\t \t   'color': '#fff' 
 
\t \t  }) 
 
\t \t  .selector(':selected') 
 
\t \t  .css({ 
 
\t \t   'border-width': 3, 
 
\t \t   'border-color': '#333' 
 
\t \t  }) 
 
\t \t  .selector('edge') 
 
\t \t  .css({ 
 
\t \t   'curve-style': 'bezier', 
 
\t \t   'opacity': 0.666, 
 
\t \t   'width': 'mapData(strength, 70, 100, 2, 6)', 
 
\t \t   'target-arrow-shape': 'triangle', 
 
\t \t   'source-arrow-shape': 'circle', 
 
\t \t   'line-color': 'data(faveColor)', 
 
\t \t   'source-arrow-color': 'data(faveColor)', 
 
\t \t   'target-arrow-color': 'data(faveColor)' 
 
\t \t  }) 
 
\t \t  .selector('edge.questionable') 
 
\t \t  .css({ 
 
\t \t   'line-style': 'dotted', 
 
\t \t   'target-arrow-shape': 'diamond' 
 
\t \t  }) 
 
\t \t  .selector('.faded') 
 
\t \t  .css({ 
 
\t \t   'opacity': 0.25, 
 
\t \t   'text-opacity': 0 
 
     \t \t }), 
 
    
 
\t \t elements: { 
 
\t \t  nodes: [ 
 
\t \t  { data: { id: 'j', name: 'Jerry', weight: 65, faveColor: '#6FB1FC', faveShape: 'triangle' } }, 
 
\t \t  { data: { id: 'e', name: 'Elaine', weight: 45, faveColor: '#EDA1ED', faveShape: 'ellipse' } }, 
 
\t \t  { data: { id: 'k', name: 'Kramer', weight: 75, faveColor: '#86B342', faveShape: 'octagon' } }, 
 
\t \t  { data: { id: 'g', name: 'George', weight: 70, faveColor: '#F5A45D', faveShape: 'rectangle' } } 
 
\t \t  ], 
 
\t \t  edges: [ 
 
\t \t  { data: { source: 'j', target: 'e', faveColor: '#6FB1FC', strength: 90 } }, 
 
\t \t  { data: { source: 'j', target: 'k', faveColor: '#6FB1FC', strength: 70 } }, 
 
\t \t  { data: { source: 'j', target: 'g', faveColor: '#6FB1FC', strength: 80 } }, 
 
\t \t  
 
\t \t  { data: { source: 'e', target: 'j', faveColor: '#EDA1ED', strength: 95 } }, 
 
\t \t  { data: { source: 'e', target: 'k', faveColor: '#EDA1ED', strength: 60 }, classes: 'questionable' }, 
 
\t \t  
 
\t \t  { data: { source: 'k', target: 'j', faveColor: '#86B342', strength: 100 } }, 
 
\t \t  { data: { source: 'k', target: 'e', faveColor: '#86B342', strength: 100 } }, 
 
\t \t  { data: { source: 'k', target: 'g', faveColor: '#86B342', strength: 100 } }, 
 
\t \t  
 
\t \t  { data: { source: 'g', target: 'j', faveColor: '#F5A45D', strength: 90 } } 
 
\t \t  ] 
 
\t \t }, 
 
\t \t 
 
\t \t ready: function(){ 
 
\t \t  window.cy = this; 
 
\t \t  
 
\t \t  // giddy up 
 
\t \t } 
 
\t \t }); 
 
\t \t 
 
\t \t }); // on dom ready 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t </script> 
 
      <div id="cy"></div> 
 
\t <p>Test</p> 
 
    </div> 
 
    <div class="col-xs-12 col-sm-12 col-md-12" style="background-color:lavenderblush";> 
 
     Timeline 
 
    </div> 
 
    </div> 
 

 

 

 

 

 

 

 
    
 

 

 

 

 

 
</div> 
 

 
<footer class="footer"> 
 
<p> 
 
<center> 
 
<span class="glyphicon glyphicon-copyright-mark" aria-hidden="true"></span> 
 
Test 
 
</center> 
 
</p> 
 
</footer> 
 

 
    
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 
    </body> 
 
</html>

+0

你有一個匿名的關閉函數,你認爲'當dom準備好'爲什麼不明確地做一個'$(document).ready ...'並且看它是否有效呢? – jdmdevdotnet

+0

無論如何這意味着什麼。 Dom Ready。只有在頁面完全加載後腳本纔會運行。 – ForgottenKahz

+0

這個問題可能與初始化圖形時有關。根據其他SO職位。該圖必須在引導後初始化。 – ForgottenKahz

回答

0

你需要傳遞正是如此jQuery對象:

(function($) { 
    //dom and jquery is ready 
})(jQuery); 

嘗試:

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 

 
    <title>Main Page</title> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
 
    <!-- Bootstrap --> 
 
    <link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> 
 

 

 

 
    <!--[if lt IE 9]> 
 
      <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script> 
 
      <script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script> 
 
    <![endif]--> 
 

 

 
    </head> 
 
    <body> 
 
    
 
    
 
<nav class="navbar navbar-default"> 
 
    <div class="container-fluid"> 
 
    <!-- Brand and toggle get grouped for better mobile display --> 
 
    <div class="navbar-header"> 
 
     <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> 
 
     <span class="sr-only">Toggle navigation</span> 
 
     <span class="icon-bar"></span> 
 
     <span class="icon-bar"></span> 
 
     <span class="icon-bar"></span> 
 
     </button> 
 
     <a class="navbar-brand" href="#">Brand</a> 
 
    </div> 
 

 
    <!-- Collect the nav links, forms, and other content for toggling --> 
 
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
 
     <ul class="nav navbar-nav"> 
 
     <li class="active"><a href="#">Link <span class="sr-only">(current)</span></a></li> 
 
     <li><a href="#">Link</a></li> 
 
     <li class="dropdown"> 
 
      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a> 
 
      <ul class="dropdown-menu"> 
 
      <li><a href="#">Action</a></li> 
 
      <li><a href="#">Another action</a></li> 
 
      <li><a href="#">Something else here</a></li> 
 
      <li role="separator" class="divider"></li> 
 
      <li><a href="#">Separated link</a></li> 
 
      <li role="separator" class="divider"></li> 
 
      <li><a href="#">One more separated link</a></li> 
 
      </ul> 
 
     </li> 
 
     </ul> 
 
     <form class="navbar-form navbar-left"> 
 
     <div class="form-group"> 
 
      <input type="text" class="form-control" placeholder="Search"> 
 
     </div> 
 
     <button type="submit" class="btn btn-default">Submit</button> 
 
     </form> 
 
     <ul class="nav navbar-nav navbar-right"> 
 
     <li><a href="#">Link</a></li> 
 
     <li class="dropdown"> 
 
     <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a> 
 
      <ul class="dropdown-menu"> 
 
      <li><a href="#">Action</a></li> 
 
      <li><a href="#">Another action</a></li> 
 
      <li><a href="#">Something else here</a></li> 
 
      <li role="separator" class="divider"></li> 
 
      <li><a href="#">Separated link</a></li> 
 
      </ul> 
 
     </li> 
 
     </ul> 
 
    </div><!-- /.navbar-collapse --> 
 
    </div><!-- /.container-fluid --> 
 
</nav> 
 
    <div class="container-fluid"> 
 

 

 
    <div class="row"> 
 
    <div class="col-xs-12 col-sm-12 col-md-12" style="background-color:lavender;"> 
 
\t <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script> 
 
\t <script src="//cdnjs.cloudflare.com/ajax/libs/cytoscape/2.7.13/cytoscape.min.js"></script> 
 
      <script> 
 
\t \t (function($) { // on dom ready 
 
\t \t 
 
\t \t $('#cy').cytoscape({ 
 
\t \t  layout: { 
 
    \t \t  name: 'cose', 
 
\t \t  padding: 10, 
 
\t \t  randomize: true 
 
\t \t }, 
 
\t \t 
 
\t \t style: cytoscape.stylesheet() 
 
\t \t  .selector('node') 
 
\t \t  .css({ 
 
\t \t   'shape': 'data(faveShape)', 
 
\t \t   'width': 'mapData(weight, 40, 80, 20, 60)', 
 
\t \t   'content': 'data(name)', 
 
\t \t   'text-valign': 'center', 
 
\t \t   'text-outline-width': 2, 
 
\t \t   'text-outline-color': 'data(faveColor)', 
 
\t \t   'background-color': 'data(faveColor)', 
 
\t \t   'color': '#fff' 
 
\t \t  }) 
 
\t \t  .selector(':selected') 
 
\t \t  .css({ 
 
\t \t   'border-width': 3, 
 
\t \t   'border-color': '#333' 
 
\t \t  }) 
 
\t \t  .selector('edge') 
 
\t \t  .css({ 
 
\t \t   'curve-style': 'bezier', 
 
\t \t   'opacity': 0.666, 
 
\t \t   'width': 'mapData(strength, 70, 100, 2, 6)', 
 
\t \t   'target-arrow-shape': 'triangle', 
 
\t \t   'source-arrow-shape': 'circle', 
 
\t \t   'line-color': 'data(faveColor)', 
 
\t \t   'source-arrow-color': 'data(faveColor)', 
 
\t \t   'target-arrow-color': 'data(faveColor)' 
 
\t \t  }) 
 
\t \t  .selector('edge.questionable') 
 
\t \t  .css({ 
 
\t \t   'line-style': 'dotted', 
 
\t \t   'target-arrow-shape': 'diamond' 
 
\t \t  }) 
 
\t \t  .selector('.faded') 
 
\t \t  .css({ 
 
\t \t   'opacity': 0.25, 
 
\t \t   'text-opacity': 0 
 
     \t \t }), 
 
    
 
\t \t elements: { 
 
\t \t  nodes: [ 
 
\t \t  { data: { id: 'j', name: 'Jerry', weight: 65, faveColor: '#6FB1FC', faveShape: 'triangle' } }, 
 
\t \t  { data: { id: 'e', name: 'Elaine', weight: 45, faveColor: '#EDA1ED', faveShape: 'ellipse' } }, 
 
\t \t  { data: { id: 'k', name: 'Kramer', weight: 75, faveColor: '#86B342', faveShape: 'octagon' } }, 
 
\t \t  { data: { id: 'g', name: 'George', weight: 70, faveColor: '#F5A45D', faveShape: 'rectangle' } } 
 
\t \t  ], 
 
\t \t  edges: [ 
 
\t \t  { data: { source: 'j', target: 'e', faveColor: '#6FB1FC', strength: 90 } }, 
 
\t \t  { data: { source: 'j', target: 'k', faveColor: '#6FB1FC', strength: 70 } }, 
 
\t \t  { data: { source: 'j', target: 'g', faveColor: '#6FB1FC', strength: 80 } }, 
 
\t \t  
 
\t \t  { data: { source: 'e', target: 'j', faveColor: '#EDA1ED', strength: 95 } }, 
 
\t \t  { data: { source: 'e', target: 'k', faveColor: '#EDA1ED', strength: 60 }, classes: 'questionable' }, 
 
\t \t  
 
\t \t  { data: { source: 'k', target: 'j', faveColor: '#86B342', strength: 100 } }, 
 
\t \t  { data: { source: 'k', target: 'e', faveColor: '#86B342', strength: 100 } }, 
 
\t \t  { data: { source: 'k', target: 'g', faveColor: '#86B342', strength: 100 } }, 
 
\t \t  
 
\t \t  { data: { source: 'g', target: 'j', faveColor: '#F5A45D', strength: 90 } } 
 
\t \t  ] 
 
\t \t }, 
 
\t \t 
 
\t \t ready: function(){ 
 
\t \t  window.cy = this; 
 
\t \t  
 
\t \t  // giddy up 
 
\t \t } 
 
\t \t }); 
 
\t \t 
 
\t \t }); // on dom ready 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t 
 
\t \t </script> 
 
      <div id="cy"></div> 
 
\t <p>Test</p> 
 
    </div> 
 
    <div class="col-xs-12 col-sm-12 col-md-12" style="background-color:lavenderblush";> 
 
     Timeline 
 
    </div> 
 
    </div> 
 

 

 

 

 

 

 

 
    
 

 

 

 

 

 
</div> 
 

 
<footer class="footer"> 
 
<p> 
 
<center> 
 
<span class="glyphicon glyphicon-copyright-mark" aria-hidden="true"></span> 
 
Test 
 
</center> 
 
</p> 
 
</footer> 
 

 
    
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
 
    <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> 
 
    </body> 
 
</html>

+0

聽起來像是可能已經工作,但運行代碼片段結束了相同的結果。 JavaScript應該呈現的圖表丟失了! – ForgottenKahz

2
$('#cy').cytoscape({ 
    layout: { 
    name: 'cose', 
    padding: 10, 
    randomize: true 
    }, 
    ... 
}; 

需要在http://js.cytoscape.org/#getting-started/initialisation

改變到

var cy = cytoscape({ 
    container: $('#cy'), 
    layout: { 
     name: 'cose', 
    padding: 10, 
    randomize: true 
    }, 
    ... 
}; 

按方向這將解決您的錯誤,但我不知道,如果它的渲染是你所希望它將使。我希望這至少能讓你更接近你期望的行爲!

+0

這有助於解決錯誤,但現在我得到了有關突變的錯誤。從我讀過的其他文章中可以看出,引導程序和細胞景觀需要按照特定的順序渲染,因爲細胞景觀的尺寸是如何工作的。 – ForgottenKahz

+0

@ForgottenKahz你能更新你的問題(或問一個新的問題),你現在正在嘗試做什麼?請務必寫下你試過的東西!當你可以提供這些信息時,它總是有幫助的,因爲它強制你考慮批判性地分析「什麼是壞的」,並且向每個人提供更多的信息來幫助你(除了「它不工作」)。謝謝! – therobinkim