CINXE.COM
ru:devel:javascript [DokuWiki]
<!DOCTYPE html> <html lang="ru" dir="ltr" class="no-js"> <head> <meta charset="utf-8" /> <title>ru:devel:javascript [DokuWiki]</title> <meta name="generator" content="DokuWiki"/> <meta name="theme-color" content="#008800"/> <meta name="robots" content="index,follow"/> <meta name="keywords" content="ru,devel,javascript"/> <link rel="search" type="application/opensearchdescription+xml" href="/lib/exe/opensearch.php" title="DokuWiki"/> <link rel="start" href="/"/> <link rel="contents" href="/ru:devel:javascript?do=index" title="Все страницы"/> <link rel="manifest" href="/lib/exe/manifest.php"/> <link rel="alternate" type="application/rss+xml" title="Недавние изменения" href="/feed.php"/> <link rel="alternate" type="application/rss+xml" title="Текущее пространство имён" href="/feed.php?mode=list&ns=ru:devel"/> <link rel="edit" title="Править страницу" href="/ru:devel:javascript?do=edit"/> <link rel="alternate" type="text/html" title="Простой HTML" href="/_export/xhtml/ru:devel:javascript"/> <link rel="alternate" type="text/plain" title="вики-разметка" href="/_export/raw/ru:devel:javascript"/> <link rel="canonical" href="https://www.dokuwiki.org/ru:devel:javascript"/> <link rel="stylesheet" href="/lib/exe/css.php?t=dokuwiki&tseed=f1005bad3d81fc9c803c7f93d32a390e"/> <link rel="alternate" hreflang="en" href="https://www.dokuwiki.org/devel:javascript"/> <link rel="alternate" hreflang="ja" href="https://www.dokuwiki.org/ja:devel:javascript"/> <link rel="alternate" hreflang="x-default" href="https://www.dokuwiki.org/devel:javascript"/> <script >var NS='ru:devel';var JSINFO = {"plugins":{"edittable":{"default columnwidth":""}},"id":"ru:devel:javascript","namespace":"ru:devel","ACT":"show","useHeadingNavigation":0,"useHeadingContent":0};(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js" defer="defer"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js" defer="defer"></script> <script src="/lib/exe/js.php?t=dokuwiki&tseed=f1005bad3d81fc9c803c7f93d32a390e&lang=ru" defer="defer"></script> <meta name="viewport" content="width=device-width,initial-scale=1" /> <link rel="shortcut icon" href="/lib/tpl/dokuwiki/images/favicon.ico" /> <link rel="apple-touch-icon" href="/lib/tpl/dokuwiki/images/apple-touch-icon.png" /> <meta name="verify-v1" content="OVxl3gsCv2MhZqh1cBQyl0JytWXSwXMjyvwc+4w3WtA=" /> <meta name="google-site-verification" content="YhTVK69hW94ZXUtc2zSLPxTkZKbZIn0zK67mz5WQB-E" /> <!-- Global site tag (gtag.js) - Google Analytics --> <script async src="https://www.googletagmanager.com/gtag/js?id=UA-83791-1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-83791-1', { 'anonymize_ip': true }); </script> </head> <body> <div id="dokuwiki__site"><div id="dokuwiki__top" class="site dokuwiki mode_show tpl_dokuwiki showSidebar hasSidebar"> <!-- ********** HEADER ********** --> <header id="dokuwiki__header"><div class="pad group"> <div class="headings group"> <ul class="a11y skip"> <li><a href="#dokuwiki__content">Перейти к содержанию</a></li> </ul> <h1 class="logo"><a href="/start" accesskey="h" title="Домой [h]"><img src="/lib/tpl/dokuwiki/images/logo.png" width="64" height="64" alt="" /><span>DokuWiki</span></a></h1> <p class="claim">It's better when it's simple</p> </div> <div class="tools group"> <!-- USER TOOLS --> <div id="dokuwiki__usertools"> <h3 class="a11y">Инструменты пользователя</h3> <ul> <li class="action login"><a href="/ru:devel:javascript?do=login&sectok=" title="Войти" rel="nofollow"><span>Войти</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 17.25V14H3v-4h7V6.75L15.25 12 10 17.25M8 2h9a2 2 0 0 1 2 2v16a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2v-4h2v4h9V4H8v4H6V4a2 2 0 0 1 2-2z"/></svg></a></li> </ul> </div> <!-- SITE TOOLS --> <div id="dokuwiki__sitetools"> <h3 class="a11y">Инструменты сайта</h3> <form action="/start" method="get" role="search" class="search doku_form" id="dw__search" accept-charset="utf-8"><input type="hidden" name="do" value="search" /><input type="hidden" name="id" value="ru:devel:javascript" /><div class="no"><input name="q" type="text" class="edit" title="[F]" accesskey="f" placeholder="Найти" autocomplete="on" id="qsearch__in" value="" /><button value="1" type="submit" title="Найти">Найти</button><div id="qsearch__out" class="ajax_qsearch JSpopup"></div></div></form> <div class="mobileTools"> <form action="/doku.php" method="get" accept-charset="utf-8"><div class="no"><input type="hidden" name="id" value="ru:devel:javascript" /><select name="do" class="edit quickselect" title="Инструменты"><option value="">Инструменты</option><optgroup label="Инструменты страницы"><option value="edit">Править страницу</option><option value="revisions">История страницы</option><option value="backlink">Ссылки сюда</option></optgroup><optgroup label="Инструменты сайта"><option value="recent">Недавние изменения</option><option value="media">Управление медиафайлами</option><option value="index">Все страницы</option></optgroup><optgroup label="Инструменты пользователя"><option value="login">Войти</option></optgroup></select><button type="submit">></button></div></form> </div> <ul> <li class="action recent"><a href="/ru:devel:javascript?do=recent" title="Недавние изменения [r]" rel="nofollow" accesskey="r">Недавние изменения</a></li><li class="action media"><a href="/ru:devel:javascript?do=media&ns=ru%3Adevel" title="Управление медиафайлами" rel="nofollow">Управление медиафайлами</a></li><li class="action index"><a href="/ru:devel:javascript?do=index" title="Все страницы [x]" rel="nofollow" accesskey="x">Все страницы</a></li> </ul> </div> </div> <!-- BREADCRUMBS --> <div class="breadcrumbs"> <div class="trace"><span class="bchead">Вы посетили:</span> <span class="bcsep">•</span> <span class="curid"><bdi><a href="/ru:devel:javascript" class="breadcrumbs" title="ru:devel:javascript">javascript</a></bdi></span></div> </div> <hr class="a11y" /> </div></header><!-- /header --> <div class="wrapper group"> <!-- ********** ASIDE ********** --> <nav id="dokuwiki__aside" aria-label="Боковая панель"><div class="pad aside include group"> <h3 class="toggle">Боковая панель</h3> <div class="content"><div class="group"> <div class="notify">Этот перевод старее, чем <a href="/devel:javascript" class="wikilink1">оригинальная страница</a>, и может быть неактуальным. Смотрите, что <a href="/devel:javascript?do=diff&rev=1676850852" class="wikilink1">было изменено</a>.</div><div class="plugin_translation is-dropdown"><span class="title">Перевод этой страницы<sup><a href="/localization" class="wikilink1" title="localization" data-wiki-id="localization">?</a></sup>: </span><ul><li class="a"><a class="wikilink1" title="English" href="/devel:javascript">English (en)</a></li><li class="a"><a class="wikilink2" title="|العربية" href="/ar:devel:javascript">|العربية (ar)</a></li><li class="a"><a class="wikilink2" title="Català" href="/ca:devel:javascript">Català (ca)</a></li><li class="a"><a class="wikilink2" title="Česky" href="/cs:devel:javascript">Česky (cs)</a></li><li class="a"><a class="wikilink2" title="Dansk" href="/da:devel:javascript">Dansk (da)</a></li><li class="a"><a class="wikilink2" title="Deutsch" href="/de:devel:javascript">Deutsch (de)</a></li><li class="a"><a class="wikilink2" title="Ελληνικά" href="/el:devel:javascript">Ελληνικά (el)</a></li><li class="a"><a class="wikilink2" title="Esperanto" href="/eo:devel:javascript">Esperanto (eo)</a></li><li class="a"><a class="wikilink2" title="Español" href="/es:devel:javascript">Español (es)</a></li><li class="a"><a class="wikilink2" title="فارسی" href="/fa:devel:javascript">فارسی (fa)</a></li><li class="a"><a class="wikilink2" title="Français" href="/fr:devel:javascript">Français (fr)</a></li><li class="a"><a class="wikilink2" title="עברית" href="/he:devel:javascript">עברית (he)</a></li><li class="a"><a class="wikilink2" title="Magyar" href="/hu:devel:javascript">Magyar (hu)</a></li><li class="a"><a class="wikilink2" title="Italiano" href="/it:devel:javascript">Italiano (it)</a></li><li class="a"><a class="wikilink1" title="日本語" href="/ja:devel:javascript">日本語 (ja)</a></li><li class="a"><a class="wikilink2" title="한국어" href="/ko:devel:javascript">한국어 (ko)</a></li><li class="a"><a class="wikilink2" title="Lietuvių Kalba" href="/lt:devel:javascript">Lietuvių Kalba (lt)</a></li><li class="a"><a class="wikilink2" title="Nederlands" href="/nl:devel:javascript">Nederlands (nl)</a></li><li class="a"><a class="wikilink2" title="Norsk" href="/no:devel:javascript">Norsk (no)</a></li><li class="a"><a class="wikilink2" title="Polski" href="/pl:devel:javascript">Polski (pl)</a></li><li class="a"><a class="wikilink2" title="Português" href="/pt-br:devel:javascript">Português (pt-br)</a></li><li class="a"><a class="wikilink2" title="Română" href="/ro:devel:javascript">Română (ro)</a></li><li class="span"><span class="wikilink1" title="Русский">Русский (ru)</span></li><li class="a"><a class="wikilink2" title="Српски Језик" href="/sr:devel:javascript">Српски Језик (sr)</a></li><li class="a"><a class="wikilink2" title="Svenska" href="/sv:devel:javascript">Svenska (sv)</a></li><li class="a"><a class="wikilink2" title="ไทย" href="/th:devel:javascript">ไทย (th)</a></li><li class="a"><a class="wikilink2" title="Українська" href="/uk:devel:javascript">Українська (uk)</a></li><li class="a"><a class="wikilink2" title="中文" href="/zh:devel:javascript">中文 (zh)</a></li><li class="a"><a class="wikilink2" title="繁體中文" href="/zh-tw:devel:javascript">繁體中文 (zh-tw)</a></li></ul></div> <p> <strong>О «Докувики»</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/ru:features" class="wikilink1" title="ru:features" data-wiki-id="ru:features">Возможности</a> и <a href="/blogroll" class="wikilink1" title="blogroll" data-wiki-id="blogroll">обзоры</a></div> </li> <li class="level1"><div class="li"> <a href="/ru:install" class="wikilink1" title="ru:install" data-wiki-id="ru:install">Руководство по установке</a></div> </li> <li class="level1"><div class="li"> <a href="/ru:manual" class="wikilink1" title="ru:manual" data-wiki-id="ru:manual">Руководство пользователя</a> и <a href="/ru:wiki:syntax" class="wikilink1" title="ru:wiki:syntax" data-wiki-id="ru:wiki:syntax">синтаксис</a></div> </li> <li class="level1"><div class="li"> <a href="/ru:changes" class="wikilink1" title="ru:changes" data-wiki-id="ru:changes">Журнал изменений</a></div> </li> <li class="level1"><div class="li"> <a href="/ru:faq" class="wikilink1" title="ru:faq" data-wiki-id="ru:faq">ЧаВО</a></div> </li> </ul> <p> <strong>Дополнительные возможности</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/ru:extensions" class="wikilink1" title="ru:extensions" data-wiki-id="ru:extensions">Шаблоны и плагины</a></div> </li> <li class="level1"><div class="li"> <a href="/ru:development" class="wikilink1" title="ru:development" data-wiki-id="ru:development">Ресурсы для разработчиков</a></div> </li> </ul> <p> <strong>Для бизнеса</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/ru:faq:support" class="wikilink1" title="ru:faq:support" data-wiki-id="ru:faq:support">Сторонняя поддержка</a></div> </li> <li class="level1"><div class="li"> <a href="/ru:donate" class="wikilink1" title="ru:donate" data-wiki-id="ru:donate">Пожертвования</a></div> </li> </ul> <p> <strong>Наше сообщество</strong> </p> <ul> <li class="level1"><div class="li"> <a href="/teams:getting_involved" class="wikilink1" title="teams:getting_involved" data-wiki-id="teams:getting_involved">Принять участие</a></div> </li> <li class="level1"><div class="li"> <a href="https://forum.dokuwiki.org/" class="urlextern" title="https://forum.dokuwiki.org/">Форум</a></div> </li> <li class="level1"><div class="li"> <a href="/mailinglist" class="wikilink1" title="mailinglist" data-wiki-id="mailinglist">Список рассылки для разработчиков</a></div> </li> </ul> <hr /> <p> Следуйте за нами на <a href="https://phpc.social/@dokuwiki" class="urlextern" title="https://phpc.social/@dokuwiki">Мастодоне</a> и других <a href="/ru:social" class="wikilink1" title="ru:social" data-wiki-id="ru:social">социальных сетях</a>. </p> <p> <a href="/privacy" class="wikilink1" title="privacy" data-wiki-id="privacy">Конфиденциальность</a> <em>(англ.)</em> </p> </div></div> </div></nav><!-- /aside --> <!-- ********** CONTENT ********** --> <main id="dokuwiki__content"><div class="pad group"> <div class="pageId"><span>ru:devel:javascript</span></div> <div class="page group"> <!-- wikipage start --> <!-- TOC START --> <div id="dw__toc" class="dw__toc"> <h3 class="toggle">Содержание</h3> <div> <ul class="toc"> <li class="level1"><div class="li"><a href="#javascript">JavaScript</a></div> <ul class="toc"> <li class="level2"><div class="li"><a href="#загрузка_javascript">Загрузка JavaScript</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#синтаксис_подключения_использования_include">Синтаксис подключения, использования (include)</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#рекомендации_по_написанию_кода_программированию">Рекомендации по написанию кода (программированию)</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#проверка_вашего_программного_кода">Проверка вашего программного кода</a></div></li> <li class="level3"><div class="li"><a href="#use_unobtrusive_javascript">Use unobtrusive JavaScript</a></div></li> <li class="level3"><div class="li"><a href="#avoid_inappropriate_mixing">Avoid Inappropriate Mixing</a></div></li> <li class="level3"><div class="li"><a href="#using_ids">Using IDs</a></div></li> <li class="level3"><div class="li"><a href="#inline_scripts">Inline scripts</a></div></li> </ul> </li> <li class="level2"><div class="li"><a href="#dokuwiki_javascript_library">DokuWiki JavaScript Library</a></div> <ul class="toc"> <li class="level3"><div class="li"><a href="#event_handling">Event Handling</a></div></li> <li class="level3"><div class="li"><a href="#predefined_global_variable">Predefined Global Variable</a></div></li> <li class="level3"><div class="li"><a href="#sack_ajax_library">SACK (AJAX) Library</a></div></li> <li class="level3"><div class="li"><a href="#section">$()</a></div></li> <li class="level3"><div class="li"><a href="#additional_functions">Additional functions</a></div></li> <li class="level3"><div class="li"><a href="#jsinfo">JSINFO</a></div></li> </ul></li> </ul></li> </ul> </div> </div> <!-- TOC END --> <h1 class="sectionedit1" id="javascript">JavaScript</h1> <div class="level1"> <p> Для удобства «<a href="/ru:dokuwiki" class="wikilink1" title="ru:dokuwiki" data-wiki-id="ru:dokuwiki">ДокуВики</a>» позволяет использовать программистам <a href="https://en.wikipedia.org/wiki/ru:JavaScript" class="interwiki iw_wp" title="https://en.wikipedia.org/wiki/ru:JavaScript">JavaScript</a>. Также как и <a href="/ru:css" class="wikilink1" title="ru:css" data-wiki-id="ru:css">страницы стилей CSS</a>, все файлы JavaScript загружаются через программу-диспетчер с целью уменьшения количества HTTP-запросов, для кэширования, а также удаления пробелов и комментариев (настройка <a href="/ru:config:compress" class="wikilink1" title="ru:config:compress" data-wiki-id="ru:config:compress">compress</a>). </p> <p> Эта статья даст общее представление о том, как скрипты JavaScript загружаются из ядра «ДокуВики», <a href="/ru:plugins" class="wikilink1" title="ru:plugins" data-wiki-id="ru:plugins">плагинов</a> и <a href="/ru:template" class="wikilink1" title="ru:template" data-wiki-id="ru:template">шаблонов</a>. Также здесь содержится информация об обработке событий и стиля программирования, когда ява скрипты используются в ДокуВики. </p> </div> <div class="secedit editbutton_section editbutton_1"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[JavaScript] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="javascript" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1-1071" /><button type="submit" title="JavaScript">Править</button></div></form></div> <h2 class="sectionedit2" id="загрузка_javascript">Загрузка JavaScript</h2> <div class="level2"> <p> Все яваскрипты собираются и загружаются через <a href="https://codesearch.dokuwiki.org/search?project=dokuwiki&defs=&path=lib%20exe%20js.php" class="interwiki plugin_xref" title="view definition for lib/exe/js.php">lib/exe/js.php</a>, который объединяет все найденные файлы яваскрипта, убирает пробелы и комментарии (если включена опция <a href="/ru:config:compress" class="wikilink1" title="ru:config:compress" data-wiki-id="ru:config:compress">compress</a>) и помещает результат в кэш. Также он (<code>js.php</code>) даёт команду браузеру помещать в кэш результат, так что, когда вы разрабатываете новый яваскрит, не забывайте сбрасывать кэш браузера (например Shift+F5, Shift+CTL+R и тому подобное) всякий раз, когда ваш скрипт изменён. Если ваш сайт сидит в облаке, в отдельных случаях может потребоваться touch его настроек. </p> <p> «ДокуВики» получает JavaScript из: </p> <ul> <li class="level1"><div class="li"> автоматически сгенерированные яваскрипты (языковые строки, настройки конфигурации, <a href="/ru:toolbar" class="wikilink1" title="ru:toolbar" data-wiki-id="ru:toolbar">панель инструментов</a>);</div> </li> <li class="level1"><div class="li"> lib/scripts/*.js <sup><a href="#fn__1" id="fnt__1" class="fn_top">1)</a></sup>;</div> </li> <li class="level1"><div class="li"> lib/plugins/*/script.js;</div> </li> <li class="level1"><div class="li"> lib/tpl/<currenttemplate>/script.js;</div> </li> <li class="level1"><div class="li"> conf/userscript.js.</div> </li> </ul> <p> Из вышеизложенного следует, что использование яваскриптов возможно в <a href="/ru:template" class="wikilink1" title="ru:template" data-wiki-id="ru:template">шаблонах</a> и <a href="/ru:plugins" class="wikilink1" title="ru:plugins" data-wiki-id="ru:plugins">плагинах</a> (с помощью файла <code>script.js</code>), а также возможно определить свои собственные скрипты в <code>conf/userscript.js</code>. </p> <p> Также яваскрипт может быть добавлен в <code>main.php</code>, расположенном в <code>lib/tpl/<currenttemplate></code>. Хорошо знакомый <abbr title="HyperText Markup Language">HTML</abbr>-код <head> </head> принимает JavaScript. </p> </div> <h5 id="об_атрибутах_внешних_скриптов">Об атрибутах внешних скриптов</h5> <div class="level5"> <p> Однако до загрузки файла скрипта, особенно если он крупный, рендеринг сайта будет останавливаться, это стандартное поведение браузеров служит очень частой причиной для недовольства «Dokuwiki». Кроме того, скрипт исполняется немедленно после загрузки, не дожидаясь окончания сборки самой страницы. До появления атрибутов <a href="http://htmlbook.ru/html/script/defer" class="urlextern" title="http://htmlbook.ru/html/script/defer">defer</a> в <abbr title="HyperText Markup Language">HTML</abbr> 4.01 (откладывающего запуск скрипта до окончания загрузки его цели) и <a href="http://htmlbook.ru/html/script/async" class="urlextern" title="http://htmlbook.ru/html/script/async">async</a> в <abbr title="HyperText Markup Language">HTML</abbr> 5 (процесса, полностью независимого от рендеринга) для тега <script> работающие со страницей скрипты рекомендовалось размещать в конце неё. Async рекомендуется для библиотечных скриптов, а defer - для обрабатывающих страницу, и размещать теги с такими атрибутами можно на привычном месте внутри тега head. Но если defer-скрипт опирается на async-библиотеку и та так увесиста, что не всегда успевает грузиться даже до его старта, то defer-скрипт всё же придётся поставить в конец шаблона. </p> </div> <div class="secedit editbutton_section editbutton_2"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Загрузка JavaScript] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="загрузка_javascript" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="1072-5104" /><button type="submit" title="Загрузка JavaScript">Править</button></div></form></div> <h3 class="sectionedit3" id="синтаксис_подключения_использования_include">Синтаксис подключения, использования (include)</h3> <div class="level3"> <p> Диспетчер яваскриптов «ДокуВики» позволяет использовать специальные (особые) комментарии, чтобы подгружать отличные от вышеописанных файлы скриптов. Это важно для случаев, когда в основном только один файл яваскрипт подвергается анализу (разбору) диспетчером, например в плагинах и шаблонах. </p> <p> <img src="/lib/images/smileys/exclaim.svg" class="icon smiley" alt=":!:" /> Подключаемые файлы не проверяются механизмом кэширования на предмет обновления. Необходимо изменить основной файл, чтобы запустить механизм кэширования. </p> <p> Либо использовать самообновляющий детектор <code><script charset=«UTF-8» src=«/lib/tpl/шаблон/editor.js?ver=' . date ( «y-m-d_H:i:s», filemtime ( '/var/www/сайт/lib/tpl/шаблон/editor.js' ) ) . '» defer></script></code> </p> <p> <img src="/lib/images/smileys/exclaim.svg" class="icon smiley" alt=":!:" /> Подключения (includes) <strong>не</strong> поддерживаются внутри подключаемых файлов с целью предотвращения кольцевых ссылок (рекурсии). </p> <p> <img src="/lib/images/smileys/exclaim.svg" class="icon smiley" alt=":!:" /> Путь для подключения (includepath) должен содержать только буквы, цифры, знак подчёркивания, знак дроби и точку. </p> </div> <h4 id="include">include</h4> <div class="level4"> <pre class="code">/* DOKUWIKI:include somefile.js */</pre> <p> Этот код включит указанный файл в то место, где был расположен комментарий. Путь к файлу по умолчанию относительный, но будет абсолютный, если поставить в начале знак дроби (<code>/</code>). </p> </div> <h4 id="include_once">include_once</h4> <div class="level4"> <pre class="code">/* DOKUWIKI:include_once common_library.js */</pre> <p> Этот код включит указанный файл в то место, где был расположен комментарий. Путь к файлу по умолчанию относительный, но будет абсолютный, если поставить в начале знак дроби (<code>/</code>). </p> <p> Указанный файл будет подключен (использован), только если файл с аналогичным имененм не подгружался ранее с помощью оператора <code>include_once</code>. Данное имя файла будет доступно через любые другие скриптовые файлы (из всех плагинов), поэтому стоит давать понятное наименование такому файлу. </p> <p> Использование этого оператора имеет смысл, если разрабатываются несколько независимых <a href="/ru:plugins" class="wikilink1" title="ru:plugins" data-wiki-id="ru:plugins">плагинов</a>, каждый из которых использует одну и ту же библиотеку яваскрипт. Использование оператора <code>include_once</code> несколько раз с одинаковым именем подключаемого файла даст гарантию того, что библиотека будет подгружена только один раз, даже если будет установлено несколько плагинов одновременно. </p> </div> <div class="secedit editbutton_section editbutton_3"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Синтаксис подключения, использования (include)] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="синтаксис_подключения_использования_include" /><input type="hidden" name="codeblockOffset" value="0" /><input type="hidden" name="range" value="5105-8752" /><button type="submit" title="Синтаксис подключения, использования (include)">Править</button></div></form></div> <h2 class="sectionedit4" id="рекомендации_по_написанию_кода_программированию">Рекомендации по написанию кода (программированию)</h2> <div class="level2"> <p> Когда JavaScript используется в «ДокуВики», необходимо соблюдать несколько правил, поскольку ошибка в скрипте может привести не только к его прерыванию (остановке), но и к сбою всех скриптов в «ДокуВики». </p> </div> <div class="secedit editbutton_section editbutton_4"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Рекомендации по написанию кода (программированию)] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="рекомендации_по_написанию_кода_программированию" /><input type="hidden" name="codeblockOffset" value="2" /><input type="hidden" name="range" value="8753-9224" /><button type="submit" title="Рекомендации по написанию кода (программированию)">Править</button></div></form></div> <h3 class="sectionedit5" id="проверка_вашего_программного_кода">Проверка вашего программного кода</h3> <div class="level3"> <p> As mentioned above, DokuWiki will shrink the JavaScript code when the <a href="/config:compress" class="wikilink1" title="config:compress" data-wiki-id="config:compress">compress</a> option is enabled (which it is by default). To do this without introducing syntax errors, the JavaScript has to be checked more strictly than it might be when run uncompressed. </p> <p> To check your code you should use the <a href="http://www.jslint.com/" class="urlextern" title="http://www.jslint.com/">JSLint</a> online service. </p> <ul> <li class="level1"><div class="li"> debug your code with <a href="/config:compress" class="wikilink1" title="config:compress" data-wiki-id="config:compress">compress</a> disabled but</div> </li> <li class="level1"><div class="li"> verify your code still works with <a href="/config:compress" class="wikilink1" title="config:compress" data-wiki-id="config:compress">compress</a> enabled</div> </li> </ul> </div> <div class="secedit editbutton_section editbutton_5"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Проверка вашего программного кода] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="проверка_вашего_программного_кода" /><input type="hidden" name="codeblockOffset" value="2" /><input type="hidden" name="range" value="9225-9781" /><button type="submit" title="Проверка вашего программного кода">Править</button></div></form></div> <h3 class="sectionedit6" id="use_unobtrusive_javascript">Use unobtrusive JavaScript</h3> <div class="level3"> <p> Do not assume people have JavaScript enabled, when writing new DokuWiki functionality. Instead use JavaScript as enhancement of the user interface only, when JavaScript is not available you code should fallback to normal page reload based behavior. </p> <p> To help you with this DokuWiki has a few predefined functions to help you with <a href="#event_handling" title="ru:devel:javascript ↵" class="wikilink1">Event Handling</a>. </p> </div> <div class="secedit editbutton_section editbutton_6"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Use unobtrusive JavaScript] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="use_unobtrusive_javascript" /><input type="hidden" name="codeblockOffset" value="2" /><input type="hidden" name="range" value="9782-10171" /><button type="submit" title="Use unobtrusive JavaScript">Править</button></div></form></div> <h3 class="sectionedit7" id="avoid_inappropriate_mixing">Avoid Inappropriate Mixing</h3> <div class="level3"> <p> The old way of doing things is to embed JavaScript directly in the <abbr title="HyperText Markup Language">HTML</abbr>. However, JavaScript and (X)<abbr title="HyperText Markup Language">HTML</abbr> shouldn't be mixed, and indeed with DokuWiki there are many cases where they <em>cannot</em> be mixed. Here are some examples of <strong>INAPPROPRIATE MIXING</strong><sup><a href="#fn__2" id="fnt__2" class="fn_top">2)</a></sup>: </p> <pre class="code html4strict"><span class="sc2"><<a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a> <span class="kw3">onload</span><span class="sy0">=</span><span class="st0">"refreshPage()"</span>></span> <span class="sc2"><<a href="http://december.com/html/4/element/p.html"><span class="kw2">p</span></a>></span>some HTML<span class="sc2"><<span class="sy0">/</span><a href="http://december.com/html/4/element/p.html"><span class="kw2">p</span></a>></span> <span class="sc2"><<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">language</span><span class="sy0">=</span><span class="st0">"JavaScript"</span>></span> doSomethingHere(); <span class="sc2"><<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>></span> <span class="sc2"><<a href="http://december.com/html/4/element/p.html"><span class="kw2">p</span></a>></span>more <span class="sc2"><<a href="http://december.com/html/4/element/a.html"><span class="kw2">a</span></a> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">"http://example.com"</span> <span class="kw3">onclick</span><span class="sy0">=</span><span class="st0">"doSomethingElse()"</span>></span>HTML<span class="sc2"><<span class="sy0">/</span><a href="http://december.com/html/4/element/a.html"><span class="kw2">a</span></a>><<span class="sy0">/</span><a href="http://december.com/html/4/element/p.html"><span class="kw2">p</span></a>></span> <span class="sc2"><<span class="sy0">/</span><a href="http://december.com/html/4/element/body.html"><span class="kw2">body</span></a>></span></pre> <p> This isn't just a matter of philosophical purity: some of the JavaScript may not work. In the above example, it turns out that both DokuWiki and the <code><body></code> tag are trying to assign the page's <code>onload</code> handler to different JavaScript functions. Browsers cannot handle this conflict and the results are unpredictable. </p> <p> Strictly speaking, it is possible to embed JavaScript in your <abbr title="HyperText Markup Language">HTML</abbr>, but only if you know that the JavaScript has no conflict with DokuWiki. Because this requires knowledge of DokuWiki's implementation, and because DokuWiki's implementation can change, this is still not a good idea. It's wiser to be philosophically pure. </p> </div> <div class="secedit editbutton_section editbutton_7"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Avoid Inappropriate Mixing] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="avoid_inappropriate_mixing" /><input type="hidden" name="codeblockOffset" value="2" /><input type="hidden" name="range" value="10172-11498" /><button type="submit" title="Avoid Inappropriate Mixing">Править</button></div></form></div> <h3 class="sectionedit8" id="using_ids">Using IDs</h3> <div class="level3"> <p> To modify a DOM object the JavaScript must be able to locate the object. The easiest way to locate the object is to give the associated <abbr title="HyperText Markup Language">HTML</abbr> tag an ID. This ID must be unique among all IDs on the page so that referencing this ID produces exactly the right DOM object. </p> <p> When you are producing your own <abbr title="HyperText Markup Language">HTML</abbr> (e.g. from a template or plugin) that should be accessed from JavaScript later, be sure that the ID does not conflict with an existing ID. In particular, be sure that it won't conflict with the IDs automatically assigned to section headers. The easiest way to ensure this is to use two adjacent underscores (<code>__</code>) in your ID. Because section IDs are always valid <a href="/pagename" class="wikilink1" title="pagename" data-wiki-id="pagename">pagenames</a>, they will never contain adjacent underscores. </p> </div> <div class="secedit editbutton_section editbutton_8"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Using IDs] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="using_ids" /><input type="hidden" name="codeblockOffset" value="3" /><input type="hidden" name="range" value="11499-12258" /><button type="submit" title="Using IDs">Править</button></div></form></div> <h3 class="sectionedit9" id="inline_scripts">Inline scripts</h3> <div class="level3"> <p> As said before you should avoid mixing JavaScript and XHTML. However if you need to use inline JavaScript, you should wrap it like this: </p> <pre class="code"><script type="text/javascript"><!--//--><![CDATA[//><!-- ... //--><!]]></script></pre> <p> This ensures your script code is served in the most compatible way. Some more info is available at the <a href="http://www.w3.org/TR/xhtml1/#h-4.8" class="urlextern" title="http://www.w3.org/TR/xhtml1/#h-4.8"> XHTML 1.0: Script and Style elements</a> specification and <a href="http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-E067D597" class="urlextern" title="http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-E067D597">CDATA section interface</a> definition. </p> <p> If you need to add inline JavaScript to the <head> section you should write an <a href="/ru:devel:action_plugins" class="wikilink1" title="ru:devel:action_plugins" data-wiki-id="ru:devel:action_plugins">action_plugin</a> and handle the <a href="/ru:devel:events_list#tpl_metaheader_output" class="wikilink2" title="ru:devel:events_list" rel="nofollow" data-wiki-id="ru:devel:events_list">TPL_METAHEADER_OUTPUT</a> event. </p> </div> <div class="secedit editbutton_section editbutton_9"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Inline scripts] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="inline_scripts" /><input type="hidden" name="codeblockOffset" value="3" /><input type="hidden" name="range" value="12259-12985" /><button type="submit" title="Inline scripts">Править</button></div></form></div> <h2 class="sectionedit10" id="dokuwiki_javascript_library">DokuWiki JavaScript Library</h2> <div class="level2"> <p> DokuWiki does not use any of the bigger JavaScript libraries like Prototype, Dojo or JQuery. Instead it comes with a small set of handy classes and functions that may help you with writing JavaScript code for DokuWiki. </p> </div> <div class="secedit editbutton_section editbutton_10"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[DokuWiki JavaScript Library] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="dokuwiki_javascript_library" /><input type="hidden" name="codeblockOffset" value="4" /><input type="hidden" name="range" value="12986-13246" /><button type="submit" title="DokuWiki JavaScript Library">Править</button></div></form></div> <h3 class="sectionedit11" id="event_handling">Event Handling</h3> <div class="level3"> <p> As said in <a href="#avoid_inappropriate_mixing" title="ru:devel:javascript ↵" class="wikilink1">Avoid Inappropriate Mixing</a>, event handlers should not be mixed into <abbr title="HyperText Markup Language">HTML</abbr> code. Instead those handlers should be assigned when the <a href="https://en.wikipedia.org/wiki/Document Object Model" class="interwiki iw_wp" title="https://en.wikipedia.org/wiki/Document Object Model">Document Object Model</a> (DOM) was loaded. The DOM is a tree-based object representation of the <abbr title="HyperText Markup Language">HTML</abbr> that is available to the JavaScript. Your JavaScript need merely figure out which objects to attach functions to and then to attach functions to them. </p> <p> To attach functions to any given DOM Object in a cross-browser compatible way, the <strong><code>addEvent()</code></strong> function is provided. It takes the DOM object, an event name (like 'click') and a callback function (the handler) as arguments. This function also takes care of multiple plugins trying to register an event on the same DOM object. </p> <p> Additionally, <code>addEvent()</code> changes the properties and methods of the event in Internet Explorer - so you can use the <code>target</code> property and can call the <code>preventDefault()</code> and <code>stopPropagation()</code> methods. </p> <p> Unfortunately, the JavaScript in your <code>script.js</code> loads before the <abbr title="HyperText Markup Language">HTML</abbr> has finished loading and before the DOM tree has been made. The objects that the JavaScript needs don't yet exist. However, you may still run JavaScript when <code>script.js</code> loads, as long as that JavaScript doesn't require DOM. </p> <p> To solve this problem DokuWiki provides the <strong><code>addInitEvent()</code></strong> function. This function will register a given callback to be run as soon as the DOM is ready. </p> <p> Here's an example (from the <a href="/tips:summary_enforcement" class="wikilink1" title="tips:summary_enforcement" data-wiki-id="tips:summary_enforcement">summary_enforcement</a> tip) using both methods: </p> <pre class="code javascript"><span class="kw1">function</span> enforceSummary<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="coMULTI">/*...*/</span> <span class="br0">}</span> <span class="kw1">function</span> installSummaryEnforcement<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">var</span> summary_input <span class="sy0">=</span> document.<span class="me1">getElementById</span><span class="br0">(</span><span class="st0">'edit__summary'</span><span class="br0">)</span><span class="sy0">;</span> <span class="kw1">if</span><span class="br0">(</span>summary_input <span class="sy0">!==</span> <span class="kw2">null</span><span class="br0">)</span> <span class="br0">{</span> <span class="coMULTI">/*...*/</span> addEvent<span class="br0">(</span>summary_input<span class="sy0">,</span> <span class="st0">'change'</span><span class="sy0">,</span> enforceSummary<span class="br0">)</span><span class="sy0">;</span> addEvent<span class="br0">(</span>summary_input<span class="sy0">,</span> <span class="st0">'keyup'</span><span class="sy0">,</span> enforceSummary<span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="br0">}</span> addInitEvent<span class="br0">(</span>installSummaryEnforcement<span class="br0">)</span><span class="sy0">;</span></pre> <p> In this example, we need to attach <code>enforceSummary()</code> to the <code>onchange</code> and <code>onkeyup</code> handlers for the summary input field. <code>installSummaryEnforcement()</code> does this. </p> <p> The call to <code>addInitEvent()</code> will run the <code>installSummaryEnforcement()</code> function as soon as the DOM is loaded. </p> <p> Notice how <code>installSummaryEnforcement()</code> itself works. First it acquires a DOM object by ID (though there are other ways to acquire it). In this case the object may not exist since the summary field is only shown when editing a page, so the function first tests to see if it got the object. If it did, it calls <code>addEvent()</code> to attach <code>enforceSummary()</code> to the event handlers. </p> <p> The DokuWiki event functions were originally provided by Dean Edwards <a href="http://dean.edwards.name/weblog/2005/10/add-event/" class="urlextern" title="http://dean.edwards.name/weblog/2005/10/add-event/">here</a> and <a href="http://dean.edwards.name/weblog/2005/10/add-event2/" class="urlextern" title="http://dean.edwards.name/weblog/2005/10/add-event2/">here</a>. </p> <ul> <li class="level1"><div class="li"> For deeper insight on the event system see the <a href="http://dev.splitbrain.org/reference/dokuwiki/nav.html?lib/scripts/events.js.source.html" class="urlextern" title="http://dev.splitbrain.org/reference/dokuwiki/nav.html?lib/scripts/events.js.source.html">source</a> <img src="/lib/images/smileys/fixme.svg" class="icon smiley" alt="FIXME" /></div> </li> </ul> </div> <div class="secedit editbutton_section editbutton_11"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Event Handling] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="event_handling" /><input type="hidden" name="codeblockOffset" value="4" /><input type="hidden" name="range" value="13247-16197" /><button type="submit" title="Event Handling">Править</button></div></form></div> <h3 class="sectionedit12" id="predefined_global_variable">Predefined Global Variable</h3> <div class="level3"> <p> DokuWiki defines certain JavaScript variables for the use in your script: </p> <ul> <li class="level1"><div class="li"> <code>DOKU_BASE</code> – the full webserver path to the DokuWiki installation</div> </li> <li class="level1"><div class="li"> <code>DOKU_TPL</code> – the full webserver path to the used <a href="/template" class="wikilink1" title="template" data-wiki-id="template">Template</a></div> </li> <li class="level1"><div class="li"> <code>LANG</code> – an array of languagestrings</div> </li> </ul> </div> <div class="secedit editbutton_section editbutton_12"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Predefined Global Variable] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="predefined_global_variable" /><input type="hidden" name="codeblockOffset" value="5" /><input type="hidden" name="range" value="16198-16498" /><button type="submit" title="Predefined Global Variable">Править</button></div></form></div> <h3 class="sectionedit13" id="sack_ajax_library">SACK (AJAX) Library</h3> <div class="level3"> <p> DokuWiki provides a simple AJAX library named <code>SACK</code> by Gregory Wild-Smith. </p> <ul> <li class="level1"><div class="li"> See the <a href="https://github.com/dokuwiki/dokuwiki/blob/master/lib/scripts/tw-sack.js" class="urlextern" title="https://github.com/dokuwiki/dokuwiki/blob/master/lib/scripts/tw-sack.js">Source tw-sack.js</a> for details on how to use it.</div> </li> </ul> </div> <div class="secedit editbutton_section editbutton_13"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[SACK (AJAX) Library] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="sack_ajax_library" /><input type="hidden" name="codeblockOffset" value="5" /><input type="hidden" name="range" value="16499-16745" /><button type="submit" title="SACK (AJAX) Library">Править</button></div></form></div> <h3 class="sectionedit14" id="section">$()</h3> <div class="level3"> <p> The $() function is a handy shortcut to the all-too-frequent <code>document.getElementById()</code> function of the DOM. Like the DOM function, this one returns the element that has the id passed as an argument. Unlike the DOM function, though, this one goes further. You can pass more than one id and $() will return an Array object with all the requested elements. </p> <ul> <li class="level1"><div class="li"> Taken from the <a href="http://prototype.conio.net/" class="urlextern" title="http://prototype.conio.net/">prototype library</a></div> </li> <li class="level1"><div class="li"> See <a href="http://www.sergiopereira.com/articles/prototype.js.html" class="urlextern" title="http://www.sergiopereira.com/articles/prototype.js.html">Docs by Sergio Pereira</a></div> </li> </ul> </div> <div class="secedit editbutton_section editbutton_14"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[$()] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="section" /><input type="hidden" name="codeblockOffset" value="5" /><input type="hidden" name="range" value="16746-17281" /><button type="submit" title="$()">Править</button></div></form></div> <h3 class="sectionedit15" id="additional_functions">Additional functions</h3> <div class="level3"> <p> DokuWiki provides various other tool methods. Especially the following might be useful for your development: isset, getElementsByClass, findPosX, findPosY, jsEscape, prependChild. </p> <ul> <li class="level1 node"><div class="li"> For details check the source of these files:</div> <ul> <li class="level2"><div class="li"> <a href="https://github.com/dokuwiki/dokuwiki/blob/master/lib/scripts/script.js" class="urlextern" title="https://github.com/dokuwiki/dokuwiki/blob/master/lib/scripts/script.js">script.js</a></div> </li> <li class="level2"><div class="li"> <a href="https://github.com/dokuwiki/dokuwiki/blob/master/lib/scripts/helpers.js" class="urlextern" title="https://github.com/dokuwiki/dokuwiki/blob/master/lib/scripts/helpers.js">helpers.js</a></div> </li> </ul> </li> </ul> </div> <div class="secedit editbutton_section editbutton_15"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[Additional functions] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="additional_functions" /><input type="hidden" name="codeblockOffset" value="5" /><input type="hidden" name="range" value="17282-17728" /><button type="submit" title="Additional functions">Править</button></div></form></div> <h3 class="sectionedit16" id="jsinfo">JSINFO</h3> <div class="level3"> <p> Since <a href="https://github.com/dokuwiki/dokuwiki/commit/85b9dd81bb1eac380c07b7491f48e23fb74a0923" class="urlextern" title="https://github.com/dokuwiki/dokuwiki/commit/85b9dd81bb1eac380c07b7491f48e23fb74a0923">november 23, 2009</a> DokuWiki passes the global <a href="/devel:environment#jsinfo" class="wikilink1" title="devel:environment" data-wiki-id="devel:environment">$JSINFO</a> to javascript. (see the mailinglist <a href="http://www.freelists.org/post/dokuwiki/INFO,44" class="urlextern" title="http://www.freelists.org/post/dokuwiki/INFO,44">mailinglist</a>) </p> <p> The usual way in a plugin is this: </p> <pre class="code php"><span class="kw2">function</span> register<span class="br0">(</span>Doku_Event_Handler <span class="re0">$controller</span><span class="br0">)</span> <span class="br0">{</span> <span class="re0">$controller</span><span class="sy0">-></span><span class="me1">register_hook</span><span class="br0">(</span><span class="st_h">'DOKUWIKI_STARTED'</span><span class="sy0">,</span> <span class="st_h">'AFTER'</span><span class="sy0">,</span> <span class="re0">$this</span><span class="sy0">,</span> <span class="st_h">'_adduser'</span><span class="br0">)</span><span class="sy0">;</span> <span class="br0">}</span> <span class="kw2">function</span> _adduser<span class="br0">(</span><span class="sy0">&</span><span class="re0">$event</span><span class="sy0">,</span> <span class="re0">$param</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw2">global</span> <span class="re0">$JSINFO</span><span class="sy0">;</span> <span class="re0">$JSINFO</span><span class="br0">[</span><span class="st_h">'user'</span><span class="br0">]</span> <span class="sy0">=</span> <span class="re0">$_SERVER</span><span class="br0">[</span><span class="st_h">'REMOTE_USER'</span><span class="br0">]</span><span class="sy0">;</span> <span class="br0">}</span></pre> <p> <img src="/lib/images/smileys/fixme.svg" class="icon smiley" alt="FIXME" /> add exact time when the array is send to JavaScript </p> </div> <div class="secedit editbutton_section editbutton_16"><form class="button btn_secedit" method="post" action="/ru:devel:javascript"><div class="no"><input type="hidden" name="do" value="edit" /><input type="hidden" name="rev" value="1677614415" /><input type="hidden" name="summary" value="[JSINFO] " /><input type="hidden" name="target" value="section" /><input type="hidden" name="hid" value="jsinfo" /><input type="hidden" name="codeblockOffset" value="5" /><input type="hidden" name="range" value="17729-" /><button type="submit" title="JSINFO">Править</button></div></form></div><div class="footnotes"> <div class="fn"><sup><a href="#fnt__1" id="fn__1" class="fn_bot">1)</a></sup> <div class="content">чтобы избежать излишней загрузки скриптов для тех, кто читает статью, содержимое <code>edit.js</code> и <code>media.js</code> загружается только в режиме редактирования или отображения медиафайлов</div></div> <div class="fn"><sup><a href="#fnt__2" id="fn__2" class="fn_bot">2)</a></sup> <div class="content">Please note as well that there is no <code>language</code> attribute of the <code>script</code> tag! Instead use <code>type=«text/javascript»</code> to be standards compliant.</div></div> </div> <!-- wikipage stop --> </div> <div class="docInfo"><bdi>ru/devel/javascript.txt</bdi> · Последнее изменение: <time datetime="2023-02-28T21:00:15+0100">2023-02-28 21:00</time> — <bdi>Aleksandr</bdi></div> <hr class="a11y" /> </div></main><!-- /content --> <!-- PAGE ACTIONS --> <nav id="dokuwiki__pagetools" aria-labelledby="dokuwiki__pagetools__heading"> <h3 class="a11y" id="dokuwiki__pagetools__heading">Инструменты страницы</h3> <div class="tools"> <ul> <li class="edit"><a href="/ru:devel:javascript?do=edit" title="Править страницу [e]" rel="nofollow" accesskey="e"><span>Править страницу</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg></a></li><li class="revs"><a href="/ru:devel:javascript?do=revisions" title="История страницы [o]" rel="nofollow" accesskey="o"><span>История страницы</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M11 7v5.11l4.71 2.79.79-1.28-4-2.37V7m0-5C8.97 2 5.91 3.92 4.27 6.77L2 4.5V11h6.5L5.75 8.25C6.96 5.73 9.5 4 12.5 4a7.5 7.5 0 0 1 7.5 7.5 7.5 7.5 0 0 1-7.5 7.5c-3.27 0-6.03-2.09-7.06-5h-2.1c1.1 4.03 4.77 7 9.16 7 5.24 0 9.5-4.25 9.5-9.5A9.5 9.5 0 0 0 12.5 2z"/></svg></a></li><li class="backlink"><a href="/ru:devel:javascript?do=backlink" title="Ссылки сюда" rel="nofollow"><span>Ссылки сюда</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10.59 13.41c.41.39.41 1.03 0 1.42-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0 5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.982 2.982 0 0 0 0-4.24 2.982 2.982 0 0 0-4.24 0l-3.53 3.53a2.982 2.982 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0 5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.982 2.982 0 0 0 0 4.24 2.982 2.982 0 0 0 4.24 0l3.53-3.53a2.982 2.982 0 0 0 0-4.24.973.973 0 0 1 0-1.42z"/></svg></a></li><li class="top"><a href="#dokuwiki__top" title="Наверх [t]" rel="nofollow" accesskey="t"><span>Наверх</span><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"/></svg></a></li> </ul> </div> </nav> </div><!-- /wrapper --> <!-- ********** FOOTER ********** --> <footer id="dokuwiki__footer"><div class="pad"> <div class="license">Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: <bdi><a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="license" class="urlextern">CC Attribution-Share Alike 4.0 International</a></bdi></div> <div class="buttons"> <a href="https://creativecommons.org/licenses/by-sa/4.0/deed.en" rel="license"><img src="/lib/images/license/button/cc-by-sa.png" alt="CC Attribution-Share Alike 4.0 International" /></a> <a href="https://www.dokuwiki.org/donate" title="Donate" ><img src="/lib/tpl/dokuwiki/images/button-donate.gif" width="80" height="15" alt="Donate" /></a> <a href="https://php.net" title="Powered by PHP" ><img src="/lib/tpl/dokuwiki/images/button-php.gif" width="80" height="15" alt="Powered by PHP" /></a> <a href="//validator.w3.org/check/referer" title="Valid HTML5" ><img src="/lib/tpl/dokuwiki/images/button-html5.png" width="80" height="15" alt="Valid HTML5" /></a> <a href="//jigsaw.w3.org/css-validator/check/referer?profile=css3" title="Valid CSS" ><img src="/lib/tpl/dokuwiki/images/button-css.png" width="80" height="15" alt="Valid CSS" /></a> <a href="https://dokuwiki.org/" title="Driven by DokuWiki" ><img src="/lib/tpl/dokuwiki/images/button-dw.png" width="80" height="15" alt="Driven by DokuWiki" /></a> </div> <div style="margin-top: 2em; font-size:90%" class="dokuwiki"><div style="float:right"><a href="http://www.splitbrain.org/personal#imprint" style="float:right; text-decoration: none; color:#333">Imprint</a></div></div><!-- Include for DokuWiki site wide top bar --> <style type="text/css"> @media screen { body { padding-top: 30px; } #global__header { position: absolute; top: 0; left: 0; text-align: left; vertical-align: middle; line-height: 1.5; background-color: #333; box-shadow: 0 0 8px rgba(0,0,0,0.5); width: 100%; margin: 0; padding: 5px 20px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; white-space: nowrap; overflow: hidden; } #global__header h2 { position: absolute; left: -99999em; top: 0; overflow: hidden; display: inline; } #global__header ul, #global__header li { margin: 0; padding: 0; list-style: none; display: inline; line-height: 1.5; } #global__header a { color: #bbb; text-decoration: none; margin-right: 20px; font-size: 14px; font-weight: normal; } #global__header a:hover, #global__header a:active, #global__header a:focus { color: #fff; text-decoration: underline; } #global__header form { float: right; margin: 0 0 0 20px; } #global__header input { background-color: #333; background-image: none; border: 1px solid #bbb; color: #fff; box-shadow: none; border-radius: 2px; margin: 0; line-height: normal; padding: 1px 0 1px 0; height: auto; } #global__header input.button { border: none; color: #bbb; } #global__header input.button:hover, #global__header input.button:active, #global__header input.button:focus { color: #fff; text-decoration: underline; } } /* /@media */ @media only screen and (min-width: 601px) { /* changes specific for www.dokuwiki.org */ #dokuwiki__header { padding-top: 3em; } #dokuwiki__usertools { top: 3em; } /* changes specific for bugs.dokuwiki.org */ div#container div#showtask { top: 40px; } } /* /@media */ @media only screen and (max-width: 600px) { body { padding-top: 0; } #global__header { position: static; white-space: normal; overflow: auto; } #global__header form { float: none; display: block; margin: 0 0 .4em; } } /* /@media */ @media print { #global__header { display: none; } } /* /@media */ </style> <div id="global__header"> <h2>Global DokuWiki Links</h2> <form method="get" action="https://search.dokuwiki.org/" target="_top"> <input type="text" name="q" title="Search all DokuWiki sites at once" class="input" /> <input type="submit" title="Search all DokuWiki sites at once" value="Search" class="button" /> </form> <ul> <li><a href="https://download.dokuwiki.org" title="Download the latest release" target="_top">Download</a></li> <li><a href="https://www.dokuwiki.org" title="Read the DokuWiki documentation" target="_top">Wiki</a></li> <li><a href="https://forum.dokuwiki.org" title="Ask questions in the DokuWiki forum" target="_top">Forum</a></li> <li><a href="https://irc.dokuwiki.org" title="Check IRC chat logs or join the chat" target="_top">IRC</a></li> <li><a href="https://github.com/splitbrain/dokuwiki/issues" title="Report and track bugs" target="_top">Bugs</a></li> <li><a href="https://translate.dokuwiki.org/" title="Help translating the DokuWiki interface" target="_top">Translate</a></li> <li><a href="https://github.com/splitbrain/dokuwiki" title="Access the most recent git commits" target="_top">Git</a></li> <li><a href="https://xref.dokuwiki.org/reference/dokuwiki/" title="Cross-Reference of the DokuWiki source code" target="_top">XRef</a></li> <li><a href="https://codesearch.dokuwiki.org/" title="Search through the sources of DokuWiki, plugins and templates" target="_top">Code Search</a></li> </ul> </div> <!-- end of DokuWiki top bar include --> </div></footer><!-- /footer --> </div></div><!-- /site --> <div class="no"><img src="/lib/exe/taskrunner.php?id=ru%3Adevel%3Ajavascript&1733049333" width="2" height="1" alt="" /></div> <div id="screen__mode" class="no"></div></body> </html>