Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   не работает метод load(); в DOM (https://javascript.ru/forum/events/45992-ne-rabotaet-metod-load-%3B-v-dom.html)

Антон C 23.03.2014 22:41

не работает метод load(); в DOM
 
Всем привет, захотел с помощью DOM взять данные из XML и передать их на HTML страницу, данный метод сработал в Мозиле и IE, и не сработал в Хроме и Опере.

XML файл (1.xml):

<?xml version="1.0" encoding="utf-8"?>
<bulletinboard>
	<article>
		<title>FFFFFF</title>
		<detail>DDDDD</detail>
		<date>IIIIII</date>
	</article>
</bulletinboard>


HTML страница c DOM (2.html):

<html>
	<head>
		<meta charset="utf-8"/>
	</head>
	<body>
	<script type="text/javascript"> 
		function loadXMLDoc(dname) 
		{
			try
  			{
  			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");	
			}
			catch(e)	
			{
  				try 
    				{
xmlDoc=document.implementation.createDocument("","",null);
    				}
  				catch(e) {alert(e.message)}
  			}
			try 
  			{xmlDoc
 				xmlDoc.async=false;
  				xmlDoc.load(dname);
  				return(xmlDoc);
  			}
			catch(e) {alert(e.message)}
			return(null);
		}
		xmlDoc=loadXMLDoc("./1.xml");
		var x=xmlDoc.getElementsByTagName("title");
		var y=xmlDoc.getElementsByTagName("detail");
		var z=xmlDoc.getElementsByTagName("date");

		for (i=0;i<x.length;i++)
  		{ 
 			document.write(x[i].childNodes[0].nodeValue); 
  			document.write(y[i].childNodes[0].nodeValue);
  			document.write(z[i].childNodes[0].nodeValue);
  		}
	</script>
	</body>
</html>


Надеюсь что всё правильно оформил для темы.

Подскажите пожалуйста, как запустить это в браузерах Хром и Опера

рони 23.03.2014 23:15

Антон C,
http://learn.javascript.ru/ajax-xmlh...и-responsexml

http://yapro.ru/web-master/javascrip...xml-fayla.html

Антон C 23.03.2014 23:25

Да, спасибо за ссылки данный метод мне известен, но он работает только с localhost, я же хотел обойтись без него.

рони 23.03.2014 23:46

Цитата:

Сообщение от Антон C
Да, спасибо за ссылки данный метод мне известен, но он работает только с localhost, я же хотел обойтись без него.

непонял что вы написали ...

то есть такое http://learn.javascript.ru/play/SjVTTb вам неподходит?

Антон C 24.03.2014 01:13

Метод, что вы предлагаете мне не подходит, он подразумевает использование локального сервера, я бы хотел такой метод где не надо создавать сервер, а можно просто запустить страницы с жесткого диска

рони 24.03.2014 01:47

Антон C,
а JSON?

Антон C 24.03.2014 02:01

Тоже нет к сожалению, он тоже использует метод responseText, а он ждет ответа от браузера, и если вызвать не через локальный сервер браузер ставит защиту от чтения данных ((((, все браузеры кроме Мозилы.
Мне советовали сделать через load вместо responseText, но load выдаёт непонятную ошибку, которую я не знаю как исправить

рони 24.03.2014 02:07

Антон C, а так? :write:
<!DOCTYPE HTML>

<html>

<head>

  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  #example-1{
    text-align: center;
    cursor: pointer;
  }

  </style>
  <link rel="stylesheet" type="text/css" href="style.css"/>
</head>

<body>



<div class="example cursor" id="example-1">Click to update</div>
<script>
function loadElement(url, callback) {
    var request = new XMLHttpRequest();
    try{
    request.open('GET', url);
    request.send(null);
    request.onreadystatechange = function() {
        if (this.readyState == 4)
            callback(this.responseXML);
    };
  } catch(e) {
    request = new ActiveXObject("Microsoft.XMLDOM");
    request.load(url);
    callback(request)
  }


}
var div =  document.getElementById('example-1');
div.onclick = function ()
{
  loadElement('./1.xml', function(xmlDoc) {
  var x=xmlDoc.getElementsByTagName("title");
		var y=xmlDoc.getElementsByTagName("detail");
		var z=xmlDoc.getElementsByTagName("date");
var html = ''
		for (i=0;i<x.length;i++)
  		{
 			html +=x[i].childNodes[0].nodeValue;
  			html +=y[i].childNodes[0].nodeValue;
  			html +=z[i].childNodes[0].nodeValue;
  		}
  div.innerHTML =  html
})
}
;
</script>

</body>

</html>

Антон C 24.03.2014 02:14

responseXML Опять же ,не уверен точно ли этот метод мешает браузеру но Опера и Хром без локального сервера не открывают данные, хотя в мозиле все работает , но в мозиле работали и все предыдущие методы

response вроде требует синхронного ответ браузера, поэтому без сервера он не работает

Антон C 24.03.2014 02:15

похоже без локального сервера не обойтись(((

danik.js 24.03.2014 02:47

Внедряй нужные данные прямо на страницу. Или тебе прям кровь из носу нужен отдельный файл?
Хром по умолчанию не разрешает XMLHttpRequest запросы к файловой системе. Для разрешения нужно его (браузер) запустить с определенным флагом.

Антон C 24.03.2014 08:45

Да, мне обязательно нужно в XML файле

Артем Левин 31.03.2014 08:16

Попробуйте использовать либу JQUERY. http://habrahabr.ru/post/42426/

danik.js 31.03.2014 13:20

Артем Левин, и чем она тут поможет?

То есть
nativeFunction()  // не работает


Но если
function wrapper() {
    nativeFunction(); // вдруг с чего-то начнет работать?
}

wrapper()


Какой в этом смысл?

Blacksmouker 08.04.2014 20:07

Чтобы не плодить темы присоединюсь к этой. Да и задача похожа.
Подскажите, как решить подобную задачу если файл не один.
Пробовал вместо наименования подставить регулярное выражение - он не видит его - приходи null.

danik.js 08.04.2014 20:23

Blacksmouker, где код. куда ты подставил регулярку. В чем заключается сходство твоей задачи?

Цитата:

Сообщение от Blacksmouker
приходи null

Хорошо, я ему передам, что ты его звал.

Blacksmouker 09.04.2014 09:58

Цитата:

Сообщение от danik.js (Сообщение 306799)
Blacksmouker, где код. куда ты подставил регулярку. В чем заключается сходство твоей задачи?

У меня есть массив файлов xml. Файлы маленькие от 3 до 30 кб каждый, но их много - от десятка, до сотни за раз (точное количество заранее неизвестно). Каждый имеет наименование 7-ми значный цифровой код.

Напрашивался парсер на php, но по техническим причинам необходимо это дело выполнить локально, без запросов к серверу прямо на машине клиента.

От Xml в данном случае тоже не уйти - данные приходят именно в этом формате.


<html>
	<head>
		<meta charset="utf-8"/>
	</head>
	<body>
	<script type="text/javascript"> 
		function loadXMLDoc(dname) 
		{
			try
  			{
  			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");	
			}
			catch(e)	
			{
  				try 
    				{
			xmlDoc=document.implementation.createDocument("","",null);
    				}
  				catch(e) {alert(e.message)}
  			}
			try 
  			{xmlDoc
 				xmlDoc.async=false;
  				xmlDoc.load(dname);
  				return(xmlDoc);
  			}
			catch(e) {alert(e.message)}
			return(null);
		}
		
		var file_name = /\d{7}.xml/g;
		xmlDoc=loadXMLDoc(file_name);
		
		
		document.write('<table class="warning" border="2px" bgcolor="silver">');
			document.write('<tr align="center" bgcolor="gray">');
				document.write('<td>Дата события</td>');
				document.write('<td>Полное наименование</td>');
				document.write('<td>Заголовок</td>');
				
			
			document.write('</tr>');
			
			
			for (i=0; i<xmlDoc.length; i++){
			
			document.write('<tr>');
				
				
				var x=xmlDoc.getElementsByTagName("EVENT_DATE");
				var y=xmlDoc.getElementsByTagName("FULL_NAME_RUS");
				var z=xmlDoc.getElementsByTagName("EVENT_HEADER");

			
				document.write('<td>' + x[i].childNodes[0].nodeValue + '</td>'); 
				document.write('<td>' + y[i].childNodes[0].nodeValue + '</td>');
				document.write('<td>' + z[i].childNodes[0].nodeValue + '</td>');
			
			document.write('<tr>');
			
			}
		document.write('</table>');
  		
	</script>
	</body>
</html>

danik.js 09.04.2014 13:33

Регулярка тут явно не поможет. Если в IE есть возможность получить список файлов из папки - то это то, что нужно. Не спец по ActiveX, так что на этом моя помощь заканчивается.


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