30.05.2012, 03:51
|
Новичок на форуме
|
|
Регистрация: 30.05.2012
Сообщений: 8
|
|
Не работает 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,мм пытаетесь вписать толщину слоя.
Заранее благодарю всех, кто отзовется.
|
|
30.05.2012, 11:53
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от santik
|
и далее просто добавлял этот элемент в нужное место. Работает везде кроме IE8. В чем же проблема? Может кто какие ещё варианты предложит?
|
Сообщение от santik
|
$('.h').live('click',function() {..
|
Попробуйте так:
$('td.h').live('click',function() {..
|
|
30.05.2012, 11:57
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от santik
|
и далее просто добавлял этот элемент в нужное место. Работает везде кроме IE8. В
|
В Ие , что бы клик срабатывал, ячейка не должна быть пустой - обычно ставят самой первой в ячейку однопиксельную прозрачку,
<img style="position:absolute;width:42px;height:20px" src="blank.gif"/>
(* и буквы - похоже не помогают,
Последний раз редактировалось Deff, 30.05.2012 в 12:04.
|
|
31.05.2012, 01:06
|
Новичок на форуме
|
|
Регистрация: 30.05.2012
Сообщений: 8
|
|
Итак господа, проверил все ваши рекомендации
Цитата:
|
Попробуйте так:
$('td.h').live('click',function() {..
|
Пробовал ещё до того как тему создал - эффекта никакого!
Цитата:
|
В Ие , что бы клик срабатывал, ячейка не должна быть пустой
|
Вставил в ячейке был текст всегда, попробовал вставить изображение, все равно click не срабатывает.
Сейчас решил проверить, сработает ли клик на ячейках, которые были в DOM при открытии страницы - нет. Не срабатывает.
Может тонкость в том, что есть обработчик клика по строке tr и отдельный обработчик клика для одной из ячеик этой строки (собственно тот, который не работает). Может тут собака зарыта.
А ещё сегодня тестил ошибку и случайно понял, что в IE8 alert() не работает. А я именно им все функции проверяю. Короче копаю. Если что откопаю - сообщу.
|
|
31.05.2012, 01:37
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
santik,
Пробуйте воткнуть onclick="FuncMy()" прямо на изо в <TD>
Способ работает во всех ИE- проверено десятилетиями
|
|
31.05.2012, 02:15
|
Новичок на форуме
|
|
Регистрация: 30.05.2012
Сообщений: 8
|
|
Итак, как ни странно оказалось, что 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:57.
Причина: Добавлен код
|
|
31.05.2012, 02:55
|
Новичок на форуме
|
|
Регистрация: 30.05.2012
Сообщений: 8
|
|
Итак, с облегчением могу сообщить, что решение найдено!
Оказалась проблема не в методе 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());
});
Всем, кто принял участие в обсуждении и дал советы - большое спасибо!
|
|
31.05.2012, 12:11
|
Профессор
|
|
Регистрация: 07.06.2011
Сообщений: 315
|
|
попробуйте посмотреть, что у вас получается в итоге после этой строчки:
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, очень странно выходит.
|
|
31.05.2012, 16:34
|
Новичок на форуме
|
|
Регистрация: 30.05.2012
Сообщений: 8
|
|
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 в 16:38.
Причина: Исправлен код
|
|
31.05.2012, 19:09
|
Новичок на форуме
|
|
Регистрация: 30.05.2012
Сообщений: 8
|
|
Цитата:
|
В 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>
Есть идеи как скопировать строки таблицы или таблицу из родителя в ребенка?
|
|
|
|