Обсуждение проекта:Технические работы/Персональные скрипты/Руководство

Определение вида страницы править

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&amp;action=raw&amp;ctype=text/javascript&amp;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:

В процессе написания до меня дошло, что приведённый в самом начале пример следует немного подправить: метод 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)Ответить