2012-11-19 59 views
2

我有我的網頁上下面的JavaScript/jQuery的:爲什麼此javascript在本地運行,但不在Web服務器上運行?

<script> 
$("#mymarkdown").load("./LPInfo.md"); 
var md = markdown.toHTML($("#mymarkdown").html()); 
$("#mymarkdown").html(md); 
</script> 

該網頁是在這裏:

http://www.nickhodges.com/LeanTed/bootstrap/about.html

該頁面使用引導程序。在查看代碼時,我查看了控制檯中的任何錯誤。正如你所看到的,它沒有做我想做的事情,它使用markdown.js將文件的內容呈現爲HTML。

這裏的怪異的一部分,和我的問題的根源:

如果我打開網頁的本地文件,瀏覽器什麼都不做。 IE9將打開並正確呈現該頁面,但只有在我允許運行腳本後。

兩個瀏​​覽器均無法正確使用上述鏈接呈現網頁。 Firefox有相同的結果。

我承認在所有這些方面都差不多,但我無法解釋不一致的行爲。我知道代碼正在訪問本地文件,但通過Web服務器訪問時不應該是一個問題,對吧?

無論如何,幫助將不勝感激。

UPDATE: 下面是頁面代碼:

<!DOCTYPE html> 
<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <title>LeanTed Markdown Editor</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta name="description" content=""> 
    <meta name="author" content=""> 

    <!-- Le styles --> 
    <link href="css/bootstrap.min.css" rel="stylesheet"> 
    <style> 
     body { 
     padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */ 
     } 
    </style> 
    <link href="css/bootstrap-responsive.css" rel="stylesheet"> 

    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --> 
    <!--[if lt IE 9]> 
     <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> 
    <![endif]--> 

    <!-- Le fav and touch icons --> 
    <link rel="shortcut icon" href="../assets/ico/favicon.ico"> 
    <link rel="apple-touch-icon-precomposed" sizes="144x144" href="../assets/ico/apple-touch-icon-144-precomposed.png"> 
    <link rel="apple-touch-icon-precomposed" sizes="114x114" href="../assets/ico/apple-touch-icon-114-precomposed.png"> 
    <link rel="apple-touch-icon-precomposed" sizes="72x72" href="../assets/ico/apple-touch-icon-72-precomposed.png"> 
    <link rel="apple-touch-icon-precomposed" href="../assets/ico/apple-touch-icon-57-precomposed.png"> 
    </head> 

    <body> 

    <div class="navbar navbar-inverse navbar-fixed-top"> 
     <div class="navbar-inner"> 
     <div class="container"> 
      <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> 
      <span class="icon-bar"></span> 
      <span class="icon-bar"></span> 
      <span class="icon-bar"></span> 
      </a> 
      <a class="brand" href="#">LeanTed Markdown Editor</a> 
      <div class="nav-collapse collapse"> 
      <ul class="nav"> 
       <li><a href="hero.html">Home</a></li> 
       <li class="active"><a href="#">About</a></li> 
       <li><a href="http://www.nickhodges.com/contact.aspx">Contact</a></li> 
      </ul> 
      </div><!--/.nav-collapse --> 
     </div> 
     </div> 
    </div> 

    <div class="container"> 
     <div id="mymarkdown"></div> 
    </div> <!-- /container --> 

    <!-- Le javascript 
    ================================================== --> 
    <!-- Placed at the end of the document so the pages load faster --> 
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
    <script src="../assets/js/bootstrap-transition.js"></script> 
    <script src="../assets/js/bootstrap-alert.js"></script> 
    <script src="../assets/js/bootstrap-modal.js"></script> 
    <script src="../assets/js/bootstrap-dropdown.js"></script> 
    <script src="../assets/js/bootstrap-scrollspy.js"></script> 
    <script src="../assets/js/bootstrap-tab.js"></script> 
    <script src="../assets/js/bootstrap-tooltip.js"></script> 
    <script src="../assets/js/bootstrap-popover.js"></script> 
    <script src="../assets/js/bootstrap-button.js"></script> 
    <script src="../assets/js/bootstrap-collapse.js"></script> 
    <script src="../assets/js/bootstrap-carousel.js"></script> 
    <script src="../assets/js/bootstrap-typeahead.js"></script> 

    <script src="markdown.js"></script> 


    <script> 
    $("#mymarkdown").load("./LPInfo.md"); 
    var md = markdown.toHTML($("#mymarkdown").html()); 
    $("#mymarkdown").html(md); 
    </script> 

    </body> 
</html> 
+0

您是否將LPInfo.md上傳到遠程服務器? – Matt

+0

你能發佈about.html代碼嗎? –

+0

@Matt - 是的,文件在那裏。它實際上表現爲原始的,不降價的降價。 –

回答

8

的問題是,你想運行的#mymarkdown內容markdown.toHTML之前,它已經完全加載到DOM(load是異步的,) 。使用的load「完整」的回調和它的作品:

$("#mymarkdown").load("./LPInfo.md", function() { 
    var md = markdown.toHTML($("#mymarkdown").html()); 
    $("#mymarkdown").html(md); 
}); 

(它本地工作的原因可能是因爲lpinfo.md裝載近瞬間,或者是因爲1. Ajax調用本地主機是非常快,或2.您的瀏覽器已經從本地緩存文件。)

+4

我認爲這是某種記錄。我不能接受你的答案,因爲它已經不是6分鐘了,顯然。 ;-)它效果很好。非常感謝。 –

+1

@NickHodges - 我認爲它是9分鐘... o.O –

+0

是的,它還剩6分鐘,這意味着我問了我的問題,得到了答案,並在3分鐘內修復。 :-) –

1

看看thisthat問題如何通過XHR啓用本地文件系統訪問。

您的實際問題是,.load()不只是開始異步加載的文件。但即使在加載之前,您也會獲得HTML內容(可能爲空)並將其呈現爲降價。不久之後,該元素將從ajax回調中被覆蓋。使用回調參數!

如果您沒有加載HTML,請不要使用load。jQuery有一個powerful ajax function上,你甚至可以建立一個Markdown2html轉換器時,降價文件送達和HTML是想用於自動:

$.ajaxSetup({ 
    accepts: { 
     "markdown": "text/x-markdown" // MIME type 
    }, 
    contents: { 
     "markdown": /markdown/ // MIME type matcher 
    }, 
    converters: { 
     "markdown html": markdown.toHTML 
    } 
}); 

但你的目的,只使用一個簡單.ajax call

$.ajax("./LPInfo.md").done(function(md) { 
    $(function() { 
     $("#mymarkdown").html(markdown.toHTML(md)); 
    }); 
}); 
2

做它像這樣:

$(function() { 
    $.get('./LPInfo.md', function (data) { 
     $('#mymarkdown').html(markdown.toHTML(data)); 
    }); 
}); 

因此,代碼是DOMContentLoaded處理程序,以確保裏面的DOM已準備就緒(罪您正在向它注入內容)。此外,$.get是適當的檢索機制。你正在做​​這在你的情況下沒有多大意義。

什麼你與​​做:

  1. 獲得通過Ajax MD文件,
  2. 將其內容到DOM,
  3. 檢索從DOM的內容,
  4. 處理使用Markdown的內容,
  5. 將生成的HTML源代碼插入到DOM中。

什麼我的代碼做什麼:

  1. 通過Ajax獲得MD文件,
  2. 處理其內容與降價,
  3. 將生成的HTML源代碼到DOM。
相關問題