Обсуждение проекта:Технические работы/Персональные скрипты/Руководство
Определение вида страницы[править код]
if (document.URL.indexOf('&action=history') != -1) { /* ... */ }
А если action=history стоит первым параметром? — Kalan ? 13:55, 2 апреля 2007 (UTC)
- Tакую ссылку вживую встретить трудно, практически всегда первым стоит title=. Однако всё бывает, и я совсем недавно сам на этом споткнулся на странице Запросы — один скрипт у меня создавал ссылку ?action=edit…, а другой с умным видом проверял &action=edit
В общем, исправлю. P.S. Did you know you could use http://ru.wikipedia.org/wiki/Заяц?action=history ? — Alex Smotrov 14:34, 2 апреля 2007 (UTC)- Кстати, с тех пор уже неактуально в связи с появлением переменной wgAction. —AlexSm 19:33, 27 июня 2008 (UTC)
Пример изменения значения для кнопки подписи[править код]
if (mwEditButtons.length >= 10 && mwEditButtons[9].tagOpen == '--~~\~~')
mwEditButtons[9].tagOpen = ' — ~~\~~';
А если на панель добавлены ещё и свои кнопки, то цифры, наверное, должны быть другими?
Вот, предлагаю более универсальный пример:
if (wgAction == "edit")
for (var i = 0; i < mwEditButtons.length; i++)
if (mwEditButtons[i].imageId == 'mw-editbutton-signature') {
mwEditButtons[i].tagOpen = ' — ~~\~~';
break;
}
— redmond barry 05:05, 21 июня 2008 (UTC)
- Свои кнопки обычно добавляют в конце массива или вообще в mwCustomEditButtons[], поэтому реально грозит только изменение со стороны разработчиков. Конечно, предложенный вариант надёжнее, но и выполняется чуть-чуть дольше на каждой странице. P.S. Тильды лучше разделять (см. добавленные "\" выше), не надеясь на (необязательный в monobook.js) <source>. —AlexSm 05:30, 21 июня 2008 (UTC)
- Кстати, по поводу выполнения на всех страницах: по-моему, вот так
if (wgAction == "edit" && mwEditButtons.length >= 10 && mwEditButtons[9].tagOpen == '--~~\~~')
mwEditButtons[9].tagOpen = ' — ~~\~~';
…будет правильнее. — redmond barry 02:54, 25 июня 2008 (UTC)
- Нужно
(wgAction == "edit" || wgAction == "sumbit")
, не вижу, чем эта проверка «легче» чем(mwEditButtons.length >= 10)
, а проверятьmwEditButtons.length
приходится в любом случае, чтобы отсечь участников, которые выключили toolbar в своих настройках. —AlexSm 19:33, 27 июня 2008 (UTC)
- Нужно
Отладка скрипта[править код]
Лично я использую следующий вариант:
- 1. Сохраняю себе страницу на диск (в Opera): получаются, например, файл
Персональные скрипты - Руководство.htm
и каталогПерсональные скрипты - Руководство_files
; - 2. Копирую в каталог
Персональные скрипты - Руководство_files
имеющийся у меняmonobook.js
- 3. В файле
Персональные скрипты - Руководство.htm
заменяю
<script type="text/javascript" src="/w/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Redmond_Barry/monobook.js&action=raw&ctype=text/javascript&dontcountme=s"></script>
на
<script type="text/javascript" src="Персональные скрипты - Руководство_files/monobook.js"></script>
- 4. Открываю
Персональные скрипты - Руководство_files/monobook.js
в текстовом редакторе и вношу те изменения, которые мне нужны. Далее надо будет только обновлять сохранённую страницу в браузере и смотреть, что получилось.
Таким образом отладкой можно заниматься, даже будучи неподключённым к Интернету. К тому же это экономит и время, и трафик, и нагрузку на сервер не создаёт. — redmond barry 02:55, 25 июня 2008 (UTC)
- Действительно, этот способ хорошо дополняет вариант с localhost web-server, но конечно у него есть и недостаки: приходится сохранять разные страницы, нельзя тестироватъ скрипт «как бы между делом» (просто гуляя по проекту), и нельзя отлаживать Ajax запросы. Я и сам так делал при интенсивной отладке (у меня для удобства сохранено всё дерево скриптов: skins-1.5/common/... и т.д.). Сейчас я использую вариант, объединяющий удобства обоих: специальный скрипт, который по нажатию ссылки перегружает с localhost только нужный мне скрипт. —AlexSm 19:33, 27 июня 2008 (UTC)
Создание соственного блока ссылок[править код]
//Пример использования innerHTML для создания слева нового блока:
document.getElementById('p-participation').innerHTML +=
'</div>'+
'<div id=my class=portlet>'+
'<h5>моё</h5>'+
'<div class=pBody><ul>'+
'<li><a href=\"/wiki/Special:MyPage/monobook.js\">Мой monobook.js</a>'+
'</ul></div></div>';
Думаю, что в данном случае использовать только innerHTML
можно (и это работает), однако это не совсем правильно. Я поначалу использовал код этого примера для того, чтобы создавать собственный блок ссылок под блоком «Участие». Однако оказалось, что новый блок создаётся прямо впритык к предыдущему, в то время как между стандартными блоками есть небольшое расстояние.
Поскольку я не очень хорошо знаю JavaScript, то поначалу решил, что просто не понимаю, как работает innerHTML
и как им правильно пользоваться, и поэтому в качестве альтернативы написал довольно объёмный код, который генерирует HTML-структуру методами JavaScript:
function myForums () {
var forums_common = document.createElement('a');
forums_common.href = "/wiki/Википедия:Форум/Общий";
forums_common.appendChild(document.createTextNode("Общий"));
var forums_tech = document.createElement('a');
forums_tech.href = "/wiki/Википедия:Форум/Технический";
forums_tech.appendChild(document.createTextNode("Технический"));
var forums_quests = document.createElement('a');
forums_quests.href = "/wiki/Википедия:Форум/Вопросы";
forums_quests.appendChild(document.createTextNode("Вопросы"));
var forums_offers = document.createElement('a');
forums_offers.href = "/wiki/Википедия:Форум/Предложения";
forums_offers.appendChild(document.createTextNode("Предложения"));
var forums_attention = document.createElement('a');
forums_attention.href = "/wiki/Википедия:Форум/Вниманию участников";
forums_attention.appendChild(document.createTextNode("ВП:ВУ"));
var forums_r2a = document.createElement('a');
forums_r2a.href = "/wiki/Википедия:Запросы к администраторам"
forums_r2a.appendChild(document.createTextNode("ВП:ЗКА"));
var li_common = document.createElement('li');
li_common.id = 'n-common';
li_common.appendChild(forums_common);
var li_tech = document.createElement('li');
li_tech.id = 'n-tech';
li_tech.appendChild(forums_tech);
var li_quests = document.createElement('li');
li_quests.id = 'n-quests';
li_quests.appendChild(forums_quests);
var li_offers = document.createElement('li');
li_offers.id = 'n-offers';
li_offers.appendChild(forums_offers);
var li_attention = document.createElement('li');
li_attention.id = 'n-attention';
li_attention.appendChild(forums_attention);
var li_r2a = document.createElement('li');
li_r2a.id = 'n-r2a';
li_r2a.appendChild(forums_r2a);
var forums_body_ul = document.createElement('ul');
forums_body_ul.appendChild(li_common);
forums_body_ul.appendChild(li_tech);
forums_body_ul.appendChild(li_quests);
forums_body_ul.appendChild(li_offers);
forums_body_ul.appendChild(li_attention);
forums_body_ul.appendChild(li_r2a);
var forums_body = document.createElement('div');
forums_body.setAttribute('class', 'pBody');
forums_body.appendChild(forums_body_ul);
var forums_title = document.createElement('h5');
forums_title.appendChild(document.createTextNode("Форумы"));
var forums = document.createElement('div');
forums.setAttribute('class', 'generated-sidebar portlet');
forums.id = 'p-forum';
forums.appendChild(forums_title);
forums.appendChild(forums_body);
var column1 = document.getElementById('column-one');
column1.appendChild(forums);
column1.insertBefore(forums, document.getElementById('p-search'));
}
В процессе написания до меня дошло, что приведённый в самом начале пример следует немного подправить: метод getElementById()
нужно использовать не для блока, под которым мы хотим дописать свой блок, а для <div id="column-one">
, добавлять новый блок следует при помощи appendChild()
, а позиционировать — при помощи insertBefore()
.
var myBlock = document.createElement('div');
myBlock.setAttribute('class', 'generated-sidebar portlet');
myBlock.id = 'my';
myBlock.innerHTML +=
'<h5>Моё</h5>'+
'<div class=\'pBody\'><ul>'+
'<li><a href=\"/wiki/Special:MyPage/monobook.js\">Мой monobook.js</a></li>'+
'</ul></div>';
var column1 = document.getElementById('column-one');
column1.appendChild(myBlock);
column1.insertBefore(myBlock, document.getElementById('p-search'));
Так что в случае создания своего собственного блока ссылок лучше использовать и innerHTML
, и appendChild()
, и insertBefore()
. — redmond barry 03:01, 25 июня 2008 (UTC)