Joomla, jQuery модули конфликтуют - PullRequest
2 голосов
/ 25 августа 2009

У меня есть пользовательское аккордеонное меню jQuery на моем сайте в модуле, когда мод включен, он ломает мой модуль RokSlideshow.

Я не могу заставить их обоих работать одновременно.

Сайт http://www.fbcsheffield.org/2.0

Любая помощь будет высоко ценится!

Ответы [ 5 ]

4 голосов
/ 26 августа 2009

Вы должны сначала принудительно загрузить MooTools, затем загрузить jQuery и попросить его перейти в режим «Нет конфликта» до выполнения любого кода или плагинов jQuery. Проверьте страницу 183 этого: http://www.packtpub.com/files/learning-joomla-1-5-extension-development-sample-chapter-8-using-javascript-effects.pdf или эту тему на форуме Joomla: http://forum.joomla.org/viewtopic.php?f=231&t=283215

Edit: вам на самом деле не нужно сначала загружать MooTools, вы просто должны убедиться, что jQuery.noConflict () вызывается немедленно после загрузки jQuery: http://www.designvsdevelop.com/jquery-in-joomla-i-was-wrong

1 голос
/ 26 августа 2009

Joomla буферизирует весь контент с помощью ob_start (). Вы можете получить текущий буфер с помощью:

$body = JResponse::getBody();

Затем вы можете найти объявления скриптов JQuery и MooTools и реструктурировать их в системном плагине, используя событие "onAfterRender".

Вы можете использовать preg_replace (), чтобы взять JQuery и вставить после MooTools. Затем вы можете включить режим без конфликтов в JQuery.

 jQuery.noConflict();

Вот пример плагина, который изменяет MooTools с 1.1 на 1.2. Вы можете сделать что-то похожее для режима без конфликтов в JQuery.

<?php
/**
 * MooTools1.2 w/ 1.1 compat for AjaxChat
 * @copyright www.fijiwebdesign.com
 * @author gabe@fijiwebdesign.com
 * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
 */

// included only
defined( '_JEXEC' ) or die( 'Direct Access to this location is not allowed!' );

jimport( 'joomla.plugin.plugin' );

/**
 * Joomla PHP Speedy Integration
 *
 * @author gabe@fijiwebdesign.com
 */
class  plgSystemAjaxchat extends JPlugin
{
    /**
     * Constructor
     *
     * For php4 compatability we must not use the __constructor as a constructor for plugins
     * because func_get_args ( void ) returns a copy of all passed arguments NOT references.
     * This causes problems with cross-referencing necessary for the observer design pattern.
     *
     * @access  protected
     * @param   object $subject The object to observe
     * @param   array  $config  An array that holds the plugin configuration
     * @since   1.0
     */
    function plgSystemAjaxchat(& $subject, $config)
    {
        parent::__construct($subject, $config);

        $mainframe =& JFactory::getApplication();
        $document   =& JFactory::getDocument();
        $doctype    = $document->getType();

        // deactivate for backend
        if ($mainframe->isAdmin()) {
            return false;
        }

        // add mootools 1.2
        if ( $doctype == 'html' ) {
            $document->addScript('components/com_ajaxchat/js/mootools-1.2-core.js');
            $document->addScript('components/com_ajaxchat/js/mootools-1.2-more.js');
            $document->addScript('components/com_ajaxchat/js/mootools-1.2-core-compat.js');
            $document->addScript('components/com_ajaxchat/js/mootools-1.2-more-compat.js');
        }

    }

    /**
     * After Templte output is in buffer
     */
    function onAfterRender() {

        $mainframe =& JFactory::getApplication();
        $document   =& JFactory::getDocument();
        $doctype    = $document->getType();

        // deactivate for backend
        if ($mainframe->isAdmin()) {
            return false;
        }

        // Only render for HTML output
        if ( $doctype !== 'html' ) { 
            return; 
        }

        // get the output buffer
        $body = JResponse::getBody();

        // remove mootools if not needed
        if (stristr($body, 'mootools.js') || stristr($body, 'mootools-uncompressed.js')) {
            $body = preg_replace("/<script.*?mootools(-uncompressed)?\.js.*?<\/script>/i", '', $body);
        } else {
            $body = preg_replace("/<script.*?mootools-1\.2\-.*?\.js.*?<\/script>[\s\t\r\n]*/i", "\n", $body);
        }

        JResponse::setBody($body);
    }

}

?>
1 голос
/ 26 августа 2009
0 голосов
/ 23 марта 2010
0 голосов
/ 25 августа 2009

У вас конфликтующие инструменты moo-tools и jquery. Я бы предложил использовать модуль слайдшоу jquery - это было бы самым простым способом.

edit: конфликт выглядит так, как будто они используют одно и то же пространство имен, но у меня не так много времени, чтобы углубляться в детали

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...