глюк с JS в IE
{
document.getElementById("news"+id).innerHTML += '<img src="images/progress.gif">Подождите.... Идёт загрузка...';
прекрасно работает в опере... в ие ругается на эту строку и прекращает выполнение сценария дальше...
id вообще это циферки, news1... - это таблица сложной структуры, имеющая вложенные... в опере, повторюсь, всё работает... ие ругается...
Кстати неплохо было бы увидеть как ругается осел и хоть чуть-чуть остального кода - не очень понятно...
ЗЫ Надеюсь у вас в коде фигурная скобка закрывает данную функцию?
ругается следующим образом:
неизвестная ошибка выполнения Source:ссылка на сайт Line:251
251 это как раз document.getElementById("news"+id)...
{
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 тоже не выполняется...
Попробуйте тоже самое выполнить в ФФ и почитать что он напишет в консоли JavaScript. Так же попробуйте удалить временные файлы в осле и после этого заново попробовать запустить ваш скрипт
возвращаю массив ибо бэкенд тоже я писал)
в фф скрипт прекрасно работает... точнее с точки зрения дизайна там немного неправильно получается, но вся часть запроса/ответа работает и всё выводится что надо... в консоле ошибки только на всякие свойства css...
в ие не работает те части где у меня в id какие-то параметры... где id статическое, то отрабатывает без ошибок... и с возвращением объектов тоже...
кавычки пробовал менять)
document.getElementById('news'+id)
document.getElementById("news"+id)
тож не помогло
опять же в опере и фф всё выполняется, объект такой есть...
опять же в опере и фф всё выполняется, объект такой есть...
Правильно ругается. это неверный код. document.getElementById("plswait").style - является объектом а вы ему пытаетесь строку присвоить.
Правильно писать так:
если же вам нужно присвоить значение свойству, имя которого по стандартам CSS содержит дефис - тогда нужно использовать большую букву. Вот например:
к первой проблеме... обнаружил что если сменить объект в который пишется (у меня был таблица) то всё работает... убрал ид у таблицы, создал сверху div присвоил ему такой id и вся таблица внутри id... заработало))
Upd: точнее заработала та часть что посылает данные... тот скрипт что должен выполняться после получения, не работает почему-то...
к первой проблеме... обнаружил что если сменить объект в который пишется (у меня был таблица) то всё работает... убрал ид у таблицы, создал сверху div присвоил ему такой id и вся таблица внутри id... заработало))
Upd: точнее заработала та часть что посылает данные... тот скрипт что должен выполняться после получения, не работает почему-то...
В этом месте поподробнее пожалуйста... Свойство innerHTML вы у какого элемента меняете? у таблицы? то есть у вас написано что-то вроде
А потом вы берете и делаете
?
Я правильно понял?
ХЫ! А что же тогда удивляться! Подумайте что вы делаете... Вы в таблицу дописываете тег <img ...>... То есть после вашего присвоения код таблицы получается примерно таким:
<tr>
<td></td>
</tr>
<img src....>bla-bla-bla
</table>
что не есть валидно...
Вывод: лично на мой взгляд гораздо удобнее заранее создать слой куда поместить все это хозяйство а потом просто показывать его и скрывать в зависимости от ситуации...
<script>
function show_edit_news(id)
{
document.getElementById(loadingMessage).style.visibility='visible';
x_show_edit_news_form(id, edit_news_rep);
}
</script>
и уж в этот слой можно понапихать чего угодно...
я всё равно решил с дописыванием, просто поместив table внутрь div которому уже и присвоил id
[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. Отсюда делаю вывод, что это личный глюк мелкомягких
[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 рулит иногда )))) особо когда надо чётко и сразу пример или свойство какое-нить псматреть. Советую заглядывать иногда ;)
Хотя, в настоящем программировании всегда есть несколько вариантов решения. Опять таки если есть св-во innerHTML и оно доступно по записи, то оно ДОЛЖНО работать. Всегда так с этим javascript то что должно работать не работает, но зато всегда есть какаянибудь хитроумная функция для этого, которую хрен найдешь. Вообще зачем надо делать функцию "insertrow" если есть уже insertBefore, appendChild, Clone и т.д.? Дет сад какой то, куча функций у каждого обьекта, зато работает всегда только одна.
Если кому пригодится вот решение:
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>"
(опять таки ссылку поместить внутри таблицы)
А потому, что JS работает с DOM моделью документа на разных уровнях (DOM Level). Соответсвенно схожих результатов можно достить различными функциями. В других языках как правило такого нет: одно определенное действие или результат - одна функция.
Положение еще усугубляется тем, что в JS браузеры DOM спецу поддерживают по разному. Сильнее всех тут конечно "отличился" гребаный осел от мелкомягких.