如何让浏览器运行在 AJAX 请求后发回的 JavaScript

How do I get the browser to run javascript sent back following an AJAX request?

本文关键字:JavaScript 请求 AJAX 浏览器 运行      更新时间:2023-09-26

我正在使用jEditable允许用户更正表中的电话号码和电子邮件地址,并在按回车键时更新数据库。 问题是从服务器返回的响应只是被客户端解释为文本,而实际上有一些我想要执行的 javascript 代码。

jEditable的工作方式是,你不显眼地将"可编辑"操作附加到DOM元素,这很好用。观察客户端使用 tcpdump 发送到服务器的内容,我可以看到 POST 是 html,带有 X-Request-With: XMLHttpRequest;从服务器返回的是内容类型:text/javascript。

有问题的 Rails 控制器操作是verify_email的,并且由于我让所有验证逻辑完美运行,但客户端 javascript 没有,因此我将控制器操作缩短为:

def verify_email
  respond_to do|format|
    format.js
  end
end

同样将verify_email.js.erb简化为仅

$(function(){ console.log("hello from verify_email callback")});

你会认为我会在浏览器控制台中得到一个愉快的问候,但没有,而是 td 的值更改为文本 '$(function(){ console.log("hello from verify_email callback")});'

将 jEditable 功能附加到表数据是通过类完成的:

$(function() {
    $('.email')
        .editable('http://newserver.us.org:3001/directory/review/verify_email', {
            indicator : '<%= image_tag "wait18trans.gif", :title => "wait" %>',
            tooltip : "Click to edit...",
            }
        })
})

我只是看不到错误在哪里。 我正在与不使用jEditable的控件进行比较:我有一个复选框,可以在更改时发布:

$(function() {
    $('.checkmark').change(function() {
            $.post("http://newserver.us.org:3001/directory/review/checkmark",
            {"id" : $(this).attr("id")})
        });
});

当我将相同的控制台日志消息放入复选标记.js.erb时,我得到了愉快的问候。 通过电线,标头看起来相同。

我目前的想法是jEditable调整DOM以插入文本输入字段,然后将其删除,这在某种程度上干扰了javascript响应?!?

我在 jEditable 中添加了一个回调以查看返回的内容,如下所示:

$(function() {
    $('.email')
        .editable('http://newserver.us.org:3001/directory/review/verify_email', {
            indicator : '<%= image_tag "wait18trans.gif", :title => "wait" %>',
            tooltip : "Click to edit...",
            callback : function(value, settings) {
                console.log(this);
                console.log(value);
                console.log(settings);
            }
        })
})

这将生成以下控制台日志记录:

[Log] <td class=​"email" id=​"2-3--1347-597" title=​"Click to edit...">​$(function(){ console.log("hello from verify_email callback")});
[Log] $(function(){ console.log("hello from verify_email callback")});​
[Log] Object
ajaxoptions: Object
autoheight: true
autowidth: true
callback: function (value, settings) {
event: "click.editable"
height: 35
id: "id"
indicator: "<img alt="Wait18trans" src="/directory/images/wait18trans.gif" title="wait" />"
loaddata: Object
loadtext: "Loading..."
loadtype: "GET"
name: "value"
onblur: "cancel"
placeholder: ""
submitdata: Object
target: "http://newserver.us.org:3001/directory/review/verify_email"
tooltip: "Click to edit..."
type: "text"
width: 202
__proto__: Object

value是一串javascript是没有帮助的。

最终,我希望javascript做的是更新td的id。 所以也许我需要在jEditable帖子之前获取对td的引用,以便在返回时用于找到正确的元素?

看来 rails 控制台日志为我提供了解决这个问题所需的信息。

不使用jEditible的复选框被rails以这种方式看到:

Processing by ReviewController#checkbox as */*

我的电子邮件 tds 被铁路以这种方式看到:

Processing by ReviewController#verify_email as HTML

这在某种程度上是可以理解的,那么为什么我发回的所有内容都被简单地解释为 HTML(即使我只有一个responds_to |format| format.js...)

因此,在我为类"电子邮件"的元素分配jEditable时,我添加了dataType的ajax选项:"(JQuery文档说dataType是智能的...jEditable将其设置为HTML)

$(function() {
    $('.email')
        .editable('http://newserver.us.org:3001/directory/review/verify_email', {
            indicator : '<%= image_tag "wait18trans.gif", :title => "wait" %>',
            tooltip : "Click to edit...",
            ajaxoptions : { dataType:""}
        })
})

现在一切都像我预期的那样工作!