Перестаёт работать всплавающая подсказка в админке.

Автор Dark Wizard, 30 января 2017, 07:43:48

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Dark Wizard

Потребовалось добавить своё меню на форум, добавил такой js код в index.template.php
echo '<body onload="MurrMenu(\'murrmenu\');">'; <link rel="stylesheet" type="text/css" media="all" href="murrmenu/menu.css" />
<script type="text/javascript" src="murrmenu/murrmenu.js"></script>
Содержимое murrmenu.js:
MurrMenu = function(menu) {
var getEls = document.getElementById(menu).getElementsByTagName("LI");
var getAgn = getEls;

for (var i=0; i<getEls.length; i++) {
getEls[i].onclick=function() {
for (var x=0; x<getAgn.length; x++) {
getAgn[x].className=getAgn[x].className.replace("unclick", "");
getAgn[x].className=getAgn[x].className.replace("click", "unclick");
}
if ((this.className.indexOf('unclick'))!=-1) {
this.className=this.className.replace("unclick", "");;
}
else {
this.className+=" click";
}
}
getEls[i].onmouseover=function() {
this.className+=" hover";
}
getEls[i].onmouseout=function() {
this.className=this.className.replace("hover", "");
}
}
}

И вместо

теперь так

и автопоиск (всплывающая вниз подсказки при введении трёх символов - типа библиотеки autocomplete) перестаёт работать.
Если убираю
<body onload="MurrMenu(\'murrmenu\');">всё работает. Название функции уникальное, вызов функции пробовал ставить в другом месте - проблема остаётся.

iaroslav

#1
Отладчиком яваскрипта гляньте на предмет ошибок.

Если ошибок не обнаруживается, то попробуйте заменить
if ((this.className.indexOf('unclick'))!=-1) {
this.className=this.className.replace("unclick", "");;
}
else {
this.className+=" click";
}
на if ((getEls[i].className.indexOf('unclick'))!=-1) {
getEls[i].className=getEls[i].className.replace("unclick", "");;
}
else {
getEls[i].className+=" click";
}
А то у вас не очень понятно с каким объектом идёт работа (в смысле - какой понимается под this).  Поэтому излишне хитрый браузер может прогнать его вообще для всей страницы, что-нибудь порушив.

Dark Wizard

Код на Ваш обновил.

В консоли Оперы так:

с отключённым меню


с подключённым меню


Ошибок вроде нет, только 4 предупреждения...

iaroslav

Кстати, по зрелому размышлению, пришёл к выводу, что у вас всё-таки изначальный ваш вариант был правильный. И this там вполне определённый.
А ваш ново добавляемый скрипт работает нормально? В смысле меняет классы для вашей менюшки при наведении мышкой? Или он и сам не работает и другие скрипты ломаются?

Dark Wizard

Цитата: iaroslav от 31 января 2017, 10:53:58Кстати, по зрелому размышлению, пришёл к выводу, что у вас всё-таки изначальный ваш вариант был правильный. И this там вполне определённый.
А ваш ново добавляемый скрипт работает нормально? В смысле меняет классы для вашей менюшки при наведении мышкой? Или он и сам не работает и другие скрипты ломаются?
О, действительно, не проверил, с Вашим кодом меню не работает и скрипт автоподсказки ломается, вернул на оригинальный...

iaroslav

Цитата: Dark Wizard от 31 января 2017, 11:45:47О, действительно, не проверил, с Вашим кодом меню не работает и скрипт автоподсказки ломается, вернул на оригинальный...
А с оригинальным работает всё, кроме пунктов админки со скриншота? То есть при открытой админке на этой странице нормально пашет и меню и поиск,

Dark Wizard

Цитата: iaroslav от 31 января 2017, 11:52:40А с оригинальным работает всё, кроме пунктов админки со скриншота? То есть при открытой админке на этой странице нормально пашет и меню и поиск,
С моим меню (и его оригинальным js) вроде работает всё, кроме автоподсказок в поле "модераторы" (пример в первом посте).

iaroslav


Dark Wizard

На всякий случай, вот полный код:
index.template.php строка 166
echo '<body onload="MurrMenu(\'murrmenu\');">';

index.template.php строка 327
global $user_info;if (in_array(29, $user_info['groups'])) { include('murrmenu/revmenu.php'); } 

всё моё меню в приложении murrmenu.zip

iaroslav

Кстати, а может просто дополнительно допишите, что бы у вас меню в админке не грузилась? Теоретически оно вашу проблему решит.
Увы, у мня нигде 2.1 версии не стоит так что я не очень в курсе как именно код должен выглядеть для 2.1. Но для 2.0 можно запретить подгрузку в админке через условие
$_GET['action'] != 'admin'
То есть.
if ($_GET['action'] != 'admin') echo '<body onload="MurrMenu(\'murrmenu\');">'; и
global $user_info;if ((in_array(29, $user_info['groups'])) && ($_GET['action'] != 'admin')) { include('murrmenu/revmenu.php'); }
Оно, конечно, костыль. Но иных вариантов в голову не приходит.