2016-09-13 5 views
1

Что я здесь делаю, что я динамически создать раскрывающийся и связать click событие в <option> в <select>нажмите событие не работает на динамически вставленный элемент хромом (JQuery)

var $select = $('<select></select>'), 
    $option1 = $('<option>a</option>'), 
    $option2 = $('<option>b</option>'); 

    $option1.val(1); 
    $option2.val(2); 

$(document.body).on('click','select option',function(){ 
     console.log("click-option works"); 
    }); 

    $select.append($option1); 
    $select.append($option2); 

    $(document.body).append($select); 

Как я прочитал here, Так как я динамически добавляю контент, я делегировал обработку событий в самый верхний элемент в DOM.

Теперь моя проблема заключается в том, что это не работает в хроме, как ожидалось. В огне-лисе кажется, что все нормально.

Я также прочитал ссылку this и other один, но безрезультатно.

Интересно, когда я делаю это в месте 'select option' селектора

$(document.body).on('click','select',function(){ 
     console.log("click-option works"); 
    }); 

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

$(document.body).on('change','select',function(event){ 
     console.log("change works"); 
     console.log(event); 
    }); 

Это, кажется, делает трюк, однако я хочу знать, почему он не работает в оригинальном футляре и любые обходные, если это возможно ,

Вот fiddle за то, что я сделал до сих пор.

ОБНОВЛЕНИЕ: Я также проверил this link. Однако это только для чистого javascript, я хотел знать, почему он работает в моем случае. Более конкретно, в делегированном обработчике событий, где мы указываем селектор, почему он не работает на 'select option' и работает в 'select' в хром?

+0

Возможный дубликат [onclick on option tag, не работающий на IE и chr ome] (http://stackoverflow.com/questions/9972280/onclick-on-option-tag-not-working-on-ie-and-chrome) –

+0

Да, я проверил это, но это не чистое javascript вещь. Я думал, что jQuery был разработан, чтобы сгладить такие вещи –

+1

Да, события на самом низком уровне - это чистые js, но каждый браузер обрабатывает эти события по-разному. Кажется, что у Webkit (хром) эта текущая проблема –

ответ

1

Проблема в том, что вы присоединяете событие click к элементам option, которые не очень надежны. Событие click должно начинаться с самого select, но обратите внимание, что даже это не соответствует лучшим практикам, так как вы должны использовать событие change, чтобы ваш код запускался, даже если эта опция выбрана с клавиатуры. Для того, чтобы получить значение выбранного ooption в обработчике использовать $(this).val(), как это:

var $select = $('<select></select>'), 
 
    $option1 = $('<option>a</option>'), 
 
    $option2 = $('<option>b</option>'); 
 

 
$option1.val(1); 
 
$option2.val(2); 
 

 
$(document).on('change', 'select', function() { 
 
    console.log($(this).val()); 
 
}); 
 

 
$select.append($option1); 
 
$select.append($option2); 
 

 
$('body').append($select);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

отметить также, что это может быть сокращено до просто:

$(document).on('change', 'select', function() { 
 
    console.log($(this).val()); 
 
}); 
 

 
$('<select><option value="1">a</option><option value="2">b</option></select>').appendTo('body');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

Привет, Спасибо за вклад. Я уже делаю это пока, как я упоминал в вопросе.Теперь можно каким-либо образом извлечь из изменения, какой из параметров был выбран. Это была моя мотивация использовать клик на самом деле? –

+0

Да, вы можете просто использовать '$ (this) .val()', чтобы получить значение выбранного параметра в обработчике события 'change' –

+0

Я обновил свой ответ для вас –