19

私は自分のapplication.jsに次の関数を入れました:

function test() {
  alert("See Me")
}

Classrooms / _new_small.html.haml:

:javascript
  alert('test');
  test();

私のapplication.html.hamlでは、次のものを使用しています。

= javascript_include_tag 'application'

test is not definedFirebugコンソールでエラーが発生します。テスト関数は、application.jsファイルにあるため、プロジェクト全体で使用できるはずではありませんか?ありがとう

編集:私はjavascriptを介してページをレンダリングしています。それはそれに影響しますか?

$('#test_container').html("<%= escape_javascript(render :partial => 'classrooms/new_small') %>");
4

7 に答える 7

28

アセットパイプラインとコーヒースクリプトを使用していると仮定します。application.jsにコードを記述しないでください。

クリーンな構造を維持するために、フォルダ(例:)を作成しますapplicationapp/assets/javascripts

その後、あなたの中でそれを必要としますapplication.js

//= require jquery
//= require jquery_ujs

//= require_tree ./application

コーヒーファイルを作成します(例:app/assets/javascripts/application/my_feature.js.coffee

@test = ->
  alert('Hello world')

コーヒーの出力:

(function() {

  this.test = function() {
    return alert('Hello world');
  };

}).call(this);

名前空間を使用することをお勧めします。

@myGreatFeature =
  test: ->
    alert('Hello world')

またはコーヒースクリプトのFAQによると、あなたは書くことができます

namespace = (target, name, block) ->
  [target, name, block] = [(if typeof exports isnt 'undefined' then exports else window), arguments...] if arguments.length < 3
  top    = target
  target = target[item] or= {} for item in name.split '.'
  block target, top

namespace 'myGreatFeature', (exports) ->
  exports.test = ->
    alert('Hello world')

その後、myGreatFeature.test()どこにでも電話をかけることができます

于 2013-01-08T18:37:17.753 に答える
1

簡単な解決策、削除escape_javascriptしますが、部分的にレンダリングする前になぜescape_javascriptを使用するのか参照してください。。現在実行したい

$('#test_container').html("<script>
//<![CDATA[
 alert('test');
 test();
//]]>
</script>

に変換されます

$('#test_container').html("<script>\n  //<![CDATA[\n    alert(\'test\');\n    test();\n  //]]>\n<\/script>\n");

この問題を解決するにはどうすればよいですか?

app / Assets / javascripts /にproject_wide.jsapplication.jsを含めてから、ファイルを含めるように指示します。

//= require project_wide

必ず上記の行を後に入れてください

//= require jquery
//= require jquery_ujs

今、私がそれに入れたものは何でも、フォルダにあるファイルを除いて、app/assets/javascripts/project_wide.jsプロジェクト全体に恥知らずに表示されます。このファイルには、実行したいものをすべて入れます。public/

一般的な慣行に従ってください

現在、JavaScriptを直接内部に追加していますが、 classrooms/_new_small.html.hamlこれは一般的ではありません。ほとんどの場合、Rails開発者はそのようなものをビューに配置するassets/javascripts/*.jsか、ブロックを呼び出しcontent_for :javascript_customます。これは、によってレイアウトファイルに追加されます。yield :javascript_custom

于 2013-01-04T10:20:27.880 に答える
1

私は問題なくこれを試しました。これが私がそれをした方法です。

// application.js

var test=function(){
  alert("hello");
}

//ビューでは、どちらでも、content_for:additional_javascriptsがあります

<% content_for :additional_javascripts do %>
  <%= javascript_tag do %>
    test();
  <% end %>
<% end %>

//アプリケーションレイアウト

<%= javascript_include_tag "application" %>
<%= yeild(:additional_javascripts) %>

さらに、後でこれを動的にアラートしたい場合は、ページに追加して呼び出したり、クリックリスナーなどに配置したりできます。

メソッドのスコープが適切であるため、構文var functionName = function(){...}が好きです。また、JavaScriptがアセットパイプラインを介してコンパイルされる方法のため、;を追加します。実行されたすべての行の終わりに非常に重要です。

これは、スクリプトを動的にロードし、ページ内のどこからでも呼び出す限り、私にとってもうまくいきました。

$("#click_me").live("click", function(){
  $("<script />").text("test();").appendTo("body");
});

そして、そのページには簡単なリンクがありました。

<a href="#" id="click_me">click</a>
于 2013-01-08T07:55:53.607 に答える
0

あなたはおそらくラインを考えています

= javascript_include_tag "application"

それよりも

= stylesheet_link_tag 'application', :media => 'all'

前者が欠落している場合、JavaScriptは含まれません。

于 2012-12-31T00:57:22.317 に答える
0

使用してみてください:

<%= javascript_include_tag :all %>

あなたのapplication.html.erbファイルで

于 2013-01-02T03:35:27.300 に答える
0

test()関数がインデントされていることに気付きました。これは、関数がネストされていることを示しています。別の関数のスコープ内で関数を定義した場合、その関数の外部では使用できません。

たとえば、これはjQueryを使用して機能するはずです。

function test() { /* do something */ }

// another file or inline script

$(function() {
   test();
});

しかし、これはしません

(function() {
   function test() {}
})();

// another file

test(); // undefined
于 2013-01-02T03:45:51.303 に答える
0

これらすべてのjavascript関数をapplication.jsファイルに入れ、レイアウトファイルのheadタグに<%= javascript_include_tag 'application' %>含めます

于 2013-01-08T12:55:04.407 に答える