如何让浏览器运行在 AJAX 请求后发回的 JavaScript
How do I get the browser to run javascript sent back following an AJAX request?
我正在使用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:""}
})
})
现在一切都像我预期的那样工作!
- 使用密码对话框Javascript请求帮助
- 如何使用JavaScript请求网页
- JavaScript请求/操作框架或工具包
- Microsoft认知服务JavaScript请求'访问控制允许来源'
- var someSome=(函数(){..}());一个奇怪的javascript请求
- 如何获得只响应的渲染javascript请求
- Rails控制器操作可以同时处理html和javascript请求吗
- 自动为 JavaScript 请求添加源映射标头
- Google Geocoder 在 url 和 javascript 请求之间有不同的结果
- 通过javascript请求和响应第三方域
- 使用 JavaScript 请求 HTML 页面(Angular 应用程序)
- 如何使用 javascript 请求库忽略无效的 SSL 证书
- 如何使用 PHP 或 JavaScript 请求超过 10000 次的 Steam API
- 定期的javascript请求停止发生
- 无论如何,要将这个JavaScript请求安全地发送到PHP-(这是不可能的)
- 跨域脚本javascript请求
- Web服务和Javascript请求位于同一本地主机端口上
- 来自android的实时javascript请求或来自Controller Cakephp.php的调用javascri
- 非常简单的javascript请求.抓斗元件ID
- Javascript:请求解释