Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Ошибка в innerHTML таблицы в IE (https://javascript.ru/forum/css-html-internet-explorer/26166-oshibka-v-innerhtml-tablicy-v-ie.html)

seregarem 28.02.2012 18:53

Ошибка в innerHTML таблицы в IE
 
Динамически подгружается содержимое таблицы
var request = null;
function createRequest() {
try { request = new XMLHttpRequest(); }
catch (trymicrosoft) {
	try { request = new ActiveXObject("Msxml2.XMLHTTP"); }
	catch (othermicrosoft) {
		try { request = new ActiveXObject("Microsoft.XMLHTTP"); }
		catch (failed) { request = null; }
	}
}
if (request == null) alert("Ошибка при создании объекта XMLHttpRequest!");
}

function getKiosk(id, tp, p, city) {
url = "../php/getkiosk.php?p=" + id + "&tp=" +tp + "&p1=" + p + "&city=" + encodeURIComponent(city);
createRequest();
request.open("GET", url, true);
request.onreadystatechange = function() { makeKiosk(tp,p); };
request.send(null);
}

function makeKiosk(tp,p) {
if (request.readyState == 4) {
    if (request.status == 200) {
        xmlDoc = request.responseXML.documentElement;
        action = xmlDoc.getElementsByTagName("action")[0].firstChild.data;
		kiosk = xmlDoc.getElementsByTagName("kiosk")[0].firstChild.data;
		pages = xmlDoc.getElementsByTagName("pages")[0].firstChild.data;

        if (action == 'ok') {
			document.getElementById(tp).innerHTML = kiosk;
			document.getElementById(p).innerHTML = pages;
			$("a.fancybox").fancybox({
				'transitionIn'	: 'elastic',
				'transitionOut'	: 'elastic'
			});
        } else document.getElementById(tp).value = "";
    } else alert("Не удалось получить данные от сервера:\n" + request.statusText);
  }
}


$con = mysql_connect($host, $login, $pwd_db);
if (!$con) { die('Could not connect: ' . mysql_error()); }
mysql_select_db($db, $con);
mysql_query('SET NAMES utf8;');


$c=$_GET[p];
$tp=$_GET[tp];
$p1=$_GET[p1];
$city=$_GET[city];

$d=$c*5;
$sql = "SELECT cms_module_products.id AS id, product_name, details, sku
FROM cms_module_products, cms_module_products_categories, cms_module_products_product_categories
WHERE cms_module_products.id=cms_module_products_product_categories.product_id AND cms_module_products_categories.id=cms_module_products_product_categories.category_id AND
name='$city' LIMIT ".$d.", 5";

$result=mysql_query($sql);

$res = '<![CDATA[';

$res.="<tr>
<th class=\"table_header\" width=\"70\">№</th> <th class=\"table_header\" width=\"160\"> </th> <th class=\"table_header\" width=\"160\">Адрес</th> <th class=\"table_header\" width=\"160\">Стороны <img style=\"vertical-align: middle; margin-left: 20px;\" src=\"images/side.png\" alt=\"\" /></th> <th class=\"table_header\" width=\"390\">Информация</th>
</tr>";


while ($row=mysql_fetch_array($result)){
	$img1=''; $img2=''; $img3=''; $img4='';
	$sql_img = "SELECT fielddef_id, value FROM cms_module_products_fieldvals WHERE product_id=$row[id]";

	$result_img=mysql_query($sql_img);
	while ($img=mysql_fetch_array($result_img)){
		switch ($img[fielddef_id]) {
		case 1:
			$img1='/uploads/Products/product_'.$row[id]."/".$img[value];
			$thumb1='/uploads/Products/product_'.$row[id]."/thumb_".$img[value];
			break;
		case 2:
			$img2='/uploads/Products/product_'.$row[id]."/".$img[value];
			$thumb2='/uploads/Products/product_'.$row[id]."/thumb_".$img[value];
			break;
		case 3:
			$img3='/uploads/Products/product_'.$row[id]."/".$img[value];
			$thumb3='/uploads/Products/product_'.$row[id]."/thumb_".$img[value];
			break;
		case 4:
			$img4='/uploads/Products/product_'.$row[id]."/".$img[value];
			$thumb4='/uploads/Products/product_'.$row[id]."/thumb_".$img[value];
			break;
		}

	}

	$res.="<tr>";
	$res.="<td width=\"70\" class=\"table_num1\"><span class=\"num_kiosk\">$row[sku]</span></td>";
	$res.="<td width=\"160\" class=\"table_l1\">";


	if ($img1!='') {$res.="<img src=\"".$thumb1."\" class=\"thumb\" />";
	} elseif ($img2!='') {$res.="<img src=\"".$thumb2."\" class=\"thumb\" />";
	} elseif ($img3!='') {$res.="<img src=\"".$thumb3."\" class=\"thumb\" />";
	}elseif ($img4!='') {$res.="<img src=\"".$thumb4."\" class=\"thumb\" />";
	}else{$res.="<img src=\"images/side_temp.png\" class=\"thumb\" />";
	}

	$res.="</td>";
	$res.="<td width=\"160\" class=\"table_l1\">$row[product_name]</td>";
	$res.="<td width=\"160\" class=\"table_l1\">";

if($img1!=''){ $res.="<a class=\"fancybox\" href=\"$img1\"><img alt=\"\" src=\"images/side_a_active.png\" /></a>";}
else { $res.="<img src=\"images/side_a.png\" />";}

if($img2!=''){ $res.="<a class=\"fancybox\" href=\"$img2\"><img alt=\"\" src=\"images/side_b_active.png\" /></a>";}
else { $res.="<img src=\"images/side_b.png\" />";}

if($img3!=''){ $res.="<a class=\"fancybox\" href=\"$img3\"><img alt=\"\" src=\"images/side_c_active.png\" /></a>";}
else { $res.="<img src=\"images/side_c.png\" />";}

if($img4!=''){ $res.="<a class=\"fancybox\" href=\"$img4\"><img alt=\"\" src=\"images/side_d_active.png\" /></a>";}
else { $res.="<img src=\"images/side_d.png\" />";}

$res.="<br /><br /><p style=\"color: #b80000;\"><strong>просмотр фото</strong></p>";

$res.="</td>";
$res.="<td width=\"390\" class=\"table_l1\">$row[details]</td>";
$res.="</tr>";
}
$res.=']]>';


$sql = "SELECT count(*)
FROM cms_module_products, cms_module_products_categories, cms_module_products_product_categories
WHERE cms_module_products.id=cms_module_products_product_categories.product_id AND cms_module_products_categories.id=cms_module_products_product_categories.category_id AND
name='$city'";

$result=mysql_query($sql);
$row=mysql_fetch_array($result);
$num=$row[0];
$q=$row[0]/5;
$row[0]=floor($row[0]/5);

$pages = '<![CDATA[';
$pages.="<div class=\"total_kiosk\"><p>Всего ".$num." киосков</p></div>";
$pages.="<div class=\"links_kiosk\">";

if($c-2>=0){ $i=$c-2; } else $i=0;

if($c+2<=$row[0]){ $m=$c+2; } else $m=$row[0];

$pages.="<div class=\"first_btn_address\" onclick=\"getKiosk(0,'$tp','$p1','$city');\"><p>‹‹ ‹‹</p></div>";

if($c>0){
$pages.="<div class=\"btn_address\" onclick=\"getKiosk(".($c-1).",'$tp','$p1','$city');\"><p>‹‹</p></div>";
}
else {
$pages.="<div class=\"btn_address\" onclick=\"getKiosk(0,'$tp','$p1','$city');\"><p>‹‹</p></div>";
}

while ($i<=$m){
$j=$i+1;
if($c==$i){
$pages.="<div class=\"btn_address_active\"><p id=\"activepage\">$j</p></div>";
$cur_page=$i;
}else {
  $pages.="<div class=\"btn_address\" onclick=\"getKiosk($i,'$tp','$p1','$city');\"><p>$j</p></div>";
}
$i++;
}

$pages.="<div class=\"btn_address\" onclick=\"getKiosk(".($cur_page+1).",'$tp','$p1','$city');\"><p>››</p></div>";
$pages.="<div class=\"first_btn_address\" onclick=\"getKiosk($row[0],'$tp','$p1','$city');\"><p>›› ››</p></div>";

$pages.="</div>";
$pages.=']]>';

mysql_close($con);

$response = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><response><action>ok</action><kiosk>'.htmlspecialchars_decode($res).'</kiosk><pages>'.htmlspecialchars_decode($pages).'</pages></response>'; 
header('Content-Type: application/xml');
echo $response;


На строке document.getElementById(tp).innerHTML = kiosk; возникает ошибка: Неизвестная ошибка выполнения.

В инете нашел, что innerHTML в таблицах в IE не работает, пишут, что только через DOM. Как я понял, через DOM можно создавать только элемент таблицы. А у меня php-скрипт формирует полностью содержимое table. Возможно ли как-то без innerHTML присвоить таблице полностью все содержимое, например,
<tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>


Вот на этой странице ошибка: http://marketmedia-kirov.ru/index.php?page=portfolio

Nekromancer 28.02.2012 18:54

tbody

seregarem 28.02.2012 19:15

добавил tbody:
$res.="<tbody><tr>
<th class=\"table_header\" width=\"70\">№</th> <th class=\"table_header\" width=\"160\"> </th> <th class=\"table_header\" width=\"160\">Адрес</th> <th class=\"table_header\" width=\"160\">Стороны <img style=\"vertical-align: middle; margin-left: 20px;\" src=\"images/side.png\" alt=\"\" /></th> <th class=\"table_header\" width=\"390\">Информация</th>
</tr>";
...
$res.='</tbody>';


Но не помогло

рони 28.02.2012 19:17

Цитата:

Сообщение от seregarem
Возможно ли как-то без innerHTML присвоить таблице полностью все содержимое

рад что вы исправили запрос на сервер )))
погуглите ещё даже на этом сайте есть примеры по вставке содержимого таблицы без innerHTML

