gpt4 book ai didi

jquery - 单击后退按钮时呈现的原始 javascript

转载 作者:行者123 更新时间:2023-12-03 22:14:03 24 4
gpt4 key购买 nike

我们的团队最近遇到了一个最初的边缘问题,当用户从具有某种 javascript 渲染(例如 Ajax、选项卡等)的页面单击浏览器的后退按钮时,将显示原始 javascript。要重新创建,我们遵循以下步骤:

  • 访问用户职位申请索引
  • 点击按钮进入管理职位发布页面
  • 单击选项卡(使用 Bettertabs gem)
  • 单击浏览器的后退按钮

  • 前面的步骤将显示:
    (function() {

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

    }).call(this);

    在某些命中或未命中的情况下,您无需在返回上一页之前单击选项卡,但它仍会呈现原始 javascript。归根结底,最后呈现的模板似乎正在被缓存,这在浏览器方面是正常的和预期的,但会导致我认为是一个更大的问题。

    Rails Guides 在 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 的默认设置,我们的 Controller 的索引操作预计会呈现我们的 index.html.slim模板。但是,在拖尾服务器日志的同时对该页面进行非远程调用(例如,直接导航到浏览器中的页面)时,我们注意到它实际上呈现 index.js.coffee .下面是我们的 Controller 操作,请注意我们没有明确响应 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 时块,似乎缓存仍然有效, Controller 可能不太关心 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 处理。对于这条路线。

    另外,在调试 request.format 的值时在这个 Action 中,它返回 application/json .

    呈现的另一个场景是在另一个仅包含 users/company_admin_metrics#index 的 Controller ( index.html.slim )中模板。导航到此页面时,服务器日志显示它呈现 users/company_admin_metrics/index.html.slimlayouts/users .当我创建一个空白的 js.coffee 模板时:
    $ touch app/views/users/company_admin_metrics/index.js.coffee

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

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

    我们的堆栈

    以下是这个特定问题的基本参与者的详细列表:
  • rails 3.2.6
  • 咖啡轨 3.2.1
  • Bettertabs 1.2.6

  • 此请求取决于通过客户端 gem 对我们的职位发布 API 的请求,该请求解析 JSON 并返回一个 Ruby 对象,但这些请求与此特定应用程序的耦合方式不会导致冲突并导致此应用程序的内容类型为 application/json对于如上所述的此类请求。

    最佳答案

    我认为您需要附加格式扩展 .js到您的 ajax 请求中的 URL。

    可能发生的情况是用户正在点击 index行动在 /job_applicationsGET请求 html。然后 ajax 访问相同的 URL/操作但请求 javascript。当用户单击后退按钮时,浏览器无法区分两者之间的区别,因此使用最新的(javascript 响应)。

    关于jquery - 单击后退按钮时呈现的原始 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12730754/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com