【问题标题】:Removing newlines from the end of base.html file makes some elements disappear from DOM从 base.html 文件末尾删除换行符会使一些元素从 DOM 中消失
【发布时间】:2019-10-23 21:56:43
【问题描述】:

这是一个奇怪的错误。我有一个扩展名为 base.html 的基本模板的 html 文件。我注意到基本模板中 body 标记结束之前的 script 标记没有显示在 Chrome 开发工具的 Elements 选项卡中的 DOM 中,并且该标记与其余部分一起被完全切断源选项卡中的 html 文件。这发生在 Chrome、Mozilla 和 Safari 中,所以它一定是 Django 端的问题。显然,脚本应该创建的页面上的可观察效果也不会发生。

这是 Sources 选项卡中呈现的 html 的结尾:

  <section>
    what is going on
  </section>
<footer></footer>
<script src="/static/home/js/ba

完全切断。这是该基本模板的结尾:

  {% block main %}{% endblock %}

  <footer></footer>

  <script src="{% static 'home/js/base.js' %}"></script>
  {% block js %}{% endblock %}
</body>
</html>

现在,这就是有趣的地方。问题出在文件末尾,所以我只是添加了一些换行符,以查看渲染的 DOM 是否有任何差异:

  {% block main %}{% endblock %}

  <footer></footer>

  <script src="{% static 'home/js/base.js' %}"></script>
  {% block js %}{% endblock %}
</body>
</html>




而且 Sources 选项卡在标签后面显示了一个截断:

  <section>
    what is going on
  </section>
  <footer></footer>
  <script src="/static/home/js/base.j

我不会在此处粘贴它,但我在文件末尾添加了大约 35 个换行符,然后才能在 Sources 中获得我想要的内容。似乎每个换行符都会在一个字符后切断呈现的 html。

  <section>
    what is going on
  </section>
<footer></footer>
<script src="/static/home/js/base.js"></script>
</body>
</html>

脚本的效果终于奏效了。这感觉像是对需要修复的更深层问题的临时解决方案。有人知道到底发生了什么或去哪里看吗?

编辑:这是扩展base.html(位于home 应用程序),称为 work.html

{% extends 'home/base.html' %}

{% block css %}
  <link rel="stylesheet" href="{% static 'work/css/work.css' %}">
{% endblock %}

{% block main %}
  <section>
    hello
  </section>
{% endblock %}

这是呈现它的视图:

from django.shortcuts import render

def work(request):
    return render(request, 'work/work.html', {})

编辑 2: 一些更意想不到的结果:

当我删除脚本时(以便我可以按照 cmets 中的建议将其粘贴到 head 中),呈现的 html 的结尾是这样的:

<section> what is going on </section> 

并在&lt;/head&gt; 标记之前粘贴导致:

<section> what is going on </section> 
< 

当我在头脑中将其注释掉时,上面的结果相同。

&lt;/body&gt; 之前注释掉脚本会导致:

<section> what is going on </section> 
<footer></footer> 
<!-- <script src="/static/home/js/base.j 

用双引号替换单引号导致呈现的 html 显示双引号而不是单引号作为唯一的区别。 :/

然后我删除了几乎所有内容,所以我的代码是这样的:

<!DOCTYPE html>
<html lang="en-US">
<head>
</head>

然后渲染:

<!DOCTYPE html>

<html lang="en-US">
<head>
<scrip

我添加了一些标签:

<!DOCTYPE html>
<html lang="en-US">
<head>

</head>
<body>

</body>
</html>

结果:

<!DOCTYPE html>

<html lang="en-US">
<head>
<script src="http://127.0.0.1:357

由于某种原因,django-livereload-server 生成的脚本标签仍然存在。这是完整的脚本标签的样子: &lt;script src="http://127.0.0.1:35729/livereload.js"&gt;&lt;/script&gt;&lt;/head&gt;

【问题讨论】:

  • 这很好奇 :) 你能告诉我们你用什么来渲染这个模板吗?
  • @bug 是的,所以基础模板在 home 应用中,而 work.html 是扩展基础模板的模板,是位于 work 应用程序中。我在上面的编辑中添加了呈现 work.htmlviews.py 和模板本身。
  • 这很奇怪!这仅发生在最后一个脚本标签上吗?如果脚本标签在 中会发生什么?尝试在 html 注释中渲染 script 标签: 你能展示一下,结果是什么?
  • 使用双引号,例如 。并在基础文件中添加了 {% load static %}
  • @w4113 我做了你要求的事情并在我的编辑 2 中发布了结果。然后我开始大肆删除,发现 django-livereload-server 是罪魁祸首。请参阅编辑 2 的结尾和下面的答案。花了一整天的时间,phewwww。

标签: django django-templates


【解决方案1】:

谜团笼罩着所有人。问题是你不应该pip install django-livereload-server。我不知道它在幕后做了什么,但我的一些 html 基于一些奇怪的算法消失了。

所以,要卸载 django-livereload-server,请从 INSTALLED_APPS 中删除 'livereload',,从 MIDDLEWARE 中删除 'livereload.middleware.LiveReloadScript',,点击 Control-C 退出 livereload 终端进程,Control-C 进入运行runserver 进程以应用更改的窗口(因为livereload 像水蛭一样锁定到runserver,所以你必须重新启动),并享受预期的输出。和pip uninstall django-livereload-server。如果有人对有效的 livereload 类型的应用程序有任何建议(当您在 html/js/css 中键入新内容时,浏览器会重新加载页面),请告诉我。现在我猜它又回到了旧的手动输入的Command-R。

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2013-04-28
    • 2019-11-05
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多