将JavaScript嵌入HTML主体是否是错误的做法?


84

我正在研究的一个团队已经养成了<script>在HTML页面正文的随机位置使用标签的习惯。例如:

<html>
    <head></head>
    <body>
        <div id="some-div">
            <script type="text/javascript">//some javascript here</script>
        </div>
    </body>
</html>

我以前没看过。它似乎可以在我测试过的几种浏览器中使用。但是据我所知,将脚本标签放在这样的地方是无效的。

我错了吗?像这样将脚本标签放入div标签有多糟糕?我应该注意任何浏览器兼容性问题吗?


1
是在这里做document.writes,还是没有特别的理由让它出现在原地?
马丁·史密斯

8
剧本在人体任何地方都是合法的。没有错。它具有其含义(定时,可维护性,代码和布局的混合,个人喜好),但其他方面都可以。
Tomalak 2010年

@earlz-看看我的答案为什么不好。只是想在这里拯救生命。我是对的。
杰森

Answers:


88

这是完全有效的。

您不想将大量的大代码块混在一起放在标记中(最好使用外部脚本),但是它可以用于:

  • 添加额外的绑定信息以进行渐进增强(在该数据难以放入类名或其他方法将扩展信息隐藏在属性中的情况下);要么

  • 需要尽快启动脚本增强功能的地方(而不是等待窗口加载/文档就绪)。自动对焦就是一个例子,如果开火太晚,可能会感到不适。

您可能正在考虑<style>不允许使用的元素<body>(尽管大多数浏览器允许使用)。


12
+1表示自动对焦;有时我的连接速度很慢,回到第一个字段时已经不在其他地方(在最坏的情况下:输入密码)并不有趣。
马塞尔·科佩尔

1
但是,当只有一页时,嵌入JS可能会很有用,以减少服务器查找。与嵌入式CSS的故事相同。但是通常最好在使用具有相同javascript和css要求的模板时,将javascript代码和css分开在单独的文件中,以减少页面加载时间(使用有效的缓存头)。
Codebeat 2012年

17

实际上,这很普遍。例如,Google的分析跟踪代码仅使用以下语法:

<script type="text/javascript">
  var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
  document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>

如果对Google足够好...


37
-1-仅仅因为Google正在这样做并不意味着它是一种好习惯。普通!=好。
杰森

3
无论如何,Google Analytics(分析)都过于复杂,并且它们使用JavaScript进行跟踪实际上是过度设计的一个很好的例子。
艾斯科(Esko)2010年

另外,他们建议您将脚本放在页面的底部,而不是放在中间,如果必须放置脚本,则该位置应该放在脚本的中间。不在人们通常放置的标头中
杰森(Jason)2010年

2
除了题外话:unescape鉴于escape/ unescapeIs Evil(这\x3C本来是一种更简单的方法),我总是对Google不必要且离奇的使用感到恼火。
bobince 2010年

3
@Keltex:该代码不是无效的,但是声称这是一个好习惯,只是因为有人使用它不是有效的参数。
Matti Virkkunen'5

4

它是有效的,并且根据您的服务器端框架和代码的性质,有时很难避免。


4

正如几个人提到的那样,它是有效的,有效且已被广泛使用。

就语义建议(或至少用于建议)而言,最佳实践是将脚本标签放置在标头中。

考虑到性能的更现代的最佳实践建议将脚本标签(外部和内联)放置在body标签之前的右下角,以允许标记在执行任何JavaScript代码之前完全呈现。

为了便于理解和维护代码,建议使用“不干扰JavaScript”,该代码位于外部文件中,并将事件绑定到DOM(Google不干扰JavaScript)。

内联JavaScript很有用的一种情况是,使用仅在服务器端存在的值来初始化变量,然后供外部JavaScript代码使用。


3

我更喜欢将对外部脚本的引用放在开头,而将这些东西启动并初始化小部件以及诸如此类的脚本放在主体中。

一个很容易碰到的问题是,主体中的脚本元素无法访问其后的元素。另外,一个相关的讨厌的浏览器兼容性问题是IE不允许脚本元素修改其所在的元素。因此,如果您具有以下条件:

<div id="foo">
  <script type="text/javascript">
    document.getElementById("foo")... // do something to it
  </script>
</div>

IE不会喜欢您的页面。IE的旧版本曾经为此提供非常隐蔽的错误消息,甚至整个页面都为空白,但是IE8似乎提供了描述性的错误消息。

只要确保您的脚本仅访问安全访问的DOM,我认为将脚本元素放入正文中并不有害。实际上,恕我直言,将用于初始化小部件的脚本放在相关元素之后比将所有内容放在一个地方更容易阅读(我相信这也可能使它们运行得更早,从而使内容在页面加载时跳动更少)。


3

有效!

您可以使用:

<script type="text/javascript">
    //<![CDATA[

    // Some JavaScript code that perfectly validates in the W3C validator

    //]]>
</script>

我认为您通常不能说这是一个不好的做法。你必须告诉案件。但是可以肯定的是,将所有JavaScript代码放在同一位置是一件好事。如果您的HTML文件中包含很少的JavaScript代码,则可能会有些混乱。


2
一般来说,这是一种不良做法。
杰森

好吧,刚读完你的帖子,很高兴知道。无论如何,我从来没有做过,但是尽管如此,它永远不会挂起您的浏览器……它是怎么来的?
meo 2010年

1
任何JavaScript都可以使您的浏览器挂起(有时我仍会在Firefox中使用“中止脚本”和“继续脚本”选项获得那些警报框)。
马塞尔·科佩尔