Nekromancer 28.02.2012 19:54

seregarem,
в таблице всегда есть tbody, в него вставляйте.

рони 28.02.2012 20:09

Цитата:

Сообщение от Nekromancer
в таблице всегда есть tbody, в него вставляйте.

можно пример?

allergencore 28.02.2012 21:05

Цитата:

Сообщение от Nekromancer (Сообщение 160469)
seregarem,
в таблице всегда есть tbody, в него вставляйте.

открываем opera dragonfly и страницу
<table>
<tr>
<td>r1c1</td>
<td>r1c2</td>
</tr>
...
</table>

в итоге во вкладке "документы" получаем
<table>
<thead>
...
</thead>
<tbody>
</tbody>
...
</table>

seregarem 28.02.2012 21:36

allergencore, не понял ваш пост.

рони 28.02.2012 21:45

seregarem, ам!
function makeKiosk(tp, p) {
    if (request.readyState == 4) if (request.status == 200) {
        xmlDoc = request.responseXML.documentElement;
        action = xmlDoc.getElementsByTagName("action")[0].firstChild.data;
        kiosk = xmlDoc.getElementsByTagName("kiosk")[0].firstChild.data;
        pages = xmlDoc.getElementsByTagName("pages")[0].firstChild.data;
        var tk = document.getElementById(tp);
        while (tk.firstChild) tk.removeChild(tk.firstChild);
        if (action == "ok") {
            var el = document.createElement("div");
            el.innerHTML = "<table >" + kiosk + "</table>";
            while (el.firstChild.rows[0]) tk.appendChild(el.firstChild.rows[0]);
            document.getElementById(p).innerHTML = pages;
            $("a.fancybox").fancybox({
                "transitionIn": "elastic",
                "transitionOut": "elastic"
            })
        }
    } else alert("Не удалось получить данные от сервера:\n" + request.statusText)
};

