2009-09-30 5 views
2

Я читаю Начиная с 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> 

ответ

4

Во-первых, вывод HTML вставили не является точным. Похоже, вы скопировали это из Firebug или что-то вместо своих браузеров на страницу «Просмотр источника». CakePHP фактически не создает самозакрывающиеся теги привязки в этом сценарии (<a /> в отличие от <a></a>), как показано в примере.

Я считаю, что это указывает на вашу проблему. Тот факт, что HTML-парсер вашего браузера (или Firebug's) пытался исправить код во время выполнения, указывает на неправильный формат 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> элементов. Это должно надеяться исправить функциональность вашей страницы в браузерах, совместимых со стандартами.

+0

Хорошо объяснил! Я не видел рассмотрения inline vs. block element. – Kai

+0

Ты был прав, спасибо. – Rob

0

Использование PHP короткие теги («<?») можно считать плохой практикой, плюс они удаляются в PHP 6.

+0

Что не так с этим? http://javascript.about.com/library/blxhtml.htm – Kai

+0

Мой плохой, исправленный. Знаки CDATA в порядке