$ ajax-> link()在Firefox中不起作用?

时间:2009-09-30 15:15:55

标签: php javascript ajax cakephp prototypejs

我正在阅读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>

3 个答案:

答案 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中被删除。