и выкиньте $res = '<![CDATA[';
$pages.=']]>';

allergencore 28.02.2012 22:02

Цитата:

Сообщение от seregarem (Сообщение 160491)
allergencore, не понял ваш пост.

я имел ввиду, что при интерпретации html элемент tbody генерируется всегда

seregarem 28.02.2012 22:05

рони,
Спасиба, дружище!!! Без $res = '<![CDATA['; $pages.=']]>'; не работает...

рони 28.02.2012 23:40

seregarem, если интересует работа не только в ие 8 но и ие7 и ие6 )))
более корректный вариант
function makeKiosk(tp, p) {
    if (request.readyState == 4) if (request.status == 200) {
        xmlDoc = request.responseXML.documentElement;
        action = xmlDoc.getElementsByTagName("action")[0].firstChild.data;
        kiosk = xmlDoc.getElementsByTagName("kiosk")[0].firstChild.data;
        pages = xmlDoc.getElementsByTagName("pages")[0].firstChild.data;
        var tk = document.getElementById(tp);
        while (tk.firstChild) tk.removeChild(tk.firstChild);
        if (action == "ok") {
            var el = document.createElement("div");
            el.innerHTML = "<table >" + kiosk + "</table>";
            var tbody = document.createElement("tbody");
            tk.appendChild(tbody);
            while (el.firstChild.rows[0]) tbody.appendChild(el.firstChild.rows[0]);
            document.getElementById(p).innerHTML = pages;
            $("a.fancybox").fancybox({
                "transitionIn": "elastic",
                "transitionOut": "elastic"
            })
        }
    } else alert("Не удалось получить данные от сервера:\n" + request.statusText)
};

seregarem 29.02.2012 09:33

Спасиба огромное! Не знаете, почему без <![CDATA не работает?

рони 29.02.2012 12:17

seregarem,
Цитата:

Сообщение от seregarem
почему без <![CDATA не работает?

удалить надо было во всех местах а не только 2 и смотреть надо вживую, а на контакт вы не идёте )))

seregarem 29.02.2012 14:38

удалял везде

рони 29.02.2012 15:19

seregarem,
раз и так работает давайте закроем тему или обратитесь в раздел работа

smirnov-mn 14.03.2012 22:21

у меня была такая же проблема. все решилось тем что с помощью дома. createelement setattribute и т.д. создавал все теги.


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