Перейти к содержимому



Не работает php код в javascript-е

#1 Kuchuluk
Kuchuluk
  • Неактивные
  • 333 сообщений
  • Репутация: 5
0

Обновлено 24 апреля 2013 - 16:19  Отправлено 22 апреля 2013 - 21:55

нашел в интернете скрипт, написанный на js для вывода городов в зависимости от выбора страны. там массив из названий городов выводится, я вместо этого массива поставил вывод из БД своих городов. вот этот js код
Страна:
    <select name="street" onChange="MkHouseValues(this.selectedIndex)">
    <option value="Россия">Россия</option>
    <option value="Казахстан">Казахстан</option>
    </select>
    &nbsp;Город:
    <select name="house">
    <option value="N/A">N/A</option>
    </select>
    <script type="text/javascript">
<!--
// Формируем массив городов
var aHouseValues = new Array(
<?php echo $base->showCity(1); ?>,
<?php echo $base->showCity(2); ?>
);
// ф-ция, возвращающая массив городов по заданной стране
function getHouseValuesByStreet(index){
    var sHouseValues = aHouseValues[index];
    return sHouseValues.split(","); // преобразуем строку в массив городов
}
// ф-ция, выводящая динамически список городов
function MkHouseValues(index){
    var aCurrHouseValues = getHouseValuesByStreet(index);
    var nCurrHouseValuesCnt = aCurrHouseValues.length;
    var oHouseList = document.forms["address"].elements["house"];
    var oHouseListOptionsCnt = oHouseList.options.length;
    oHouseList.length = 0; // удаляем все элементы из списка городов
    for (i = 0; i < nCurrHouseValuesCnt; i++){
	    // далее мы добавляем необходимые города в список
	    if (document.createElement){
		    var newHouseListOption = document.createElement("OPTION");
		    newHouseListOption.text = aCurrHouseValues[i];
		    newHouseListOption.value = aCurrHouseValues[i];
		    // тут мы используем для добавления элемента либо метод IE, либо DOM
		    (oHouseList.options.add) ? oHouseList.options.add(newHouseListOption) : oHouseList.add(newHouseListOption, null);
	    }else{
		    // для NN3.x-4.x
		    oHouseList.options[i] = new Option(aCurrHouseValues[i], aCurrHouseValues[i], false, false);
	    }
    }
}
// инициируем изменение элементов в списке городов, в зависимости от текущей страны
MkHouseValues(document.forms["address"].elements["street"].selectedIndex);
//-->
</script>
<?php echo $base->showCity(1); ?> <?php echo $base->showCity(2); ?> с помощью этих двух методов должен выводиться массив городов, но не выводится ничего, только N/A. сам метод такой
public function showCity($where) //ф.-ция когда нужно просто выбрать из базы и вывести на экран
{
  $data = $this->get("SELECT city_name FROM kz_city WHERE counry_id = ".$where);
  foreach($data as $d)
  {
   $text = $text.$d["city_name"].", ";
  }
  $a = strlen($text)-2;
  $text = substr($text,0,$a);
  //$text = preg_replace("#(,\s)+?$#","",$text);
  return $text;
}

 

 

  • 0

#2 isvetlichniy
isvetlichniy
  • Неактивные
  • 622 сообщений
  • Репутация: 93

Отправлено 22 апреля 2013 - 22:18

var aHouseValues = new Array(
<?php echo $base->showCity(1); ?>,
<?php echo $base->showCity(2); ?>
);
это глупости, echo выведет в браузер. попробуй вот так

var aHouseValues = new Array(
<?=$base->showCity(1); ?>,
<?=$base->showCity(2); ?>
);

и еще, я надеюсь ты создаешь объект класса base? а то я не вижу в коде.

Но я бы так не делал, я бы сделал заполнение списка с помощью jquery.ajax
  • 0

#3 fedornabilkin
fedornabilkin
  • Модератор
  • 1 190 сообщений
  • Репутация: 206

Отправлено 23 апреля 2013 - 09:45

isvetlichniy, не понял в чем разница между обычным и упрощенным выводом?
  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#4 Kuchuluk
Kuchuluk
    Topic Starter
  • Неактивные
  • 333 сообщений
  • Репутация: 5

Отправлено 23 апреля 2013 - 10:13

isvetlichniy, объект base есть. я ajax вообще не знаю, я js то толком не знаю


  • 0

#5 fedornabilkin
fedornabilkin
  • Модератор
  • 1 190 сообщений
  • Репутация: 206

Отправлено 23 апреля 2013 - 10:31

