1

私は、htmlを受け入れてブラウザでレンダリングするbackbone.js CMSのようなものを持っています。以下は、バックボーン ページ オブジェクトをレンダリングするテンプレート ファイル (.hamlc 内) です。

%h1.text= @page.get('title')
.text.page-content!= @page.get('content')

<script>タグを取得するまで、これは正常に機能します。ウィジェット用のスクリプト タグがあります (以下)。

<script src='http://www.opentable.com/frontdoor/default.aspx?rid=52900&restref=52900&bgcolor=8AA86B&titlecolor=0F0F0F&subtitlecolor=0F0F0F&btnbgimage=http://www.opentable.com/frontdoor/img/ot_btn_black.png&otlink=FFFFFF&icon=light&mode=short&hover=1'></script>

このウィジェットは(ソースを見れdocument.writeばわかります) を使用します。まず、ページをロードしても何も表示されません (ウィジェットを html ファイルでテストしたところ、通常の god-awful が表示されます)。要素を調べると、script タグが削除されているようです。

ただし、次のようにテストすると:

<script type="text/javascript">
    alert(0);
</script>

走る。ただし、インスペクターにはまだ何もありません。

最後に、次のテストを行います。

<script type="text/javascript">
    document.write('test');
</script>

それも走る。ただし、ページのコンテンツが完全に破棄され、「test」のみが表示されます。

this article about using document.write for widgetsによると、ページの読み込み後に実行できないと書かれています。ここで起こっているのは、ページの読み込み後に document.write が実行され、すべてのコンテンツが破棄されていることだと思います。これは、backbone.js が使用する手法 (ページが読み込まれると DOM に要素を追加/置換する) であるためです。

Backbone.js CMS で document.write ウィジェットを含むスクリプト タグを受け入れるようにするにはどうすればよいですか?

4

3 に答える 3

2

私はそれを再現できません。テンプレートは本来のようにレンダリングされます:

$ coffee
coffee> hc = require './src/hamlc'
{ compile: [Function],
  template: [Function],
  __express: [Function] }
coffee> template = hc.compile ".text.page-content!= @content"
[Function]
coffee> template(content: 'Hello <script>Script</script>')
'<div class=\'page-content text\'>Hello <script>Script</script></div>'

script タグは保持されます。最新バージョンがインストールされていますか?

于 2013-06-18T06:48:37.697 に答える
1

私の理解が正しければ、テンプレート内にウィジェットの script タグを含めようとしています。つまり、最初の DOM の準備が整った後に挿入されます。あなたが言及した理由から、それはうまくいきません。スクリプトが実行されると、DOM 内のすべてが置き換えられます。

head初期 DOM が完了する前、つまり < > 内または < > の先頭でスクリプトをロードする必要がありますbody。つまり、スクリプト タグをクライアント側で動的に生成するのではなく、サーバーによって配信される初期 HTML にスクリプト タグを含める必要があります。

于 2013-06-29T07:53:56.713 に答える
1

ページが読み込まれた後に document.write を呼び出しているため、ページ全体が上書きされます。script タグを iframe に配置するか、monkey patch document.write を試して、ページが読み込まれた後に異なる動作をすることができます。この質問に対するトップの回答を参照してください。

動的に追加された JavaScript は、(コードではなく) HTML ページ ビューを上書きします。

于 2013-07-01T15:53:03.553 に答える