这是真的,任何JS都可以挂起您的浏览器。但是,如果要挂起它(从不建议使用Obv),则最好在页面已完全显示内容并且用户可以开始阅读/与页面进行交互后再进行操作。JS使您的浏览器挂起的原因是因为它同步运行,这意味着浏览器必须等待JS完全执行后才能继续渲染,因为它不知道JS会做什么。在等待时,它没有渲染,使其看起来像挂着。
杰森

不要使用CDATA东西-这是胡说八道。只有XML验证的解析器才能理解CDATA部分,因此,如果您的页面以HTML格式提供,则不会产生功能差异。但是,如果您的页面以XML形式提供,则它将在开始标记之前呈现“ //”。
13年

2

我以前没看过。它似乎可以在我测试过的几种浏览器中使用。但是据我所知,将脚本标签放在这样的地方是无效的。

这是有效的,但不是一种好的(或推荐的)做法。

我错了吗?像这样将脚本标签放入div标签有多糟糕?我应该注意任何浏览器兼容性问题吗?

将a<script>放在其他任何元素下都没有问题(但它应该在<head>或内<body>)。在浏览器兼容性方面也没有问题,但是,在网页上嵌入JS脚本存在严重的缺点(如何/为什么认为它们不好)

  1. 增加页面重量
  2. 缩小难度大(或可能不可能)
  3. 无法迁移或用于其他页面
  4. 无法缓存(每次加载页面时都需要下载)
  5. 没有关注点分离(难以维护)

2

但是,这样做也很不错,因为您知道一段HTML所需的JavaScript代码将准备就绪。无需断言并在文件顶部建立一些包含。

因此,您可以只包含HTML并完成操作,而不是“如果要使用此HTML,请确保导入xyz.js”。

因此,这不一定是可怕的邪恶。也许不是很棒,但是也不是那么可怕。这取决于意图。



1

当然是合法的;例如,我在Exforsys的几页看到了它。

现在,这是一个教程网站,显示HTML和JavaScript的基础知识,因此在这种情况下完全可以理解。但是,除了一两个简单的语句外,我不希望在生产代码中看到它。没有看到你所取代的// Some JavaScript code here我不想发表评论。

但是,不应有任何浏览器问题。


1

在中添加<script>是有效的body,但是Internet Explorer确实不喜欢它。为了安全起见,请确保您的脚本位于<head>标记内。

这确实在我们正在研究的项目中造成了破坏(尤其是对于Internet Explorer)。


1

我假设您的团队正在执行此操作,或者是因为他们想动态插入脚本,还是因为他们正在编写将在页面加载时触发的脚本。

我绝对不会在绝对必要时(只要它在CDATA块中)这样做有什么问题,但是除此之外,我建议您的团队使用Prototype或jQuery之类的脚本库,并保持页面外部的脚本。这通常更干净,并且库有时会强制对代码进行一些清洁,我敢打赌目前还没有发生。

我也不会在嵌入式脚本标记中运行任何耗时的函数,因为这些函数会在页面加载时发生,并且正如Jason所述,这可能会减慢页面的加载速度。所有脚本库均具有简洁的功能,可让您在页面加载时执行操作,并提供在页面加载时触发它们的选项,例如在加载DOM之后。


1

它是众多最佳实践之一,与改善性能和改善编程方法同样重要。

最终,在Web开发中,发布产品最重要!



0

通常建议将脚本保留在标头中是为了确保在调用脚本之前已加载该脚本。这只是某些事件处理程序的问题。对于其他类型的脚本,这没有关系,而对于某些类型(例如document.write),则没有任何意义。


0

如果您拥有可以同时处理HTML和JavaScript语法的编辑器。而且,如果您想先阅读几行HTML,然后再阅读JavaScript cpde ...,请确定。去吧。


听起来像Visual Studio和可同时处理这两者的剃刀视图。在某些情况下这很方便(您需要在一个地方编辑的所有代码)。当然,视图中的javascript过多会使阅读和理解代码变得困难,并且还存在使输出html膨胀的问题。
jahu 2015年

0

一些东西:

  1. 在代码方面完全有效。
  2. 完全不建议这样做。

这样做会大大降低您的页面加载速度,因为必须执行JavaScript代码才能呈现页面的其余部分。如果您在该JavaScript代码中进行了大量工作,则浏览器可能会挂起。您应该(尽可能)尝试动态加载JavaScript代码,并在页面末尾(最好在</body>标记之前)加载JavaScript代码。

购买并阅读高性能JavaScript。它将改变您编写JavaScript代码的方式。


3
不是我的不赞成,而是当我想到Yahoo时,我认为YAHOO.util.Event.addListener不是高效/简洁的javascript。我不会读一本书并将其视为福音,有时您必须在页面本身中包含javascript,例如,动态呈现的变量,而在external中则无法做到.js
尼克·克拉弗

2
你读过这本书吗?如果有的话,您会知道它教授优化技术。诸如此类YAHOO.xx.xx.xx的东西在本地缓存。有时候,可以在页面上呈现变量是可以的,但是如果您只是从服务器设置了隐藏的输入值,通常可以在外部进行。但我说的话是不推荐的。同样,作者尼古拉斯·扎卡斯(Nicholas zakas)知道他的狗屎,无论他的雇主是谁。
杰森

2
“动态加载”和“在页面末尾加载”是不同的东西,并且同时使用它们会提高性能是极不可能的。“你读过这本书吗?” 和“我是正确的”也不是开始建设性对话的最佳方法。原始问题也可以用“因为它最终会在IE上阻塞”来回答,因为仅当脚本是body的直接子代时才支持某些操作。
Nacho Coloma 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.