【问题标题】:Why does this javascript run locally but not on a web server?为什么这个 javascript 在本地运行而不是在 Web 服务器上运行?
【发布时间】:2012-11-07 23:35:08
【问题描述】:

我的页面上有以下 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 也有同样的结果。

我承认在这一切上几乎是一个 n00b,但我无法解释这种不一致的行为。我知道代码正在访问本地文件,但是通过网络服务器访问时应该没有问题,对吧?

无论如何,我们将不胜感激。

更新: 这是页面的代码:

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

【问题讨论】:

  • 你上传LPInfo.md到远程服务器了吗?
  • 能不能贴一下about.html代码
  • @Matt -- 是的,文件在那里。它实际上显示为原始的、未渲染的降价。
  • @DavidLloydBrookes -- HTML 已上传。谢谢。

标签: javascript jquery


【解决方案1】:

问题是您试图在 #mymarkdown 完全加载到 DOM 之前对它的内容运行 markdown.toHTMLload 是异步的)。使用load 的“完成”回调就可以了:

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

(它在本地工作的原因可能是因为lpinfo.md 几乎是即时加载的,或者是因为 1. 对 localhost 的 Ajax 调用非常快,或者 2. 您的浏览器已经缓存了来自 localhost 的文件。)

【讨论】:

  • 我认为这是某种记录。我还不能接受你的回答,因为显然还不到 6 分钟。 ;-) 效果很好。非常感谢。
  • @NickHodges - 我以为是 9 分钟... o.O
  • 是的,还剩 6 分钟,这意味着我问了我的问题,得到了答案,并在 3 分钟内完成了修复。 :-)
【解决方案2】:

查看thisthat 关于如何通过 XHR 启用本地文件系统访问的问题。

您的实际问题是.load()开始 异步 加载文件。但即使在加载之前,您也会获得 HTML 内容(可能是空的?)并将其呈现为降价。不久之后,该元素将被 ajax 回调覆盖。使用回调参数!

如果您不加载 HTML,则根本不要使用 load。 jQuery 有一个 powerful ajax function,您甚至可以在其上设置一个 Markdown2html 转换器,当提供 markdown 文件并需要 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));
    });
});

【讨论】:

    【解决方案3】:

    这样做:

    $(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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      相关资源
      最近更新 更多