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-なぜそれが悪いのかについての私の答えを見てください。ここで命を救おうとしているだけです。そして私は正しいです。
ジェイソン

回答:


88

それは完全に有効です。

そこのマークアップに大きなコードブロックを混在させたくない場合は(外部スクリプトを使用する方が良い)、次の場合に役立ちます。

  • プログレッシブエンハンスメントのための追加のバインディング情報を追加します(そのデータをクラス名または属性内の拡張情報を非表示にする他のアプローチに適合させることが難しい場合)。または

  • スクリプト化された拡張機能をできるだけ早く開始する必要がある場合(window-load / document-readyを待つのではなく)。この例としては、オートフォーカスがあります。これは、発射が遅すぎるとイライラする可能性があります。

<style>許可されていない要素について考えているかもしれません<body>(ただし、ほとんどのブラウザーでは許可されています)。


12
オートフォーカスの場合は+1。時々私は遅い接続をしていて、最初のフィールドに戻されたときにすでにどこか別の場所にいるのは楽しいことではありません(最悪の場合:パスワードの入力)。
Marcel Korpel 2010年

1
ただし、JSの埋め込みは、ページが1つしかない場合や、サーバーのルックアップを減らすのに役立ちます。埋め込まれたCSSと同じ話。ただし、通常は、同じjavascriptとcssの要件を持つテンプレートを使用する場合は、(有効なキャッシュヘッダーを使用して)ページの読み込み時間を短縮するために、javascriptコードとcssを別々のファイルに分けることをお勧めします。
コードビート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>

それがグーグルにとって十分であるならば...


37
-1-グーグルがやっているからといって、それが良い習慣であるとは限りません。共通!=良い。
ジェイソン

3
とにかくGoogleAnalyticsは過度に複雑であり、追跡のためのJavaScriptの使用は、実際には過剰設計の良い例です。
esko 2010年

また、スクリプトを配置する必要がある場合にスクリプトを配置する必要がある場所である中央ではなく、ページの下部にスクリプトを配置することをお勧めします。人々が通常それらを置くヘッダーにはありません
Jason

2
トピック外:/ Is Evilをunescape考えると、私は常にGoogleの不必要で奇妙な使用にイライラしています(そしてそれははるかに簡単な方法でした)。escapeunescape\x3C
bobince 2010年

3
@Keltex:コードは無効ではありませんが、一部の人々がそれを使用しているという理由だけでそれが良い習慣であると主張することは有効な引数ではありません。
Matti Virkkunen 2010年

4

これは有効であり、サーバー側のフレームワークとコードの性質によっては、回避するのが非常に難しい場合があります。


4

何人かの人が言ったように、それは有効で、機能し、そして広く使われています。

セマンティクスが推奨する(または少なくとも推奨するために使用される)限りのベストプラクティスは、ヘッダー内にスクリプトタグを配置することです。

パフォーマンスを考慮した最新のベストプラクティスでは、JavaScriptコードが実行される前にマークアップを完全にレンダリングできるように、bodyタグの直前の下部にスクリプトタグ(外部およびインライン)を配置することをお勧めします。

理解しやすく保守しやすいコードとして、「控えめなJavaScript」をお勧めします。コードは外部ファイルにあり、イベントをDOM(Googleの控えめなJavaScript)にバインドします。

JavaScriptをインライン化すると便利な場合の1つは、サーバー側にのみ存在する値で変数を初期化することです。この値は、後で外部JavaScriptコードによって使用されます。


3

私は、外部スクリプトへの参照を頭に入れ、物事を起動してウィジェットなどを初期化するスクリプトを本体に入れることを好みます。

非常に簡単に遭遇する問題は、本文のスクリプト要素がその後に続く要素にアクセスできないことです。また、関連する厄介なブラウザの互換性の問題は、IEがスクリプト要素がそれらが含まれている要素を変更することを許可していないという事実です。したがって、これがある場合:

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

