【问题标题】:Rails 4 - force browser to execute javascript response instead of displaying textRails 4 - 强制浏览器执行 javascript 响应而不是显示文本
【发布时间】:2014-11-13 23:20:03
【问题描述】:

我有一个 Rails 4 应用程序,我需要强制控制器向所有请求(html 或 js)发送 js 响应。由于某种原因,当控制器接收到 html 请求时(例如,当用户通过输入 url 发出请求时),浏览器将响应显示为文本而不是执行代码。

控制器:

def action
  render :template => 'sessions/home.js.erb', :content_type => "text/javascript"
end

sessions/home.js.erb:

$("#button").on("click", function(){
  alert("got here");
});

浏览器不绑定#button,而是简单地将home.js.erb中的代码显示为文本。

我在控制器中尝试了以下选项,但结果相同 - 浏览器只显示文本与执行代码:

render js: "alert('got here')";

render :format => :js, :template => 'sessions/home.js.erb'

respond_to do |format|
   format.html {render :template => 'sessions/home.js.erb', :content_type => 'text/javascript'}
end

respond_to do |format|
   format.html {render :template => 'sessions/home.js.erb', :content_type => 'application/javascript'}
end

谁能帮我弄清楚我需要做什么才能让浏览器执行 javascript?

【问题讨论】:

  • 我也面临同样的问题 - 你找到解决方案了吗?
  • 你有没有找到解决办法?

标签: javascript ruby-on-rails controller render


【解决方案1】:

Rails 可以为您提供code,但您需要确保代码在客户端加载并执行,否则它实际上只是文本。

Jquery 有一些方便的助手来做这件事

$.ajax({
  type: "GET",
  url: "test.js",
  dataType: "script"
});

这将加载并执行一个 Javascript 文件。或者你可以使用

$.getScript( "ajax/test.js", function( data, textStatus, jqxhr ) {
  console.log( data ); // Data returned
  console.log( textStatus ); // Success
  console.log( jqxhr.status ); // 200
  console.log( "Load was performed." );
});

从 Jquery api 文档复制的两个示例。 http://api.jquery.com/jquery.ajax/http://api.jquery.com/jquery.getscript/

【讨论】:

  • 我了解.ajax和.getScript的使用;但是,就我而言,我没有使用 jquery 来发送请求。相反,请求直接来自用户在浏览器中输入 url。因此,这是一个发往服务器的 html 请求,但我需要让浏览器执行 javascript 响应,而不是简单地将 javascript 代码显示为文本。根据您的回答,听起来浏览器似乎只会在向服务器发出 javascript 请求(即 ajax)时执行 javascript 响应。准确吗?
  • 如果您在一个页面上,并且您希望加载与该页面交互的javascript(即,将#button 绑定到一个事件)。然后实际上没有其他方法可以做到这一点,然后 1) 将代码与页面本身一起发送,或者 2) 使用 Ajax 获取代码片段并加载它。发出单独的 HTTP 请求将导致您的浏览器丢弃当前的 html 页面并加载 url 返回的任何内容(在您的情况下是简单显示的文本)。
  • 我的绑定#button 示例可能不是最好的示例。实际上,我的代码实际上是使用 .html() 方法,因为我想忽略当前页面并加载 url 返回的任何内容。唯一的问题是我希望浏览器执行 .html() 而不是显示代码。希望能澄清这个话题,谢谢!
【解决方案2】:

覆盖响应内容类型。在此处阅读有关响应对象的更多信息:http://guides.rubyonrails.org/action_controller_overview.html#the-response-object

试试这个:

def action
  response.content_type = Mime[:js]
  render js: "alert('got here');"
end

或者对于所有操作:

before_filter :force_js

def force_js
  response.content_type = Mime[:js]
end

或使用 respond_to:

def action
  respond_to do |format|
    format.any(:html, :js) { render js: "alert('got here');" }
  end
end

【讨论】:

  • 谁能验证一下?
  • 它不起作用。它只是将 JS 文件作为纯文本吐出。
  • 由于防伪保护,当前 Rails 不再有效
猜你喜欢
  • 2016-07-31
  • 2020-08-16
  • 1970-01-01
  • 2011-05-04
  • 2019-06-03
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多