Kuchuluk, а стоило бы узнать и js, и ajax. и jQuery
Очень полезно и сразу отпадают подобные вопросы. Я так в данный момент боюсь смотреть на этот код и уверен, что все можно сделать намного проще.
  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#6 Kuchuluk
Kuchuluk
    Topic Starter
  • Неактивные
  • 333 сообщений
  • Репутация: 5

Отправлено 23 апреля 2013 - 11:50

это код не мой, я его в интернете нашел. он работал, когда там массив городов в ручную был написан, а с php кодом не работает


  • 0

#7 fedornabilkin
fedornabilkin
  • Модератор
  • 1 190 сообщений
  • Репутация: 206

Отправлено 23 апреля 2013 - 12:09

Значит неправильно интегрировал пхп в этот скрипт.
ctrl+u смотрел что получается?
  • 1

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#8 isvetlichniy
isvetlichniy
  • Неактивные
  • 622 сообщений
  • Репутация: 93

Отправлено 23 апреля 2013 - 13:09

приведи исходный массив
я так предполагаю, что там он был строковой величиной

значит в кавычки твой php код надо брать
  • 0

#9 Kuchuluk
Kuchuluk
    Topic Starter
  • Неактивные
  • 333 сообщений
  • Репутация: 5

Отправлено 23 апреля 2013 - 15:25

ctrl+u смотрел что получается?

посмотрел
<!--
// Формируем массив городов
var aHouseValues = new Array(
Курган, Омск,
Астана, Алматы, Актау, Актобе, Атырау, Караганда, Кзылорда, Кокшетау, Костанай, Петропавловск, Павлодар, Семипалатинск, Талдыкорган, Жезказган, Усть-Каменогорск, Тараз, Шимкент);
список городов в исходном коде получается

isvetlichniy,

я так предполагаю, что там он был строковой величиной

ну да, он строковым был в изначальном коде
вот такой он был
<script type="text/javascript">
<!--
// Формируем массив городов
var aHouseValues = new Array(
"Москва, Питер, Самара, Бугуруслан",
"Лондон, Мантчестер",
"Рим, Турин",
"Париж",
"Киев, Семфирополь"
);
// ф-ция, возвращающая массив городов по заданной стране
function getHouseValuesByStreet(index){
    var sHouseValues = aHouseValues[index];
    return sHouseValues.split(","); // преобразуем строку в массив городов
}

  • 0

#10 isvetlichniy
isvetlichniy
  • Неактивные
  • 622 сообщений
  • Репутация: 93

Отправлено 23 апреля 2013 - 15:58

вот такой он был


ну так таким же и должен остаться
var aHouseValues = new Array(
"<?=$base->showCity(1); ?>",
"<?=$base->showCity(2); ?>"
);

  • 1

#11 Kuchuluk
Kuchuluk
    Topic Starter
  • Неактивные
  • 333 сообщений
  • Репутация: 5

Отправлено 23 апреля 2013 - 16:17

isvetlichniy, спасибо большое! переделал, заработало! у меня еще вопрос будет.


  • 0

#12 Kuchuluk
Kuchuluk
    Topic Starter
  • Неактивные
  • 333 сообщений
  • Репутация: 5

Отправлено 23 апреля 2013 - 20:13

isvetlichniy, fedornabilkin, я начал дальше доделывать этот скрипт. третий input должен выводить заведения выбранного города. на этот раз там также N/A, в исходном коде тоже ничего нет. сам скрипт такой
<!--
// Формируем массив заведений
var aClubsValues = new Array(
"<?php echo $base->showClubs(8); ?>",
"<?php echo $base->showClubs(10); ?>"
);
// ф-ция, возвращающая массив городов по заданной стране
function getClubsValuesByHouse(index){
    var sClubsValues = aClubsValues[index];
    return sClubsValues.split(","); // преобразуем строку в массив городов
}
// ф-ция, выводящая динамически список городов
function MkClubsValues(index){
    var aCurrClubsValues = getClubsValuesByStreet(index);
    var nCurrClubsValuesCnt = aCurrClubsValues.length;
    var oClubsList = document.forms["house"].elements["clubs"];
    var oClubsListOptionsCnt = oClubsList.options.length;
    oClubsList.length = 0; // удаляем все элементы из списка городов
    for (i = 0; i < nCurrClubsValuesCnt; i++){
	    // далее мы добавляем необходимые города в список
	    if (document.createElement){
		    var newClubsListOption = document.createElement("OPTION");
		    newClubsListOption.text = aCurrClubsValues[i];
		    newClubsListOption.value = aCurrClubsValues[i];
		    // тут мы используем для добавления элемента либо метод IE, либо DOM
		    (oClubsList.options.add) ? oClubsList.options.add(newClubsListOption) : oClubsList.add(newClubsListOption, null);
	    }else{
		    // для NN3.x-4.x
		    oClubsList.options[i] = new Option(aCurrClubsValues[i], aCurrClubsValues[i], false, false);
	    }
    }
}
// инициируем изменение элементов в списке городов, в зависимости от текущей страны
MkClubsValues(document.forms["house"].elements["clubs"].selectedIndex);
//-->
опера выдает ошибку [23.04.2013 21:00:55] JavaScript - http://localhost/par...?login=kuchuluk
Inline script thread
Uncaught exception: TypeError: Cannot convert 'document.forms["house"]' to object
Error thrown at line 127, column 0 in http://localhost/par...login=kuchuluk:
MkClubsValues(document.forms["house"].elements["clubs"].selectedIndex);