IEはあなたのページを気に入らないでしょう。古いバージョンのIEは、これに対して非常に不可解なエラーメッセージを表示したり、ページ全体を空白にしたりしていましたが、IE8は説明的なエラーメッセージを表示しているようです。

スクリプトが安全にアクセスできるDOMにのみアクセスすることを確認する限り、スクリプト要素を本体に配置することは悪いことではないと思います。実際、IMHOは、関連する要素の後にウィジェットを初期化するスクリプトを配置すると、すべてを1つの場所に配置するよりも読みやすくなります(これにより、ウィジェットが早く実行され、ページの読み込み時にウィジェットがジャンプしにくくなる可能性があります)。


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で「スクリプトの中止」および「スクリプトの続行」オプションを使用してアラートボックスが表示される場合があります)。
Marcel Korpel 2010年

これは真実です。どのJSでもブラウザがハングする可能性があります。ただし、ハングアップする場合(obvは推奨されません)、ページがコンテンツで完全にレンダリングされ、ユーザーがページの読み取り/操作を開始できるようになったら、ハングアップすることをお勧めします。JSがブラウザをハングさせる理由は、ブラウザが同期的に実行されるためです。つまり、ブラウザはJSが何を実行するかわからないため、JSが完全に実行されるまで待機してからレンダリングを続行する必要があります。待っている間はレンダリングされておらず、ぶら下がっているように見えます。
ジェイソン

そのCDATAのものを使用しないでください-それはナンセンスです。XML検証パーサーのみがCDATAセクションを理解するため、ページがHTMLとして提供されている場合、機能的な違いはありません。ただし、ページがXMLとして提供されている場合は、開始タグの前に「//」がレンダリングされます。
ブラザーケーキ2013

2

私はこれを前に見たことがありませんでした。私がテストしたいくつかのブラウザで動作するようです。しかし、私が知る限り、このような場所にスクリプトタグを配置することは有効ではありません。

これは有効ですが、良い(または推奨される)方法ではありません。

私が間違っている?このようなdivタグ内にスクリプトタグを配置するのはどれほど悪いことですか?知っておくべきブラウザの互換性の問題はありますか?

<script>他の要素の下に下を配置しても問題はありません(ただし、<head>またはの中にある必要があります<body>)。ブラウザの互換性に関しても問題はありませんが、WebページにJSスクリプトを埋め込むと、深刻な欠点があります(どのように/なぜ悪いと見なされるのか)

  1. ページの重みを追加します
  2. 縮小化の難しさ(またはおそらく不可能)
  3. 移行したり、他のページに使用したりすることはできません
  4. キャッシュできません(ページが読み込まれるたびにダウンロードする必要があります)
  5. 関心の分離なし(維持が難しい)

2

ただし、HTMLのセクションに必要なJavaScriptコードがそこにあることを知っているという点でも優れています。ファイルの先頭にインクルージョンを表明して構築する必要はありません。

したがって、「このHTMLを使用する場合は、必ずxyz.jsをインポートする」のではなく、HTMLを含めるだけで完了できます。

だから、それは必ずしも恐ろしい悪ではありません。おそらく見事に素晴らしいわけではありませんが、まったくひどいわけでもありません。それは一種の意図に依存します。



1

それは確かに合法です。たとえば、ここExforsysの数ページ見ました。

これは、HTMLとJavaScriptの基本を示すチュートリアルサイトであるため、そのコンテキストでは完全に理解できます。ただし、単純なステートメントまたは2つ以上の場合は、本番コードでそれを確認したくありません。あなたが何に取って代わったのか見// Some JavaScript code hereずにコメントしたくありません。

ただし、これに関してブラウザの問題は発生しないはずです。


1

に<script>を追加することは有効ですbodyが、InternetExplorerは実際にはそれを好みません。したがって、安全を期すために、スクリプトが<head>タグ内にあることを確認してください。

それは、私たちが取り組んでいるプロジェクトに(特にInternet Explorerの)大混乱を引き起こしていました。


