【问题标题】:jQuery: handling mixed html/js ajax responsejQuery:处理混合的 html/js ajax 响应
【发布时间】:2012-06-15 05:13:04
【问题描述】:

在混合 html/js ajax 响应中访问 javascript 代码时遇到问题。 jQuery ajax 文档状态:

如果指定了 html,则检索到的任何嵌入的 JavaScript data 在 HTML 作为字符串返回之前执行

我可以通过在 html 回复中添加一个简单的 sn-p 来确认:

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

那么如何保留对 js 代码的访问权与一次性执行?尝试实现模式登录(以防止表单提交屏幕中会话超时时数据丢失)。当然,我需要能够访问 ajax 的 js 代码,然后验证电子邮件/密码字段和 ajax 验证远程服务器上的用户凭据。

这是模态登录coffeescript sn-p:

# submit form
$.ajax
  success: (data) -> ...
  error: (data) ->
    popAuth(data.responseText) if(data.status == 401)

popAuth = (title) -> 
  $.fancybox({
    href: "/login"
    ajax: { type: "GET" }
    title: title
  })

也许我可以在 popAuth() ajax 选项中添加一个成功回调来存储返回的 js 代码? jQuery“实时”处理程序怎么样?不幸的是,这种情况并不像人们希望的那样直截了当;-) 我已经看到$.getScript 作为一个选项,但我宁愿不要将 html 与 js 分开,因为服务器端已经组装了 html + js 并且原始的 ajax 调用拉一口气搞定。 (即避免创建专用的服务器端控制器来发送回 js 文件内容包)

我当然愿意接受替代解决方案来解决此问题。例如,我可以在隐藏的 div 中存储每个屏幕上的登录字段和 js 登录验证代码(JVM CRUD 应用程序位于 WordPress 前端,因此基本上每个屏幕都需要身份验证),然后“本地”弹出模式登录窗口,其中我认为可以解决远程 ajax 内容的烦人的一次性 js 执行。

无论如何,想法赞赏!客户端既非常简单又……非常复杂;-)

【问题讨论】:

    标签: javascript jquery ajax modal-dialog


    【解决方案1】:

    好的,避开名副其实的大量回复,我会亲自出击。

    据我所知,由于混合的 html/js 内容是一次性执行的,我们有一次机会捕获 ajax 响应 js 代码并将其绑定到当前范围。

    首先,在原始的ajax调用中(即表单提交,返回一个潜在的401未授权状态)设置模态登录的ajax设置的上下文为$(this),当前执行的范围包含jquery验证和其他共享js模式登录 ajax 提交工作所需的代码。

    在我的例子中,使用 fancybox,添加上下文参数现在看起来像:

    popAuth = (title) -> 
      $.fancybox({
        href: "/login"
        ajax: { type: "GET" }
        context: $(@)
        title: title
      })
    

    然后,由于父窗口包含大部分需要的javascript,唯一的要求是创建一个js文件,将模态登录表单按钮点击事件绑定到验证和$.ajax提交。

    # login.coffee
    jQuery ->
      $('#loginSubmit').click (e) ->
        e.preventDefault()
        isValid = $('#loginForm').validate().form()
        if isValid
          $('#spinner').show()
          $.ajax
            data: $('#loginForm').serialize()
            success: (data) ->
              $('#status').fadeOut()
              location.href = '/foo'
            error: (data) ->
              $('#status > div').html( data.responseText )
              $('#status').fadeIn()
            complete: () ->
              $('#spinner').hide()
    

    完成,一切顺利,工作;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      相关资源
      最近更新 更多