Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

глюк с JS в IE

271
28 декабря 2006 года
MrXaK
721 / / 31.12.2002
имею кусок кода:
 
Код:
function show_edit_news(id)
{
    document.getElementById("news"+id).innerHTML += '<img src="images/progress.gif">Подождите.... Идёт загрузка...';

прекрасно работает в опере... в ие ругается на эту строку и прекращает выполнение сценария дальше...
id вообще это циферки, news1... - это таблица сложной структуры, имеющая вложенные... в опере, повторюсь, всё работает... ие ругается...
13
28 декабря 2006 года
RussianSpy
3.0K / / 04.07.2006
А вы уверены что у вас есть элемент с таким id в документе?

Кстати неплохо было бы увидеть как ругается осел и хоть чуть-чуть остального кода - не очень понятно...

ЗЫ Надеюсь у вас в коде фигурная скобка закрывает данную функцию?
271
28 декабря 2006 года
MrXaK
721 / / 31.12.2002
да есть, в опере ведь работает... и просто так он есть))
ругается следующим образом:
неизвестная ошибка выполнения Source:ссылка на сайт Line:251

251 это как раз document.getElementById("news"+id)...

 
Код:
function edit_news_rep(z)
{
    document.getElementById("news"+z.id).innerHTML = z.text;
}

function show_edit_news(id)
{
    document.getElementById('news'+id).innerHTML += '<img src="images/progress.gif">Подождите.... Идёт загрузка...';
    x_show_edit_news_form(id, edit_news_rep);
}


если 251ю закоментить, то ошибка не появляется, но действие edit_news_rep тоже не выполняется...
13
28 декабря 2006 года
RussianSpy
3.0K / / 04.07.2006
Аха! Вот и подошли мы к самому интересному. Какой движок AJAX юзаем? Sajax судя по всему... А с чего вы решили что вам возвращается объект?
 
Код:
document.getElementById("news"+z.id).innerHTML = z.text;


Попробуйте тоже самое выполнить в ФФ и почитать что он напишет в консоли JavaScript. Так же попробуйте удалить временные файлы в осле и после этого заново попробовать запустить ваш скрипт
271
28 декабря 2006 года
MrXaK
721 / / 31.12.2002
да, sajax
возвращаю массив ибо бэкенд тоже я писал)
в фф скрипт прекрасно работает... точнее с точки зрения дизайна там немного неправильно получается, но вся часть запроса/ответа работает и всё выводится что надо... в консоле ошибки только на всякие свойства css...

в ие не работает те части где у меня в id какие-то параметры... где id статическое, то отрабатывает без ошибок... и с возвращением объектов тоже...
13
28 декабря 2006 года
RussianSpy
3.0K / / 04.07.2006
Очистку кэша осла применили?
271
28 декабря 2006 года
MrXaK
721 / / 31.12.2002
да, всё та же строка 251...
кавычки пробовал менять)
document.getElementById('news'+id)
document.getElementById("news"+id)
тож не помогло
271
28 декабря 2006 года
MrXaK
721 / / 31.12.2002
а ещё обнаружил, правда в другой функции и она нормально выполняется если эту строку закоментить, что ругается вот на это:
 
Код:
document.getElementById("plswait").style = 'display:block';

опять же в опере и фф всё выполняется, объект такой есть...
13
28 декабря 2006 года
RussianSpy
3.0K / / 04.07.2006
Цитата: Mr.Hacker
а ещё обнаружил, правда в другой функции и она нормально выполняется если эту строку закоментить, что ругается вот на это:
 
Код:
document.getElementById("plswait").style = 'display:block';

опять же в опере и фф всё выполняется, объект такой есть...



Правильно ругается. это неверный код. document.getElementById("plswait").style - является объектом а вы ему пытаетесь строку присвоить.
Правильно писать так:

 
Код:
document.getElementById("plswait").style.display = 'block';

если же вам нужно присвоить значение свойству, имя которого по стандартам CSS содержит дефис - тогда нужно использовать большую букву. Вот например:
 
Код:
document.getElementById("plswait").style.backgroundColor = '#000000';
271
28 декабря 2006 года
MrXaK
721 / / 31.12.2002
ага, за это сенкс...
к первой проблеме... обнаружил что если сменить объект в который пишется (у меня был таблица) то всё работает... убрал ид у таблицы, создал сверху div присвоил ему такой id и вся таблица внутри id... заработало))