1

あなたのチームがこれを行っているのは、スクリプトを動的に挿入したいためか、ページの読み込み時に起動するスクリプトを作成しているためだと思います。

絶対に必要な場合(CDATAブロック内にある限り)、これを行うことに何も問題はないとは言えませんが、それ以外では、PrototypeやjQueryなどのスクリプトライブラリを使用し、維持することをチームに推奨します。ページの外部のスクリプト。これは通常よりクリーンであり、ライブラリはコードに少しクリーンを強制することがありますが、これは現在行われていないに違いありません。

また、インラインスクリプトタグで時間のかかる関数を実行することもありません。これらはページの読み込み時に発生し、Jasonが前述したように、ページの読み込みが遅くなる可能性があるためです。すべてのスクリプトライブラリには、ページの読み込み時に処理を実行できる優れた機能があり、DOMの読み込み後など、ページの読み込み時にそれらを起動するオプションが提供されます。


1

これは、プログラミングへのアプローチを改善することだけでなく、パフォーマンスを改善することでもある、多くのベストプラクティスの1つです。

最終的にWeb開発では、製品を出すことが最も重要です。



0

スクリプトをヘッダーに保持する必要があるというよく言われる推奨事項は、スクリプトが呼び出される前にスクリプトが確実にロードされるようにすることです。これは、特定のイベントハンドラーでのみ問題になります。他のタイプのスクリプトの場合は問題ではなく、一部のタイプ(document.writeなど)の場合は意味がありません。


0

HTMLとJavaScriptの両方の構文を同時に処理できるエディターがある場合。そして、最初に数行のHTMLを読み、次にJavaScriptcpdeを読みたい場合は...確認してください。頑張れ。


VisualStudioと両方を処理できるかみそりのビューのように聞こえます。これは、場合によっては非常に便利です(1か所で編集する必要のあるすべてのコード)。もちろん、ビュー内のJavaScriptが多すぎると、コードの読み取りと理解が困難になる可能性があり、出力htmlが肥大化するという問題もあります。
jahu 2015

0

いくつかのこと:

  1. コード的には完全に有効です。
  2. 完全にお勧めしません。

これを行うと、ページの残りの部分をレンダリングする前にJavaScriptコードを実行する必要があるため、ページの読み込みが大幅に遅くなります。そのJavaScriptコードで多くの作業を行っている場合、ブラウザがハングする可能性があります。JavaScriptコードを動的に、ページの最後(できれば</body>タグの前)にロードするようにしてください(可能な場合はいつでも)。

High PerformanceJavaScriptを購入して読んでください。JavaScriptコードの書き方が変わります。


3
私の反対票ではありませんが、Yahooを考えるとYAHOO.util.Event.addListener、効率的で簡潔なjavascriptではないと思います。私は本を​​読んでそれを福音として扱うことはしません。ページ自体にjavascriptが必要な場合があります。たとえば、動的にレンダリングされる変数は、外部では実行できません.js
NickCraver

2
その本を読んだことがありますか。もし持っていれば、それが最適化技術を教えていることを知っているでしょう。のようなものYAHOO.xx.xx.xxはローカルにキャッシュされます。場合によっては、ページに変数をレンダリングしても問題ありませんが、サーバーから非表示の入力値を設定するだけであれば、通常は外部で実行できます。しかし、私はそれが間違っていないのはお勧めできませんと言いまし。また、著者であるニコラス・ザカスは、彼の雇用主が誰であるかに関係なく、彼のたわごとを知っています。
ジェイソン

2
「動的にロードする」と「ページの最後にロードする」は別物であり、両方を使用することでパフォーマンスが向上する可能性はほとんどありません。「その本を読んだことがありますか?」そして「私は正しい」も建設的な会話を始めるための最良の方法ではありません。また、一部の操作はスクリプトが本体の直接の子である場合にのみサポートされるため、元の質問には「最終的にIEでチョークするため」と答えることができます。
ナチョコロマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.