Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите разобраться (https://javascript.ru/forum/misc/4640-pomogite-razobratsya.html)

maxsoftware 10.08.2009 15:16

Помогите разобраться
 
Здравствуйте!
Написал Ajax приложение для поиска улиц.
_http://test.***.ru/streets.html
До вывода списка найденных улиц функция past_street(); работает успешно (заменяет значение в поле формы), но после того как появляется <select> при нажатии на "вставить" или на значение в выпадающем списке ничего не происходит. В чём может быть проблема?

Андрей Параничев 10.08.2009 23:08

Во-первых, как сделать, чтоб появился select?
Во-вторых, лучше работайте с DOM методами, а не получением элементов из свойств объектов:
function past_street(street) {
	  document.getElementsByName('street')[0].value=street;
}

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("Error creating request object!");
   }

   function send() {
       createRequest();
       street = document.getElementsByName('street')[0].value;
       if(street.length > 3) {
           var url = "streets.php?street=" + street;
           request.open("GET", url, true);
           request.onreadystatechange = update;
           request.send(null);
       }
   }

   function update() {
      if(request.readyState == 4) {
        if(request.status == 200) {
           var response_div = document.getElementById("response");
		   response_div.innerHTML = request.responseText;

        } else alert("Error! Request status is " + request.status);
      }
   }

maxsoftware 11.08.2009 11:26

Спасибо большое, помогло!
function past_street(street) {
      document.getElementsByName('street')[0].value=street;
}

Select генерируется с помощью PHP.

x-yuri 14.08.2009 10:18

telepat mode: возможно, после добавления чего-либо в dom нужно повторно назначить обработчик

B~Vladi 14.08.2009 10:57

Цитата:

Сообщение от x-yuri
telepat mode

:D

maxsoftware 14.08.2009 10:58

В IE вообще ничего не работает, вот пример _http://www.italii.ru/catalogue/
При вводе слова в форму например "max" появляются подсказки, всё работает в Opere и Firefox, но в IE нет. Что только не делал. В чём проблема?

function past_result(search) {
      if(navigator.appName == "Microsoft Internet Explorer") {
          document.forms['search_form'].elements['search'].value = search;
      } else if(navigator.appName == "Opera") {
          document.forms['search_form'].elements['search'].value = search;
      } else if(navigator.appName == "Netscape") {
          document.getElementsByName('search')[0].value=search;
      } else {
          document.forms['search_form'].elements['search'].value = search;
      }
      var response_div = document.getElementById("response");
      response_div.innerHTML = '';
}


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("Error creating request object!");
   }

   function send() {
       createRequest();
       //search = document.forms[0].search.value;
       search = document.forms['search_form'].elements['search'].value;

       if(search.length > 1) {
           if(navigator.appName == "Microsoft Internet Explorer") {
               var url = "http://www.italii.ru/xajax/ajax_search.php?iconv&search=" + search;
           } else if(navigator.appName == "Opera") {
           	   var url = "http://www.italii.ru/xajax/ajax_search.php?iconv&search=" + search;
           } else if(navigator.appName == "Netscape") {
           	   var url = "http://www.italii.ru/xajax/ajax_search.php?search=" + search;
           } else {
           	  var url = "http://www.italii.ru/xajax/ajax_search.php?iconv&search=" + search;
           }

           request.open("GET", url, true);
           request.onreadystatechange = update;
           request.send(null);
       } else {
             var response_div = document.getElementById("response");
          response_div.innerHTML = '';
       }
   }

   function update() {
      if(request.readyState == 4) {
        if(request.status == 200) {
           var response_div = document.getElementById("response");
           response_div.innerHTML = request.responseText;

        } else alert("Error! Request status is " + request.status);
      }
   }


Пришлось даже с navigator.appName извратиться.

x-yuri 14.08.2009 11:20

ошибки какие-то выдаются в ie?

не надо тут с navigator.appName извращаться: используй utf-8

maxsoftware 14.08.2009 11:28

Я то с радостью использовать utf-8, но клиенту не докажешь.
По поводу IE
Строка: 40
Ошибка: Объект не поддерживает это свойство или метод.

x-yuri 14.08.2009 11:48

а клиент такие умные слова знает O_o может попробовать сменить клиента? ;)
какая строка 40-ая? Лучше включи отладчик и посмотри, на какой строке он остановился

Kolyaj 14.08.2009 11:56

Цитата:

Сообщение от maxsoftware
Я то с радостью использовать utf-8, но клиенту не докажешь.

А клиенту какая разница в какой кодировке сайт?

maxsoftware 14.08.2009 12:31

Дело то не в кодировке.
Вернёмся к скрипту.
40 строка.
search = document.forms['search_form'].elements['search'].value;
if(search.length > 1) {

Riim 14.08.2009 13:05

Разве свойство elements у формы во всех браузерах есть?

x-yuri 14.08.2009 13:09

Цитата:

Сообщение от maxsoftware
Дело то не в кодировке.

кодировка - это про navigator.appName. Про кодировку можно почитать здесь Откуда информация, что Netscape в cp1251 отсылает, да и вообще, кто им сейчас пользуется?

Цитата:

Сообщение от maxsoftware
Вернёмся к скрипту.

а как ты определил 40-ую строку: от начала странички или от начала тэга script? Ты уверен что это 40-ая строка? А если после нее добавить пустую строку, номер не измениться? Если перед ней добавить пустую, измениться? Насколько я помню ie непонятно как сообщает номер строки. Или ты все-таки в отладчике строку выяснил?
p.s. зачем создавать глобальные переменные (search, например)

x-yuri 14.08.2009 13:11

Цитата:

Сообщение от Riim
Разве свойство elements у формы во всех браузерах есть?

даже в стандарте есть

Riim 14.08.2009 13:12

Цитата:

Сообщение от x-yuri
даже в стандарте есть

Я наверно с children перепутал.

maxsoftware 14.08.2009 13:57

FireFox определяется как Netscape.
Про 40 строку IE показал, придётся через отладчик разбираться.
Про глобальные переменные как-то не задумывался.

Kolyaj 14.08.2009 14:55

Цитата:

Сообщение от maxsoftware
FireFox определяется как Netscape.

var isIE = navigator.userAgent.indexOf('Mozilla') != -1

Черт, все браузеры как IE определяются.

maxsoftware 14.08.2009 15:15

Нет, можете проверить alert(navigator.appName);

x-yuri 14.08.2009 17:21

ну давайте тогда глянем, как это делается в фреймворках (конечно, не истина в последней инстанции), может кто-то даже прокомментирует

prototype (хоть его и ругали уже сегодня)
Browser: (function(){
    var ua = navigator.userAgent;
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
    return {
      IE:             !!window.attachEvent && !isOpera,
      Opera:          isOpera,
      WebKit:         ua.indexOf('AppleWebKit/') > -1,
      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
      MobileSafari:   /Apple.*Mobile.*Safari/.test(ua)
    }
  })(),


jQuery
jQuery.browser = {
	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
	safari: /webkit/.test( userAgent ),
	opera: /opera/.test( userAgent ),
	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};


mootools
var Browser = $merge({

	Engine: {name: 'unknown', version: 0},

	Platform: {name: (window.orientation != undefined) ? 'ipod' : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()},

	Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)},

	Plugins: {},

	Engines: {

		presto: function(){
			return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925));
		},

		trident: function(){
			return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? 5 : 4);
		},

		webkit: function(){
			return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419);
		},

		gecko: function(){
			return (document.getBoxObjectFor == undefined) ? false : ((document.getElementsByClassName) ? 19 : 18);
		}

	}

}, Browser || {});


ну и стоит отметить, что browser detection considered harmful

p.s. твой вариант, maxsoftware, выглядит довольно древним

maxsoftware 14.08.2009 23:15

Думаешь это имеет отношение к ошибке?

x-yuri 15.08.2009 00:21

нет, это советы по остальным проблемам твоего кода. По ошибке на данный момент я уже все посоветовал, что мог (что за строка ты все еще не сказал)


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