Upd: точнее заработала та часть что посылает данные... тот скрипт что должен выполняться после получения, не работает почему-то...
13
28 декабря 2006 года
RussianSpy
3.0K / / 04.07.2006
Цитата: Mr.Hacker
ага, за это сенкс...
к первой проблеме... обнаружил что если сменить объект в который пишется (у меня был таблица) то всё работает... убрал ид у таблицы, создал сверху div присвоил ему такой id и вся таблица внутри id... заработало))

Upd: точнее заработала та часть что посылает данные... тот скрипт что должен выполняться после получения, не работает почему-то...



В этом месте поподробнее пожалуйста... Свойство innerHTML вы у какого элемента меняете? у таблицы? то есть у вас написано что-то вроде

 
Код:
<table id="news1"><tr><td></td></tr></table>

А потом вы берете и делаете
 
Код:
document.getElementById('news'+id).innerHTML += '<img src="images/progress.gif">Подождите.... Идёт загрузка...';

?
Я правильно понял?
271
28 декабря 2006 года
MrXaK
721 / / 31.12.2002
да, в неработающем варианте было так...
13
28 декабря 2006 года
RussianSpy
3.0K / / 04.07.2006
Цитата: Mr.Hacker
да, в неработающем варианте было так...



ХЫ! А что же тогда удивляться! Подумайте что вы делаете... Вы в таблицу дописываете тег <img ...>... То есть после вашего присвоения код таблицы получается примерно таким:

 
Код:
<table id="news1">
 <tr>
  <td></td>
 </tr>
 <img src....>bla-bla-bla
</table>

что не есть валидно...
Вывод: лично на мой взгляд гораздо удобнее заранее создать слой куда поместить все это хозяйство а потом просто показывать его и скрывать в зависимости от ситуации...
 
Код:
<div id="loadingMessage" style="z-index:100;visibility:hidden;"></div>

<script>
function show_edit_news(id)
{
    document.getElementById(loadingMessage).style.visibility='visible';
    x_show_edit_news_form(id, edit_news_rep);
}
</script>

и уж в этот слой можно понапихать чего угодно...
271
28 декабря 2006 года
MrXaK
721 / / 31.12.2002
я думал что после первого кода что я дописал допишется после </table>...
я всё равно решил с дописыванием, просто поместив table внутрь div которому уже и присвоил id
21K
03 февраля 2007 года
Клюшин Герман Валерьевич
11 / / 03.02.2007
у меня тот же глюк тока вид сбоку. Самый простейший код - пытаюсь в onclick добавить к таблице строку и таже ошибка:
[HTML]<html><head>
<script language="JavaScript" type="Text/Javascript">
function addline(){
newrow="<tr><td>тест3</td><td><input size='30' type='text' name='val3' value='' /></td><td></td></tr>";
// extract html of last row onclick="return rmline('+count+');"
s=document.getElementById('tablebody').innerHTML;
// updating html of table
s=s+newrow;
document.getElementById('tablebody').innerHTML=s;
return false;
}
</script>
</head>
<body>

<table>
<thead><tr><td>№</td><td>Value</td><td></td></tr></thead>
<tbody id="tablebody">
<tr><td>111</td>
<td><input size="30" name="val1" value="Author1" type="text"></td>
<td>удалить</td></tr>
<tr>
<td>112</td>
<td><input size="30" name="val2" value="Author2" type="text"></td>
<td>удалить</td></tr>
</tbody>
</table>
<a href="#" onclick="return addline();">+ add row</a>
[/HTML]
Вроде бы все правильно, и в FF все работает на 100% (даже никаких варнингов в консоли JS) а в ИЕ - неизвестная ошибка выполнения именно там где сохраняется innerHTML. Отсюда делаю вывод, что это личный глюк мелкомягких
92
03 февраля 2007 года
Тень Пса
2.2K / / 19.10.2006
у меня тот же глюк тока вид сбоку. Самый простейший код - пытаюсь в onclick добавить к таблице строку и таже ошибка:

[COLOR=Red]здесь был код... его убить!!![/COLOR]

