Использование $ (this) в сочетании с live / делегатом в IE6-7? - PullRequest
1 голос
/ 10 августа 2011

Я не могу получить значение из опции выбора, которая была динамически создана при просмотре в IE6 / IE7.IE всегда возвращает undefined в качестве значения.

У меня есть настройка скрипка , и ниже приведен полный источник примера (в случае, если вы пытаетесь использовать скрипку в IE6 / 7...heh):

<!doctype html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script>
var json = "blah blah blah";

jQuery(document).ready(function(){

    $('#myForm').html('<select id="sg-1" class="setgroup" name="sg-1"><option value="s-1">Something</option><option value="s-2">Another</option><option value="s-3">Third</option><option value="s-4">Fourth</option></select>');

    $('.setgroup').live('change',function(){
        updateSelected($(this + ':selected').val(), json);
    });

});

function updateSelected(value, json){
    //do some stuff with the json in my app
    $('#selected').html(value + ' was selected');
}
</script>
</head>
<body>
<form id="myForm">
</form>
<p id="selected" style="font-size:20px; color:#f00;"></p>
</body>
</html>

В примерах используется live (), однако я также попробовал вариант с использованием .delegate ().Оба метода работают во всех браузерах, кроме IE6 / 7.Я попытался использовать щелчок как событие.Любые идеи?

Я также попробовал решение (ы), предоставленные здесь .Кажется, проблема в том, что $ (this) неправильно интерпретируется, как будто я помещаю предупреждение в live / change / делегат, он будет срабатывать правильно.

Ответы [ 6 ]

1 голос
/ 06 апреля 2012

Для будущих посетителей:

.live () устарела. Для кросс-браузерной поддержки используйте .on () при использовании jQuery 1.7+ или .delegate () в более низких версиях.

.on () пример:

jQuery(document).on('change', '.setgroup', function(){
      updateSelected($(this).val(), json); // your javascript code goes here
});

.delegate () пример:

$(document).delegate('.setgroup', 'change', function() {
    updateSelected($(this).val(), json); // your javascript code goes here
});
1 голос
/ 10 августа 2011

Это похоже на работу:

$('.setgroup').live('change',function(){

        updateSelected($(this).find(':selected').val(), json);

    });

http://jsfiddle.net/q2wkd/3/

1 голос
/ 10 августа 2011

У вас есть ошибка в вашем селекторе.Вы пытаетесь объединить ссылку на элемент со строкой.Это не даст вам действительный селектор.Чтобы исправить это, вы хотите:

$(":selected", this)

или:

$(this).find(":selected")

Но лучше, чем любой из этих вариантов, было бы просто использовать .val() непосредственно для выбора:

$(this).val()
1 голос
/ 10 августа 2011

Попробуйте это

$('.setgroup').live('change',function(){
    updateSelected($(this).val(), json);
});
1 голос
/ 10 августа 2011

Использование:

$('.setgroup').live('change',function(){
    updateSelected($(this).val(), json);
});
1 голос
/ 10 августа 2011

$(this + ':selected') не будет работать.Он попытается объединить строковое представление элемента DOM, которое, вероятно, будет [object HTMLSelectElement], с :selected, что приведет к «селектору» $('[object HTMLSelectElement]:selected').

Я думаю, вы просто хотите $(this),A select в любом случае не может быть selected.

Как правило, если у вас уже есть набор выбранных элементов, вы можете фильтровать определенные элементы с помощью .filter() [документы] .Если вы хотите найти конкретных потомков, используйте .find() [документы] .


Однако вы также можете прикрепитьобработчик события после вставки элемента:

// or $('#sg-1').change(...
$('.setgroup').change(function(){
    updateSelected($(this).val(), json);
});

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...