如果你用的瀏覽器是Opera的話,會發現由首頁或個別文章的連結進入的話留言不會自動更新,但用選單更新的文章又不會有這個問題。這真的很糟糕,用Opera經超連結進來的人會誤以為文章沒有留言。後來我用Opera打開錯誤主控台看到以下的一句。
Error:
name: TypeError
message: Statement on line xxx: Cannot convert undefined or null to Object
這是什麼意思呢?答案就出在「main」這個includable。
<b:includable id='main' var='top'>
<!-- POSTS -->
<div class='blog-posts'>
<b:loop values='data:posts' var='post'>
<b:include data='top' name='status-message'/>
<b:include data='post' name='post'/>
<script language='javascript'>
var blogAuthor = '<data:post.author/>';
fetchComments('<data:post.id/>');
</script>
</b:loop>
</div>
<b:if cond='data:blog.pageType != "archive"'>
<div class='comments' id='comments'>
<center><h2>No comments yet</h2></center>
</div>
</b:if>
因為fetchComments(postid)會call到updateComments(json)最後到updateCommentsPage(page),而updateCommentsPage(page)會將留言寫到文章中ID為「comments」的這個Div。
問題是,第一次載入頁面fetchComments的時候「comments」根本就尚未出現,所以無法顯示留言的問題只在第一次載入的時候發生。解決方法也很簡單。
先在你的template找到「comments」這個includable並改成下面的樣子,反正整個留言都是由neo.js產生的,所以修改這裡不會有問題。
<b:includable id='comments' var='post'>
<div class='comments' id='comments'>
<center><h3>No comments yet</h3></center>
</div>
</b:includable>
之後再將將「main」includable修改成下面那樣子。
<b:includable id='main' var='top'>
<!-- POSTS -->
<div class='blog-posts'>
<b:loop values='data:posts' var='post'>
<b:include data='top' name='status-message'/>
<b:include data='post' name='post'/>
<b:if cond='data:blog.pageType != "archive"'>
<b:include data='post' name='comments'/>
</b:if>
<script language='javascript'>
var blogAuthor = '<data:post.author/>';
fetchComments('<data:post.id/>');
</script>
</b:loop>
</div>
</b:includable>
儲存範本後再用Opera試試看,這樣做其實只是把「comments」扔上前來,至於為什麼只有Opera才有這個問題我就不知道了。
發佈留言