Вроде бы все правильно, и в FF все работает на 100% (даже никаких варнингов в консоли JS) а в ИЕ - неизвестная ошибка выполнения именно там где сохраняется innerHTML. Отсюда делаю вывод, что это личный глюк мелкомягких



осспади... :eek: ну кто же через innerHTML добавляет строчки в таблицу... есть же для этого функции........ :p

смотрите здесь http://www.w3schools.com/js/tryit.asp?filename=try_dom_table_insertrow

ну только вам как я понял надо вставить не в начало а в конец, для этого - берём table по id и у него получается замечательное свойство rows[].... вот его count-1 и будет нужный вам индекс )) ну да это элементарно ))) (я про индекс) :)

PS: и вообще ))) w3schools.com рулит иногда )))) особо когда надо чётко и сразу пример или свойство какое-нить псматреть. Советую заглядывать иногда ;)

21K
04 февраля 2007 года
Клюшин Герман Валерьевич
11 / / 03.02.2007
Я уже нашел :)
Хотя, в настоящем программировании всегда есть несколько вариантов решения. Опять таки если есть св-во innerHTML и оно доступно по записи, то оно ДОЛЖНО работать. Всегда так с этим javascript то что должно работать не работает, но зато всегда есть какаянибудь хитроумная функция для этого, которую хрен найдешь. Вообще зачем надо делать функцию "insertrow" если есть уже insertBefore, appendChild, Clone и т.д.? Дет сад какой то, куча функций у каждого обьекта, зато работает всегда только одна.

Если кому пригодится вот решение:

Код:
//нахождение предка по имени tag
function findParentByTagName(el,tagName){
 tagName=tagName.toLowerCase();
 while (el=el.parentNode)
    if(el.tagName&&el.tagName.toLowerCase()==tagName) return el;
 return false;
}
//если кому надо - функция черезстрочной разукраски таблицы
//в сss опишите класс odd для четных строк
function oddClass(el){
  var i=0;
  for (var i_tem = 0; i_tem < el.rows.length; i_tem++)
    if(i_tem%2==0)
      for (i = 0; i < el.rows[i_tem].cells.length; i++)
        el.rows[i_tem].cells.className='odd';
    else
      for (i = 0; i < el.rows[i_tem].cells.length; i++)
        el.rows[i_tem].cells.className='';
}
//соб-сно вставка в конец таблицы новой строки(предпоследней)
function addline(el){
 var tel=findParentByTagName(el,'table');
 if(tel==false) return alert('Не найдена таблица');
 var l=tel.rows.length;
 var newRow=tel.rows[l-2].cloneNode(true);
 var inputel=newRow.cells[1].getElementsByTagName('input')[0];
 tel.rows[l-1].parentNode.insertBefore(newRow,tel.rows[l-1]);
 newid--;
 newRow.cells[0].innerHTML=newid;
 inputel.name='value['+newid+']';
 inputel.value='';
 oddClass(tel);
 return false;
}
//удаление строки
function rmline(el){
 el=findParentByTagName(el,'tr');
 var tel=findParentByTagName(el,'table');
 if (el.parentNode.rows.length<2) return false;
 el.parentNode.removeChild(el);
 oddClass(tel);
 return false;
}

для использования ссылки на удаление строки должны быть в одной из ячеек строки <a href="#" onclick="rmline(this)>удалить</a>"
для добавления <a href="#" onclick="addline(this)>добавить строку</a>"
(опять таки ссылку поместить внутри таблицы)
92
04 февраля 2007 года
Тень Пса
2.2K / / 19.10.2006
тож вариант, ну а если не внутри таблицы, то нужно все getElementsByTagName заменить на getElementById.... у это уже кто на что горазд :D
12
05 февраля 2007 года
alekciy
3.0K / / 13.12.2005
Вообще зачем надо делать функцию "insertrow" если есть уже insertBefore, appendChild, Clone и т.д.? Дет сад какой то, куча функций у каждого обьекта, зато работает всегда только одна.


А потому, что JS работает с DOM моделью документа на разных уровнях (DOM Level). Соответсвенно схожих результатов можно достить различными функциями. В других языках как правило такого нет: одно определенное действие или результат - одна функция.
Положение еще усугубляется тем, что в JS браузеры DOM спецу поддерживают по разному. Сильнее всех тут конечно "отличился" гребаный осел от мелкомягких.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог