Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не работает live в IE8 (https://javascript.ru/forum/jquery/28692-ne-rabotaet-live-v-ie8.html)

santik 30.05.2012 03:51

Не работает live в IE8
 
Доброго времени суток.
Возникла следующая проблема в IE8 не срабатывает событие click определенное через
$('.h').live('click',function() {..

В IE9 все работает отлично, а вот в 8 не идет (для версий ниже 8 не делаю)
Некоторые тонкости возникшей проблемы:
элементы с классом .h создаются динамически, соответственно, чтобы функция срабатывала и на вновь созданных элементах, использую именно метод live.
Так же пробовал создать элемент в коде к которому сразу прописал обработчик события click
var el = $('<td/>', {
	html: el2,
	class: "h",
	click: function() {alert("work!")}
	});

и далее просто добавлял этот элемент в нужное место. Работает везде кроме IE8. В чем же проблема? Может кто какие ещё варианты предложит?
Для наглядности вот документ в котором данная бага
http://promecovata.ru/calc/
Бага возникает в момент, когда вы выбрали (кликом) материалы из общего списка и в поле t,мм пытаетесь вписать толщину слоя.
Заранее благодарю всех, кто отзовется.

Deff 30.05.2012 11:53

Цитата:

Сообщение от santik
и далее просто добавлял этот элемент в нужное место. Работает везде кроме IE8. В чем же проблема? Может кто какие ещё варианты предложит?

Цитата:

Сообщение от santik
$('.h').live('click',function() {..

Попробуйте так:
$('td.h').live('click',function() {..

Deff 30.05.2012 11:57

Цитата:

Сообщение от santik
и далее просто добавлял этот элемент в нужное место. Работает везде кроме IE8. В

В Ие , что бы клик срабатывал, ячейка не должна быть пустой - обычно ставят самой первой в ячейку однопиксельную прозрачку,
<img style="position:absolute;width:42px;height:20px" src="blank.gif"/>

(*&nbsp; и буквы - похоже не помогают,

santik 31.05.2012 01:06

Итак господа, проверил все ваши рекомендации
Цитата:

Попробуйте так:
$('td.h').live('click',function() {..
Пробовал ещё до того как тему создал - эффекта никакого!
Цитата:

В Ие , что бы клик срабатывал, ячейка не должна быть пустой
Вставил в ячейке был текст всегда, попробовал вставить изображение, все равно click не срабатывает.
Сейчас решил проверить, сработает ли клик на ячейках, которые были в DOM при открытии страницы - нет. Не срабатывает.
Может тонкость в том, что есть обработчик клика по строке tr и отдельный обработчик клика для одной из ячеик этой строки (собственно тот, который не работает). Может тут собака зарыта.
А ещё сегодня тестил ошибку и случайно понял, что в IE8 alert() не работает. А я именно им все функции проверяю. Короче копаю. Если что откопаю - сообщу.

Deff 31.05.2012 01:37

santik,
Пробуйте воткнуть onclick="FuncMy()" прямо на изо в <TD>

Способ работает во всех ИE- проверено десятилетиями

santik 31.05.2012 02:15

Итак, как ни странно оказалось, что alert действительно не хочет работать в ie8. Проверил самым надежным способом, просто прописал alert в начале вызова jquery
$(function() {

Во всех браузерах вызвался алерт, даже в IE9, но не в IE8.
Тогда начал проверять конструкцией
$('#info').html("okk");
- оказалось что live('click' ...) срабатывает!
Проблема в другом, и тут я вам объясню что хочу и что не получается.
Есть таблица, в каждой строке в последней ячейке под классом "h" по умолчанию стоит 0. Необходимо чтобы при клике на эту ячейку можно было отредактировать значение в ней.
До вызова $(function() {... определена функция
function addinput(el) {
	el.html('<input type="text" value="'+el.html()+'" size="1">'); //берем значение из ячейки и вставляем в ячейку input с этим значением
	el.children(':first').focus(); //наводим фокус на вставленный input
};

Повесил следующий обработчик на клик по ячейке .h
$('.h').live('click',function() {
	addinput($(this));
});

Чтобы при перемещении курсора внутри input не срабатывал обработчик click прикрепленный к родительской ячейке td использую следующую конструкцию
$(".h :input").live("click",function() { return false; });

И наконец когда ввели нужное значение в input, кликаем по пустому пространству и удаляем input оставляя значение из него
$('.h').live('blur',function() {
	$(this).html($(this).children(':first').val());
});

Это все верно работает везде, кроме IE8. Но! если убрать строку
el.children(':first').focus(); //наводим фокус на вставленный input

то в IE8 так же появляется input, правда редактировать в нем ничего не выходит, т.к. фокуса нет, а если устанавливать курсор мышью, input опять исчезает. Вот такие странности. Копаю...

santik 31.05.2012 02:55

Итак, с облегчением могу сообщить, что решение найдено!
Оказалась проблема не в методе live, который, как мне показалось изначально не срабатывал, а в конструкции
$('.h').live('blur',function() {
	$(this).parents('tr').html($(this).children(':first').val());
});
Данная конструкция была призвана убрать поле ввода оставив только введенное в него значение. Эта конструкция не давала правильно функционировать в IE8 и была заменена следующей
$('.h :input').live('focusout',function() {
	$(this).parents('td').html($(this).val());
});

Всем, кто принял участие в обсуждении и дал советы - большое спасибо!

tadjik1 31.05.2012 12:11

попробуйте посмотреть, что у вас получается в итоге после этой строчки:
el.html('<input type="text" value="'+el.html()+'" size="1">');

мне почему-то кажется, что надо использовать не html(), а text() для получения значения.

ну и фокус можно повесить, используя селектор jquery:
$('input', el).focus();

вместо вашего
el.children(':first').focus();


проверьте, пожалуйста, у меня виндовса нет, к сожалению.

по поводу же события фокусаут — это только для ие, сделайте так:
$('.h :input').live('focusout blur',function() {

будет более кроссбраузерно, хотя мне казалось, что ие свободно генерит blur, очень странно выходит.

santik 31.05.2012 16:34

tadjik1,
Цитата:

попробуйте посмотреть, что у вас получается в итоге после этой строчки:
Получается все нормально, значение переносится в input, все работает верно, т.к. в ячейке просто цифры. Но вы правы, если бы там были какие либо ещё теги то в input перенеслось бы все, включая теги. Так что тут с вами согласен - html заменил на text
Цитата:

ну и фокус можно повесить, используя селектор jquery:
$('input', el).focus();

И тут, я считаю, вы правы. Мой код конечно тоже работал без нареканий, но ваша конструкция, на мой взгляд, более правильная. Тоже заменил.
Цитата:

по поводу же события фокусаут — это только для ие, сделайте так:
$('.h :input').live('focusout blur',function() {

Попробовал как вы сказали, то же все работает верно. Но Оставил свой вариант
$('.h :input').live('focusout',function() {
, т.к. проверил его во всех IE (9,8 и даже в 7 и 6) - работает как часы.
Действительно проверил, ради интереса, работоспособность в 7 и 6 эксплорерах, основной функционал работает - чем был приятно удивлен, но некоторые функции работы со строками таблицы не работают. Но об этом в другой раз, т.к. главное, что начиная с 8-го все пашет.
По ходу написания кода, ошибки устраняю, но появляются новые. Так вот например столкнулся с проблемой, что в IE (ни в одном) не могу обратиться к window.opener из которого было событие window.open(url,'report')
Во всех браузерах работает, а вот для IE ещё не нашел решения.
Если конкретнее, то из родительского окна нужно передать несколько значений в дочернее. Очень не хотелось бы делать это через GET. Для всех "нормальных" браузеров использую
var w = window.opener;
$("#msg").html($("#msg", w.document).html());

В IE8 ошибка "w.document - есть null или не является объектом"
Может кто что подскажет? Как в IE покопаться в родительском окне из дочернего?

santik 31.05.2012 19:09

Цитата:

В IE8 ошибка "w.document - есть null или не является объектом"
Проблема отменяется. Методом проб определил, что это ошибка не IE а софтины IETester (проверка во всех версиях эксплорера). В чистом IE9 такой ошибки не возникает. Проблема возникает в другом.
Вот так все работает отлично.
var w = window.opener;
var rreq = $("#rreq", w.document).html();
$("#rreq").html(rreq);

А вот скопировать строки таблицы из родительского в дочернее - вообще никак не идет в IE (во всех других работает).
var mat = $("#my-material tr", w.document).clone();
$("#my-material").html(mat);

#my-material - это таблица
<table style="width:949px;" id="my-material">
    </table>

Есть идеи как скопировать строки таблицы или таблицу из родителя в ребенка?


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