Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите навесить обработчик (https://javascript.ru/forum/misc/10301-pomogite-navesit-obrabotchik.html)

bublik 27.06.2010 14:09

Помогите навесить обработчик
 
Здравствуйте.
Имеется выпадающее меню на javascript со сменным background.
Не удается навесить обработчик onchange.

<select class="kuk" >
  <option value="1">Русский</option>
  <option value="2">France</option>
</select>

фрагмент скрипта
function srReplaceSelects()
{
/*  var s = document.getElementsByTagName('select');*/
     var s = $('select.kuk');   
     var len = s.length
     for (var i = 0; i < len; i++)
      rsSelectReplace(s[i]);
    srAddEvent(document, 'click', srOnDocumentClick);
}

function rsSelectReplace(sel)
{
    var ie6 = (navigator.userAgent.search('MSIE 6.0') != -1);

    var ul = document.createElement('ul');
    if (!ie6) {
        ul.className = 'srList';
    } else {
        ul.className = 'srList2';
    }
    ul.className += ' srCollapsed';
    ul.className += ' srBlur';

    ul.srSelect = sel;
    sel.srReplacement = ul;

    sel.className += ' srReplacedSelect';
    sel.onfocus = function() { this.srReplacement.className = this.srReplacement.className.replace(/[\s]?srBlur/, ' srFocus'); }

    sel.onblur = function() {
        this.srReplacement.className = this.srReplacement.className.replace(/[\s]?srFocus/, ' srBlur');
    }
    sel.onchange = function()
    {
        alert("ch");
        var ul = this.srReplacement;
        ul.srSelectLi(ul.childNodes[this.selectedIndex]);
    }
...



функция sel.onchange = function() не работает

$('select.kuk').onchange(function(){alert('xxx'); }); - так тоже нет

Starkua 27.06.2010 16:19

Если я правильно понял - вы пользуетесь jQuery - в ней событие onchange называется просто change, то есть код должен быть примерно таким
$('select.kuk').change(function(){alert('xxx'); });

bublik 27.06.2010 18:45

Цитата:

Сообщение от Starkua (Сообщение 61317)
Если я правильно понял - вы пользуетесь jQuery - в ней событие onchange называется просто change, то есть код должен быть примерно таким
$('select.kuk').change(function(){alert('xxx'); });

Вы правы, jQuery.
Спасибо за подсказку насчет change.
Исправил-
$('select.kuk').change(function(){alert('xxx'); });


Для появления на экране сообщения 'xxx' достаточно изменять
выбор в списке или еще необходим вызов change в коде?

Starkua 27.06.2010 18:49

Цитата:

Сообщение от bublik
Для появления на экране сообщения 'xxx' достаточно изменять
выбор в списке или еще необходим вызов change в коде?

Обработчик вызывается при любом изменении опций, или вручную или программно.

bublik 27.06.2010 18:55

Цитата:

Сообщение от Starkua (Сообщение 61338)
Обработчик вызывается при любом изменении опций, или вручную или программно.

При ручном изменении в выпадающем списке сообщений нет.
Сообщение появляется один раз при загрузке страницы.

bublik 27.06.2010 18:57

Ошибся, сообщений вообще нет.

bublik 27.06.2010 20:53

Сообщения появляются только при изменении с клавиатуры,
при изменении мышкой- сообщений нет.

Starkua 27.06.2010 21:21

Цитата:

Сообщение от bublik
Сообщения появляются только при изменении с клавиатуры,
при изменении мышкой- сообщений нет.

Значит гдето есть ошибка, проверяйте пошагово, все ли колбеки вызываются. change() работает как надо, проверено множество раз на работающих проектах. Почитайте доку по нему, может помочь http://api.jquery.com/change/

bublik 27.06.2010 21:29

Цитата:

Сообщение от Starkua (Сообщение 61351)
Значит гдето есть ошибка, проверяйте пошагово, все ли колбеки вызываются. change() работает как надо, проверено множество раз на работающих проектах. Почитайте доку по нему, может помочь http://api.jquery.com/change/

Не знаю, как отладить.
Если отключить javascript- для стандартного <select> change
работает как надо.
Если навешиваю javascript + jquery и добавляю ul-li список
картинок, change перестает работать с мышки.

Starkua 27.06.2010 21:31

Цитата:

Сообщение от bublik
Не знаю, как отладить.
Если отключить javascript- для стандартного <select> change
работает как надо.
Если навешиваю javascript + jquery и добавляю ul-li список
картинок, change перестает работать с мышки.

Посмотреть на проблемку в деле можно?

bublik 27.06.2010 21:34

Цитата:

Сообщение от Starkua (Сообщение 61353)
Посмотреть на проблемку в деле можно?

С удовольствием показал-бы, но страница пока только локальная.
Могу показать лишь код.

Starkua 28.06.2010 01:26

Цитата:

Сообщение от bublik
Могу показать лишь код.

ждемс :)

bublik 28.06.2010 12:36

function srOnDocumentClick(e)
{
   var target = (window.event) ? window.event.srcElement : e.target;
    if(document.srExpandedList)
    {
        if((target.srIndex || target.srIndex === 0) && document.srExpandedList == target.parentNode )
            document.srExpandedList.srCollapse(target);
        else
            document.srExpandedList.srCollapse(); 
    switch ($('select.kuk').val()) {          
            case '1':
    $('ul.srBlur').css({background:"url('css/jaz/selectbg.png') "} ); 
    $('ul.srFocus').css({background:"url('css/jaz/selectbg.png') "} ); break;
            case '2':
    $('ul.srFocus').css({background:"url('css/jaz/sbgfr.png')"} );  
    $('ul.srBlur').css({background:"url('css/jaz/sbgfr.png')"} );   break;
                                  }
    }
    else
    {
        if(target.srIndex || target.srIndex === 0)
            target.parentNode.srExpand();
    }
}

function srReplaceSelects()
{
    var s = $('select.kuk');  
    var len = s.length      
    for (var i = 0; i < len; i++)
       rsSelectReplace(s[i]);   
    srAddEvent(document, 'click', srOnDocumentClick);
}
srAddEvent(window, 'load', srReplaceSelects);


вот часть кода с обработчиком click

RobertoCavali 14.09.2010 04:03

Скрипт, которым Вы пользуетесь действительно ограниченный. Удивительно, что автор не предусмотрел элементарные вещи связанные с событиями.. Я поступил весьма прозаично в аналогичном случае:

в самом скрипте дописал две строки
//устанавливаем для выбранного элемента
//класс srSelectedLi
ul.childNodes[li.srIndex].className = 'srSelectedLi';
if(window.srSelectCallBack)srSelectCallBack(ul.srSelect, li.srValue); // добавленная строка

//в каждом элементе списка
//храним индекс соответствующего
//элемента option
li.srIndex = i;
li.srValue=options[i].value; // добавленная строка


Ну и при необходимости уже в собственном коде определяем обработчик и получаем нужный функционал:
function srSelectCallBack(oSelect,xValue){
console.log($(oSelect).val());
} // srSelectCallBack

Rushfirst 19.09.2011 17:44

Решение RobertoCavali работает, но почему-то срабатывает со 2-го раза.
Сразу при загрузке страницы и при выборе любого элемента списка берёт значение всё-ранво из первого элемента option. Т.е. приходится выбирать 2 раза чтобы выбрать то что нужно.
Почему так происходит?


Часовой пояс GMT +3, время: 04:29.