Rails :Cannot set property 'innerHTML' of null问题解决
环境:ruby 1.8.7 rails 2.2.2 数据库 sqlite
?
今天在练习在线商店的时候,使用Ajax技术向服务器发送请求,向购物车中添加物品的时候,浏览器报错:
Cannot set property 'innerHTML' of null,去看看server.log吧,竟然完全正常,再次刷新网页后,
刚刚选中的物品就显示在了购物车中,仔细的和书上对照了一下,也没发现什么异常,难道是rails的JavaScript
脚本有bug吗?
?
于是,下载FireFox,firebug,开始漫无目的的调试跟踪,因对JavaScript不熟悉,跟踪也是白跟,没有头绪
放弃了,都不知道再哪里加断点合适了,回过头来看看代码,究竟程序是怎么运行的
?
1.在add_to_cart.js.rjs中,新加了如下的代码,还不清楚倒是是干什么的,进去看看replace_html的注释,
? ?#Replaces the inner HTML of the DOM element with the given +id+.
?
? ?# +options_for_render+ may be either a string of HTML to insert, or a hash
? ?# of options to be passed to ActionView::Base#render.?
? ??找到了个貌似很面熟的东东,inner HTML?,不就是刚刚报错的东西吗!,注释的大概意思是:用inner HTML
? ?替换属性为id的元素, 那么这个id是外面传进来的"cart", 也就是说将一段代码插入到id为cart的元素中,看看
? ?id为cart的元素在哪里。。。
?
?
?
page.replace_html("cart", :partial => "cart", :object => @cart)?
2.没找到啊,只找到了一段相似的代码
?
?
<div class="cart" <% if @cart.items.empty? %> style="display: none" <% end %> > <%= render(:partial => "cart", :object => @cart) %> </div>
?
3.基本上知道哪里错了,这个div的属性笔误给写成class了,所以replace_html找不到id为cart的属性,所以就抛出了
?
Cannot set property 'innerHTML' of null的异常,将其修改为id属性,问题解决了!
?
?
总结:.replace_html("cart", :partial => "cart", :object => @cart)简单的理解就是将:partial => "cart",
:object => @cart作为render的参数插入到id为cart属性的html标签中,.replace_html内部会调用render方法
?
?
?
<div id="cart" <%= render(:partial => "cart", :object => @cart) %> </div>
?
?
def replace_html(id, *options_for_render) call 'Element.update', id, render(*options_for_render) end