微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jquery – 原始javascript渲染在后退按钮上单击

我们的团队最近提出了一个初始的边缘案例问题,其中一个用户将从具有某种 JavaScript渲染的页面(无论是Ajax,标签等)点击浏览器的后退按钮时都将显示原始的JavaScript.要重新创建,我们遵循以下步骤:

>访问用户工作申请索引
>点击一个按钮到管理职位发布页面
>点击一个选项卡(使用bettertabs宝石)
>点击浏览器的返回按钮

以前的步骤将显示

(function() {

  $(".job_applications").html("<li class=\"job_posting_application\">\n
    ...
    ...
    ...
    ...
  );

}).call(this);

在某些命中或错误的情况下,您不需要在返回上一页之前单击选项卡,但仍会呈现原始的JavaScript.在一天结束的时候,似乎最后一个渲染的模板被缓存,这在浏览器的一部分是正常和预期的,但是导致我认为是一个更大的问题.

Rails指南在Layouts and Rendering的部分中明确指出了模板的MIME类型:

By default,Rails will serve the results of a rendering operation with the MIME content-type of text/html (or application/json if you use the :json option,or application/xml for the :xml option.).

根据Rails认值,我们的控制器的索引操作可以渲染我们的index.html.slim模板.但是,当拖尾服务器日志时,当对该页面进行非远程调用(例如,直接导航到浏览器中的页面)时,我们注意到它实际上呈现index.js.coffee.以下是我们的控制器操作,并注意到我们没有显式地响应html或js格式,因为我们可能应该考虑此页面中的重叠功能

def index
  @company_id,@division_id,@job_posting_id = params[:company_id],params[:division_id],params[:job_posting_id]

  # API requests are made here to instantiate @job_posting,et al.,# but are not shown for brevity

  authorize! :manage,@job_posting

  @survey = @job_posting.survey
  @job_applications = @job_posting.job_applications(sort_column,sort_direction)
end

然而,给定这个设置,index.html.slim应该基于Rails认值渲染.当添加一个respond_to块时,似乎缓存仍然有效,并且控制器可以更少地关注respond_to块的存在:

def index
  ...
  ...
  respond_to do |format|
    format.html
    format.js
  end
end

即使明确地,虽然臭,告诉每种格式呈现不同的模板,似乎js.coffee模板优先于html.slim模板:

def index
  ...
  ...
  respond_to do |format|
    format.html { render template: "users/job_posting_applications/index" }
    format.js { render template: "users/job_posting_applications/ajax" }
  end
end

在上述情况下,直接导航到浏览器中的页面(换句话说,不进行远程Ajax调用),服务器日志将呈现ajax.js.coffee,即使除非另有说明,Rails的认值为html.

所有这一切都说,这里有一些其他的发现:

Started GET "/users/companies/1/divisions/18/job_postings/349421/applications" for 127.0.0.1 at 2012-10-03 19:55:26 -0400
Processing by Users::JobPostingApplicationsController#index as JSON

(您可以参考上述in this pastie所示的整个请求)

为什么它的处理是因为JSON超出了我的范围,考虑到我们不会在此请求中提供任何JSON,并且在路由中没有规定以下路由:json for this route.

此外,当调用此操作中的request.format的值时,它返回application / json.

一个呈现的场景是在另一个控制器(users / company_admin_metrics#index)中,它只包含一个index.html.slim模板.当导航到此页面时,服务器日志显示它在布局/用户中呈现用户/ company_admin_metrics / index.html.slim.当我创建一个空白的js.coffee模板:

$touch app/views/users/company_admin_metrics/index.js.coffee

并直接导航到该索引页面,服务器日志显示它呈现用户/ company_admin_metrics / index.js.coffee,这进一步暴露了有关模板渲染优先级的潜在问题.

有没有人遇到类似的问题,可能会为此提供一个潜在的解决方案?

我们的堆栈

以下是这个特殊问题的基本参与者的一小部分列表:

> Rails 3.2.6
咖啡轨3.2.1
> Bettertabs 1.2.6

这个请求取决于我们的职位发布API的请求,通过解析JSON并返回一个Ruby对象的客户端gem,但是这些应用程序不会与这个特定的应用程序相结合,从而会导致此应用程序的内容类型为application / json用于上述请求.

解决方法

我想你需要将格式扩展名.js附加到您的ajax请求中的URL.

可能发生的情况是用户正在使用html的GET请求在/ job_applications上执行索引操作.然后,ajax正在点击相同的URL /动作,但要求javascript.当用户点击后退按钮时,浏览器无法区分两者,所以使用最近的(javascript响应).

原文地址:https://www.jb51.cc/jquery/176352.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