метод showClubs такой
public function showClubs($where)
{
  $data = $this->get("SELECT id, name FROM clubs WHERE city_id = ".$where);
  foreach($data as $d)
  {
   $text = $text.$d["name"].", ";
  }
  $a = strlen($text)-2;
  $text = substr($text,0,$a);
  return $text;
}
вывожу этот метод в другом месте страницы, выводится строка содержащая заведения города
  • 0

#13 isvetlichniy
isvetlichniy
  • Неактивные
  • 622 сообщений
  • Репутация: 93

Отправлено 24 апреля 2013 - 10:53

привели код формы
  • 0

#14 Kuchuluk
Kuchuluk
    Topic Starter
  • Неактивные
  • 333 сообщений
  • Репутация: 5

Отправлено 24 апреля 2013 - 14:34

привели код формы


<select name="street" onChange="MkHouseValues(this.selectedIndex)">
    <option value="Россия">Россия</option>
    <option value="Казахстан">Казахстан</option>
    </select>
    &nbsp;Город:
    <select name="house">
    <option value="N/A">N/A</option>
    </select>
    <select name="clubs">
    <option value="N/A">N/A</option>
    </select>

  • 0

#15 isvetlichniy
isvetlichniy
  • Неактивные
  • 622 сообщений
  • Репутация: 93

Отправлено 24 апреля 2013 - 16:04

Cannot convert 'document.forms["house"]' to object
это значит, что то, что ты передаешь не является объектом, тоесть должно быть объектом, но таким не является. или вообще не существует

и второе, ты используешь
onChange="MkHouseValues(this.selectedIndex)"

но я не вижу у тебя в коде такой функции. она есть? или ты что то напутал?

и в третьих, с элементами формы лучше работать по айдишнику (функция document.getElementById() )
  • 0

#16 isvetlichniy
isvetlichniy
  • Неактивные
  • 622 сообщений
  • Репутация: 93

Отправлено 24 апреля 2013 - 16:19

MkClubsValues(document.forms["house"].elements["clubs"].selectedIndex);
а это что я вообще не понял...

что такое document.forms["house"] ?
  • 0

robot
robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Похожие темы
  Название темы Автор Статистика Последнее сообщение

Пользователь месяца
Megoydagi Megoydagi 1-й за Август
Очков активности: 30 4 темы, 8 сообщений, 1 балл репутации
Сайт: bank.net.ru
ТОП самых активных за этот месяц
  • Фотография Vmir
    #1

    Vmir
    Очков активности: 22.5 3 темы, 6 сообщений, 1 балл репутации

  • Фотография kuztoday
    #2

    kuztoday
    Очков активности: 10.5 1 тема, 4 сообщения, 1 балл репутации

  • Фотография mkreine
    #3

    mkreine (analiz-krovi.net)
    Очков активности: 9 1 тема, 3 сообщения, 1 балл репутации

  • Фотография kolver
    #4

    kolver
    Очков активности: 9 1 тема, 3 сообщения, 1 балл репутации

  • Фотография Megoydagi
    #5

    Megoydagi (bank.net.ru)
    Очков активности: 9 Вне конкурса за определение пользователя месяца

  • Фотография Totti
    #6

    Totti
    Очков активности: 7.5 0 тем, 5 сообщений, 1 балл репутации

  • Фотография BLIK
    #7

    BLIK
    Очков активности: 7.5 Вне конкурса за определение пользователя месяца

  • Фотография Zevss
    #8

    Zevss (domles43.ru)
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Фотография fedornabilkin
    #9

    fedornabilkin (plohoneponyal.ru)
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Фотография SergiuS85
    #10

    SergiuS85
    Очков активности: 6 1 тема, 1 сообщение, 1 балл репутации

  • Показать весь ТОП 10

Поддержите форум! =)
Топ 5 участников по репутации

Оформление форума – IPBSkins.ru