Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.01.2011, 14:52
Интересующийся
Отправить личное сообщение для SARD Посмотреть профиль Найти все сообщения от SARD
 
Регистрация: 28.01.2011
Сообщений: 23

Не работает JavaScript, подгруженный Ajax
Здравствуйте.
Активно осваиваю Ajax на одном проекте. Столкнулся со следующей проблемой: не работает JavaScript-код, подгруженный в div.
Код вызова Ajax:

var xmlhttp;

function getXmlHttp(){
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {
			xmlhttp = false;
		}
	}
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}

function AddAjax(url,div) {
	var req = getXmlHttp()
	req.onreadystatechange = function() {
	if (req.readyState == 4) {
		if(req.status == 200) {
			document.getElementById(div).innerHTML=req.responseText;
		else {document.getElementById(div).innerHTML = req.statusText}
		}
	}
	req.open('POST', url, true);
	req.send(null);
}

Код страницы:
<div id="TypesByView">
	<span class="href" onClick="AddAjax('/includes/edit.asp','TypesByView')">[добавить]</span>
</div>

А теперь самое интересное: код страницы '/includes/edit.asp'.
Вот так - все работает:
<span class="href" onClick="window.alert('111')">клик</span>

А вот так - нифига:
<script language="JavaScript">
	window.alert('111');
</script>

А мне нужно, чтобы после того, как страница выполнит какие-то действия и загрузится, автоматически сработал JavaScript-код. Именно автоматически при загрузке, а не по onClick.
Any ideas?

Добавлю: при загрузке второй страницы (той, где не по onClick) - никаких сообщений об ошибках. Просто тишина, и все.

Последний раз редактировалось SARD, 28.01.2011 в 15:11.
Ответить с цитированием
  #2 (permalink)  
Старый 01.02.2011, 10:29
Интересующийся
Отправить личное сообщение для SARD Посмотреть профиль Найти все сообщения от SARD
 
Регистрация: 28.01.2011
Сообщений: 23

Так, проблема найдена - Ajax возвращает текстовую строку, и теги <script> таким макаром выполняться не будут.
В коде вызова Ajax строку #24 меняем на вот такой код:
var x = req.responseText;
scripts = x.getElementsByTag("script");
var y = document.createElement ('script');
y.defer = true;
y.text = x;
document.body.appendChild (y);

И код страницы '/includes/edit.asp':
Код:
window.alert("111");
Что у нас происходит? А происходит вот что: на странице вызова создается тег <script>, и в него запихивается весь текст вызываемой аяксом страницы '/includes/edit.asp'. Дается разрешение на выполнение, и мы видим алерт "111".
Но есть проблема: страница '/includes/edit.asp' создается динамически, и напихано в нее может быть всего, что угодно.
Соответственно, надо: проверить ответ req.responseText на нахождение в нем тегов <script>, выдрать их и запихнуть в вызывающую страницу, а все остальное - загрузить в нужный div.
Проблема в том, что если я сделаю так:
var x = req.responseText;
scripts = x.getElementsByTagName("script");

то я получаю ошибку "Объект не поддерживает это свойство или метод".
Хоть в этом вопросе подскажите, пожалста -)
Ответить с цитированием
  #3 (permalink)  
Старый 03.02.2011, 15:31
Новичок на форуме
Отправить личное сообщение для elw00d Посмотреть профиль Найти все сообщения от elw00d
 
Регистрация: 03.02.2011
Сообщений: 2

Наверное, у строки нет метода getElementsByTagName(), он есть у элемента разметки. Можно попробовать сначала присвоить innerHTML'у какого-либо элемента вашу строку (чтобы браузер распарсил), а потом уже через этот элемент получить getElementsByTagName().
Ответить с цитированием
  #4 (permalink)  
Старый 03.02.2011, 15:56
Интересующийся
Отправить личное сообщение для SARD Посмотреть профиль Найти все сообщения от SARD
 
Регистрация: 28.01.2011
Сообщений: 23

Я этот код победил уже, но все равно спасибо за ответ.
Победил так:
function AddJava(div,resp) {
var JSc='';
var el = document.getElementById(div);
var items=el.getElementsByTagName("script");  
for(var i=0; i<items.length; i++){
	JSc=JSc+items[i].text;
	}
var y = document.createElement ('script');
y.defer = true;
y.text = JSc;
document.body.appendChild (y);
}


Один минус: если resp начинается сразу со <script>, то этот скрипт не выдирается. Но это не критично.
Ответить с цитированием
  #5 (permalink)  
Старый 03.02.2011, 16:09
Новичок на форуме
Отправить личное сообщение для elw00d Посмотреть профиль Найти все сообщения от elw00d
 
Регистрация: 03.02.2011
Сообщений: 2

Ага, у меня практически то же самое. Только мне кажется, что у вас пропущен кусочек, который присваивает getElementById(div).innerHTML = resp;
Ответить с цитированием
  #6 (permalink)  
Старый 03.02.2011, 16:40
Интересующийся
Отправить личное сообщение для SARD Посмотреть профиль Найти все сообщения от SARD
 
Регистрация: 28.01.2011
Сообщений: 23

Дело в том, что этому диву уже присвоен innerHTML. В функции AddAjax из листинга в первом сообщении после строки 24 добавилась такая: AddJava(div,req.responseText)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
Не работает jQuery меню с AJAX eugene1986 jQuery 0 08.07.2010 18:49
ajax запросы, работает на одних компах и не работает на других vtornik23 AJAX и COMET 2 22.03.2010 18:22
Safari + ajax некорректно работает, а в других работает demi AJAX и COMET 35 15.07.2009 14:11