Проверьте, включен ли jQuery в Заголовок (Joomla)

Если у Вас есть код нес отступом, который похож на это...

if (foo)
{
/* line 1 */
/* line 2 */
/* line 3 */
}

... устанавливают Ваш курсор на "строку 1" в командном режиме и типе 3==, где 3 количество строк для расположения с отступом.

7
задан Alix Axel 13 October 2011 в 13:44
поделиться

6 ответов

Еще лучше, вы можете проверить это с помощью JavaScript, а затем добавить в заголовок, если он отсутствует .

   if (typeof jQuery == 'undefined') { 
   var head = document.getElementsByTagName("head")[0];
   script = document.createElement('script');
   script.id = 'jQuery';
   script.type = 'text/javascript';
   script.src = 'js/jquery.js';
   head.appendChild(script); 
}
14
ответ дан 6 December 2019 в 09:20
поделиться

Сначала следует выполнить проверку в javascript. например:

window.onload = function()
{
   if (typeof(window.jQuery)=="undefined")
      alert('jQuery no load');
   else
      alert('jQuery Ok');
}

тогда вы можете отправить сообщение с помощью ajax на сервер.

1
ответ дан 6 December 2019 в 09:20
поделиться

Это невозможно. PHP является серверным, а Javascript (язык, на котором написан JQuery) - клиентским. Код PHP по своей сути должен запускаться до того, как текст, включающий Javascript, даже будет отправлен пользователю и попытается его загрузить.

Лучше всего не включать jQuery более одного раза. Вы можете сделать это, заменив все свои включения чем-то вроде:

<script type='text/javascript'>
    if($) { } // test to see if the jQuery function is defined
    else document.write("<script type='text/javascript' src='jquery.js'></script>");
</script>

По общему признанию, это немного взлом, и может быть лучший способ.

РЕДАКТИРОВАТЬ: Немного подумав: это может даже не сработать из-за асинхронности загрузки библиотеки jQuery с сервера. Похоже, что лучший способ сделать это - использовать обработчик событий onload , прикрепленный к сценарию include, но DOM этого не поддерживает.

РЕДАКТИРОВАТЬ 2: Хорошо, теперь я думаю, что лучше всего было бы просто включить его один раз на страницу, используя только один тег скрипта для каждой страницы. Вы можете сделать это, добавив его в какой-то глобальный заголовок, а затем удалив везде. Затем, несмотря ни на что, не включайте его снова. Это может означать, что вы загружаете его на некоторые страницы, которым он не нужен, но из-за наличия кеша в современных браузерах это не должно быть проблемой.

1
ответ дан 6 December 2019 в 09:20
поделиться

Я предполагаю, что вы используете Joomla1.0?

Joomla буферизует содержимое, используя выходной буфер PHP. то есть: ob_start ().

Вы можете получить содержимое, используя: ob_get_contents ();

Таким образом, вы можете иметь регулярное выражение, которое проверяет наличие JQuery. Что-то вроде:

$jquery_loaded = preg_match("/<script.*?src=[\"']jquery[^\"']\"/i", ob_get_contents());

должно быть достаточно хорошо. (Я этого не проверял).

Использование ob_get_contents () может не работать в ситуациях, поскольку выходной буфер PHP может быть вложенным. Вы можете запустить любое количество буферов внутри буферов.

Для Joomla1.5 вы можете получить буфер через API, который гарантирует, что вы всегда будете получать вывод Joomla.

$Document =& JFactory::getDocument();
$buffer = $Document->getBuffer();

Независимо от того, Joomla 1.0 или 1.5, вы должны отметить, что Joomla может добавлять в буфер в любой момент до того, как он отобразит вывод (вызывает ob_flush () или эквивалент). Таким образом, ваша проверка для JQuery должна учитывать, что JQuery может быть загружен после проверки.

Обратите внимание, что буфер Joomla создается не только для HTML, но может быть CSS, JavaScript, XML, JSON и т. Д. Поэтому вы можете проверить HTML перед выполнением тестов JQuery. Вы также можете протестировать админку.

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

        // deactivate for backend
        if ($mainframe->isAdmin() || $doctype != 'html') {
            return false;
        }

Для справки - это пример системного плагина, который частично выполняет то, что вы хотите. Это плагин для совместимости с MooTools1.2.

<?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);
    }

}

?>
3
ответ дан 6 December 2019 в 09:20
поделиться

Вы можете попробовать использовать объект JDocument , чтобы получить заголовки, выполнить поиск jQuery, а затем выполнить сброс при необходимости. В этом вам помогут методы getHeadData () и setHeadData () . Вы можете получить текущий объект JDocument с помощью этого кода:

$document =& JFactory::getDocument();

Вы также можете посмотреть этот ответ на аналогичный вопрос: Joomla, конфликтующие модули jQuery

В этом случае вы фактически удаляют избыточные нагрузки jQuery.

1
ответ дан 6 December 2019 в 09:20
поделиться

Если Joomla не предоставляет способ сообщить вам, какие скрипты она включает? (Такой список есть в Zend Framework)

0
ответ дан 6 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: