1

Тема: Подключение js в 1.4

Подключается js так:
$forum_loader->add_js($js_code_url, array('type' => 'url'));
Но мне удается выполнить эту строку только из расширения и хука ft_js_include. В любом другом месте он не хочет подключать js и не выдает ошибок. Больше нет способов?

Использую: sql - php - yii - ajax - jq - js - css - bootstrap - less - html - knockout js - ruby on rails.
Интересно: css3, html5 -> appCache, workers, sockets и т.д.
Будущее: адаптивные сайты (они же и локальные приложения).

Поделиться

2 (07.08.2011 10:54 отредактировано dimkalinux)

Re: Подключение js в 1.4

Использовать лоадер можно в любом месте.
Для подключения CSS до или в вызове hd_head.
Для подключения JS до или в вызове ft_js_include.

Если используете лоадер в функции то не забывайте предварительно импортировать его в область видимости через global $forum_loader.

type - может быть url или inline. Inline используется для включения кода JS в страницу.
Если ваш JS не зависит от других скриптов JS, кроме punbb.common.js или pun_jquery то желательно добавлять параметр 'async' => true. Async == false означает, что скрипты загружаемые после вашего будет ждать пока ваш скрипт загрузится и выполниться.

Учтите, что JS в 1.4 по-умолчанию грузится асинхронно и может быть загружен уже после DOMReady события. Стандартные функции форума addDOMReadyEvent и addLoadEvent это учитывают, поэтому желательно использовать их. jQuery Ready тоже должен работать корректно.

Так же, по-умолчанию, нельзя использовать write() в скриптах. Он не работает в асинхронном режиме. Поэтому, для загрузки кода с write() или любого другого скрипта, который не работает при асинхронной загрузке добавляйте параметр 'group' => FORUM_JS_GROUP_COUNTER скрипты из этой группы выполняются последними, в синхронном режиме.

Примеры
Загрузка скрипта, от которого могут быть зависимы другие скрипты (поэтому async == false) и который надо грузить раньше других скриптов (поэтому weight == 77).

<hook id="ft_js_include" priority="4"><![CDATA[
            $forum_loader->add_js($ext_info['url'].'/js/fancy_jquery_addons.min.js', array('type' => 'url', 'async' => false, 'weight' => 77));
        ]]></hook>

Обычная загрузка скрипта, который ни от чего не зависит (кроме punbb.common.js или jquery) + инлайн код.

$fancy_image_js_env = '
    PUNBB.env.fancy_image = {
        lang_title: "'.forum_htmlencode($lang_fancy_image['Original']).'",
    };';

    $forum_loader->add_js($fancy_image_js_env, array('type' => 'inline'));
     $forum_loader->add_js($ext_info['url'].'/js/fancy_image.min.js', array('type' => 'url', 'async' => true));
Смайл. Дата. Подпись.

Поделиться

3

Re: Подключение js в 1.4

Спасибо за подробный ответ по этой теме, буду использовать как документацию ) Другим наверняка тоже поможет.

Использую: sql - php - yii - ajax - jq - js - css - bootstrap - less - html - knockout js - ruby on rails.
Интересно: css3, html5 -> appCache, workers, sockets и т.д.
Будущее: адаптивные сайты (они же и локальные приложения).

Поделиться

4 (13.08.2011 15:52 отредактировано dimkalinux)

Re: Подключение js в 1.4

Ответ не подробный, гораздо лучше прочитать исходник forum_loader — и понять как он устроен.
Там очень простой код.

Смайл. Дата. Подпись.

Поделиться

5 (14.08.2011 12:59 отредактировано dimkalinux)

Re: Подключение js в 1.4

Наверное, правильно будет включать JS код, который меньше 1-2 кб в виде inline кода, а не отдельным файлом. Код, крайне желательно минифицировать, например через (Please log in or register to see this URL).

Смайл. Дата. Подпись.

Поделиться

6

Re: Подключение js в 1.4

Не могу разобраться как вставить в HEAD <script>. Хук на hd_head вставляет скрипт в самое начало документа и естественно он не вызывается.

Не забываем ставить плюсики дополнительно к «спасибам».

Поделиться

7 (20.08.2011 14:53 отредактировано dimkalinux)

Re: Подключение js в 1.4

В 1.4 JS вставляется только в футер. А зачем вам в хеад?

Хотя старый способ должен работать.

Смайл. Дата. Подпись.

Поделиться

8

Re: Подключение js в 1.4

Так не имеет значения куда,  ни ft_js_include ни ft_end не помогают. В обоих случаях <script> вставляется  в самый верх документа.

    <hook id="ft_js_include"><![CDATA[
    ?>
    <script>
    </script>
    <?php
    ]]></hook>
Не забываем ставить плюсики дополнительно к «спасибам».

Поделиться

9 (20.08.2011 19:20 отредактировано dimkalinux)

Re: Подключение js в 1.4

JS так подключается

<hook id="ft_js_include"><![CDATA[
    $forum_loader->add_js($ext_info['url'].'/js/scripts.js', array('type' => 'url'));
]]></hook>

Вот пример — (Please log in or register to see this URL)

Смайл. Дата. Подпись.

Поделиться

10 (20.08.2011 21:28 отредактировано PunBB Fun)

Re: Подключение js в 1.4

С этим всё понятно, подключение внешних скриптов не проблема, но если требуется вставить именно <script>? Почему то он вставляется только на определенных хуках, например на "ft_about_end", но попытка вставить в "ft_js_include" не проходит. На данный момент я нашел выход только во вставке содержимого тега, то есть непосредственно саму функцию.

Не забываем ставить плюсики дополнительно к «спасибам».

Поделиться

11 (20.08.2011 21:39 отредактировано dimkalinux)

Re: Подключение js в 1.4

<hook id="ft_js_include"><![CDATA[
    $forum_loader->add_js('alert("loaded");', array('type' => 'inline'));
]]></hook>

По-умолчанию в 1.4 используется ассинхронная загрузка JS через LabJS.
Но есть возможность использовать и обычный метод.

Объясните задачу — зачем <script> — вам просто нужен inline-код или тег <script>?

Если обязательно через тег <script>, то просто укажите группу FORUM_JS_GROUP_COUNTER — в этой группе используется стандартный синхронный способ подключения JS.

<hook id="ft_js_include"><![CDATA[
    $forum_loader->add_js('alert("loaded");', array('type' => 'inline', 'group' => FORUM_JS_GROUP_COUNTER));
]]></hook>
Смайл. Дата. Подпись.

Поделиться

12

Re: Подключение js в 1.4

Понял. Просто я думал что вот такой фокус

    <hook id="ft_js_include"><![CDATA[
    ?>
    <script>
    </script>
    <?php
    ]]></hook>

прокатывает везде, вроде бы в 1.3 так всё и работало.

Не забываем ставить плюсики дополнительно к «спасибам».

Поделиться

13

Re: Подключение js в 1.4

Возникла острая необходимость включить скрипт только на определенной странице, у меня уже много расширений добавляющих эти скрипты и все они выполняются независимо от страницы...можно ли как-то заставить выполнять скрипт только на своей странице. Такой способ подключения не работает:

<?php
if (!defined('FORUM_ROOT'))
    define('FORUM_ROOT', '../');
    
require FORUM_ROOT.'include/common.php';
$forum_page['crumbs'] = array(
        array($forum_config['o_board_title'], forum_link($forum_url['index'])),
        array('Скины',''),
    );
define('FORUM_PAGE', 'skins');
require FORUM_ROOT.'header.php';

// START SUBST - <!-- forum_main -->
ob_start();
?>
    <div id="uploadButton" class="button">
        <font>Загрузить</font>
    </div>
    <ol id="files">
        Загруженные файлы :
    </ol>
    
    <script type="text/javascript">
    $(function() {
        var button = $('#uploadButton'), interval;
        $.ajax_upload(button, {
            action : 'upload.php',
            name : 'myfile',
            onSubmit : function(file, ext) {
                $("#uploadButton font").text('Загрузка');
                this.disable();
            },
            onComplete : function(file, response) {
                $("#uploadButton font").text('Загрузить');
                // снова включаем кнопку
                this.enable();
                // показываем что файл загружен
                $("<li>" + file + "</li>").appendTo("#files");
            }
        });
     });
    </script>
<?php
$text = forum_trim(ob_get_contents());
$tpl_main = str_replace('<!-- forum_main -->', $text, $tpl_main);
ob_end_clean();
// END SUBST - <!-- forum_main -->

require FORUM_ROOT.'footer.php';

Видимо jquery подключается позже чем встроенный скрипт...ошибка "Uncaught ReferenceError: $ is not defined". Но сам jq всетаки выполняется и показан во вкладке scripts...в хидере на странице тоже видно что он есть.

Использую: sql - php - yii - ajax - jq - js - css - bootstrap - less - html - knockout js - ruby on rails.
Интересно: css3, html5 -> appCache, workers, sockets и т.д.
Будущее: адаптивные сайты (они же и локальные приложения).

Поделиться

14

Re: Подключение js в 1.4

Используйте

$forum_loader->add_js('alert("loaded");', array('type' => 'inline'));
Смайл. Дата. Подпись.

Поделиться

15 (03.10.2011 10:24 отредактировано brainiac)

Re: Подключение js в 1.4

Ой...не додумался делать такое без расширения )) думал только из под расширения такое возможно. Вставил перед "require FORUM_ROOT.'footer.php';" Заработало, спасибо. Век живи век учись. Сори за тупость ))

Использую: sql - php - yii - ajax - jq - js - css - bootstrap - less - html - knockout js - ruby on rails.
Интересно: css3, html5 -> appCache, workers, sockets и т.д.
Будущее: адаптивные сайты (они же и локальные приложения).

Поделиться