2

私のページには次の Javascript/jQuery があります。

<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 にレンダリングするという、私が望んでいることを行っていません。

これが奇妙な部分であり、私の質問の根源です:

ページをローカル ファイルとして開いても、Chrome は何もしません。IE9 が開き、ページが適切にレンダリングされますが、それはスクリプトを実行する許可を与えた後でのみです。

どちらのブラウザも、上記のリンクを使用してページを正しくレンダリングできません。Firefox でも同じ結果が得られます。

私はこれらすべてについてほとんど無関心であることを告白しますが、一貫性のない動作を説明するのに途方に暮れています. コードがローカル ファイルにアクセスしていることは理解していますが、Web サーバー経由でアクセスする場合は問題ありませんよね?

とにかく、助けていただければ幸いです。

更新: ページのコードは次のとおりです。

<!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>
4

3 に答える 3

8

問題は、DOMに完全にロードされる(非同期である)前markdown.toHTMLに、のコンテンツを実行しようとしていることです。の「完全な」コールバックを使用すると、次のように機能します。#mymarkdownloadload

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

(ローカルで機能する理由lpinfo.mdは、1。ローカルホストへのAjax呼び出しが非常に高速であるか、2。ブラウザーにローカルホストからのファイルが既にキャッシュされているため、ほぼ瞬時にロードされるためです。)

于 2012-11-19T23:20:43.057 に答える
2

そのようにしてください:

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

したがって、コードはDOMContentLoadedハンドラー内にあり、DOMの準備ができていることを確認します(コンテンツを注入しているため)。また、$.getここに適切な検索メカニズムがあります。あなたは.load()自分の状況ではあまり意味をなさないことをしている。

あなたがしていること.load()

  1. Ajax経由でMDファイルを取得します。
  2. その内容をDOMに挿入し、
  3. DOMからそのコンテンツを取得し、
  4. Markdownでコンテンツを処理し、
  5. 結果のHTMLソースコードをDOMに挿入します。

私のコードがしていること:

  1. Ajax経由でMDファイルを取得します。
  2. Markdownでコンテンツを処理し、
  3. 結果のHTMLソースコードをDOMに挿入します。
于 2012-11-19T23:23:02.550 に答える
1

XHRを介したローカルファイルシステムアクセスを有効にする方法については、この質問またはその質問をご覧ください

実際の問題は、ファイルの非同期.load()ロードのみを開始することです。しかし、ロードされる前でも、HTMLコンテンツ(おそらく空ですか?)を取得し、マークダウンとしてレンダリングします。その後すぐに、要素はajaxコールバックから上書きされます。コールバックパラメータを使用してください!

loadまた、HTMLをロードしていない場合は、まったく使用しないでください。jQueryには強力なajax関数があり、Markdown2htmlコンバーターをセットアップすることもできます。このコンバーターは、マークダウンファイルが提供されてhtmlが必要なときに自動的に使用されます。

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

しかし、あなたの目的のために、単純な.ajax呼び出しを使用してください:

$.ajax("./LPInfo.md").done(function(md) {
    $(function() {
        $("#mymarkdown").html(markdown.toHTML(md));
    });
});
于 2012-11-19T23:22:41.073 に答える