我正在阅读Beginning CakePHP,为了让你可以对评论进行投票,它会告诉你创建一些AJAX链接:
<?=$ajax->link('<li>up</li>',
'/comments/vote/up/'.$comment['Comment']['id'],
array('update' => 'vote_'.$comment['Comment']['id']),
null, false);?>
<?=$ajax->link('<li>down</li>',
'/comments/vote/down/'.$comment['Comment']['id'],
array('update' => 'vote_'.$comment['Comment']['id']),
null, false);?>
这在IE中运行良好,但在FF中它根本不做任何事情。它甚至没有到达控制器或模型,因为它生成的链接没有做任何事情。
它生成的HTML如下所示:
<a id="link2128392960" onclick=" event.returnValue = false; return false;" href="/blog/comments/vote/up/1"/>
<li>
<a id="link2128392960" onclick=" event.returnValue = false; return false;" href="/blog/comments/vote/up/1">up</a>
</li>
<script type="text/javascript">
//<![CDATA[
Event.observe('link2128392960', 'click', function(event) { new Ajax.Updater('vote-1','/blog/comments/vote/up/1', {asynchronous:true, evalScripts:true, requestHeaders:['X-Update', 'vote-1']}) }, false);
//]]>
</script>
答案 0 :(得分:4)
首先,您粘贴的HTML输出不准确。看起来你从Firebug或其他东西而不是你的浏览器实际的“查看源”页面复制了这个。 CakePHP实际上并不像您的示例所示那样在此场景中生成自闭合锚标记(<a />
而不是<a></a>
)。
我相信这指出了你的问题。您的浏览器的HTML解析器(或Firebug)尝试在运行时更正代码的事实表明您的HTML格式不正确。具体来说,您不能将块级元素(<li>
)放在内联元素(<a>
)中。
<div class="actions">
<ul>
<li>
<?php echo $ajax->link('up', array(
'controller' => 'comments',
'action' => 'vote',
'up',
$comment['Comment']['id']
), array(
'update' => 'vote_' . $comment['Comment']['id']
), null, false); ?>
</li>
<li>
<?php echo $ajax->link('down', array(
'controller' => 'comments',
'action' => 'vote',
'down',
$comment['Comment']['id']
), array(
'update' => 'vote_' . $comment['Comment']['id']
), null, false); ?>
</li>
</ul>
</div>
上面的示例将生成有效的HTML,因为内联<a>
元素将完全嵌套在块级<li>
元素中。这应该有希望在符合标准的浏览器中修复页面的功能。
答案 1 :(得分:1)
我不认为有一个没有结束锚标记的锚标记是有效的HTML,就像你的第一个链接一样:
<a id="link2128392960" onclick=" event.returnValue = false; return false;" href="/blog/comments/vote/up/1"/>
也许Firefox对此很生气。
您还有两个具有相同ID的标签,这也是无效的HTML,但也可能意味着您的Javascript正在搜索第二个链接上的点击,但该链接被第一个链接“吃掉”,因为您从未结束它
抛出想法; p
答案 2 :(得分:0)
使用php短标签(“<?
”)可能被认为是一种不好的做法,而且它们在php 6中被删除。