Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.05.2012, 03:51
Новичок на форуме
Отправить личное сообщение для santik Посмотреть профиль Найти все сообщения от santik
 
Регистрация: 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,мм пытаетесь вписать толщину слоя.
Заранее благодарю всех, кто отзовется.
Ответить с цитированием
  #2 (permalink)  
Старый 30.05.2012, 11:53
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от santik
и далее просто добавлял этот элемент в нужное место. Работает везде кроме IE8. В чем же проблема? Может кто какие ещё варианты предложит?
Сообщение от santik
$('.h').live('click',function() {..
Попробуйте так:
$('td.h').live('click',function() {..
Ответить с цитированием
  #3 (permalink)  
Старый 30.05.2012, 11:57
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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

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

Последний раз редактировалось Deff, 30.05.2012 в 12:04.
Ответить с цитированием
  #4 (permalink)  
Старый 31.05.2012, 01:06
Новичок на форуме
Отправить личное сообщение для santik Посмотреть профиль Найти все сообщения от santik
 
Регистрация: 30.05.2012
Сообщений: 8

Итак господа, проверил все ваши рекомендации
Цитата:
Попробуйте так:
$('td.h').live('click',function() {..
Пробовал ещё до того как тему создал - эффекта никакого!
Цитата:
В Ие , что бы клик срабатывал, ячейка не должна быть пустой
Вставил в ячейке был текст всегда, попробовал вставить изображение, все равно click не срабатывает.
Сейчас решил проверить, сработает ли клик на ячейках, которые были в DOM при открытии страницы - нет. Не срабатывает.
Может тонкость в том, что есть обработчик клика по строке tr и отдельный обработчик клика для одной из ячеик этой строки (собственно тот, который не работает). Может тут собака зарыта.
А ещё сегодня тестил ошибку и случайно понял, что в IE8 alert() не работает. А я именно им все функции проверяю. Короче копаю. Если что откопаю - сообщу.
Ответить с цитированием
  #5 (permalink)  
Старый 31.05.2012, 01:37
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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

Способ работает во всех ИE- проверено десятилетиями
Ответить с цитированием
  #6 (permalink)  
Старый 31.05.2012, 02:15
Новичок на форуме
Отправить личное сообщение для santik Посмотреть профиль Найти все сообщения от santik
 
Регистрация: 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. Причина: Добавлен код
Ответить с цитированием
  #7 (permalink)  
Старый 31.05.2012, 02:55
Новичок на форуме
Отправить личное сообщение для santik Посмотреть профиль Найти все сообщения от santik
 
Регистрация: 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());
});

Всем, кто принял участие в обсуждении и дал советы - большое спасибо!
Ответить с цитированием
  #8 (permalink)  
Старый 31.05.2012, 12:11
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 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, очень странно выходит.
Ответить с цитированием
  #9 (permalink)  
Старый 31.05.2012, 16:34
Новичок на форуме
Отправить личное сообщение для santik Посмотреть профиль Найти все сообщения от santik
 
Регистрация: 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. Причина: Исправлен код
Ответить с цитированием
  #10 (permalink)  
Старый 31.05.2012, 19:09
Новичок на форуме
Отправить личное сообщение для santik Посмотреть профиль Найти все сообщения от santik
 
Регистрация: 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>

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IE8 не работает скрипт Kubert Internet Explorer 0 27.12.2011 12:19
Не работает кнопка через live Dorian_bs Общие вопросы Javascript 7 04.12.2011 02:29
не работает live() Enxiro jQuery 1 03.07.2011 21:13
Код работает корректно во всех браузерах кроме IE8 Yamasa Events/DOM/Window 6 18.01.2011 07:40
Почему скрипт работает в IE6 и не работает в opera и IE8? msufx Javascript под браузер 6 18.09.2009 18:44