За последние 24 часа нас посетили 17545 программистов и 1649 роботов. Сейчас ищут 910 программистов ...

Выбор ссылки в input-е

Тема в разделе "JavaScript и AJAX", создана пользователем kit, 6 май 2015.

  1. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Всем привет!
    Есть код:
    Код (Text):
    1. <input type="text" name="city_region" id="position" onkeyup="search_position(this.value)" value="<? echo $city; ?>" onblur="hide_city(); " onfocus="this.value='' " />
    2. <div id="city_result"></div>
    В данном input-е вводится название города. По умолчанию в текстовом поле вписан город $city. При появлении фокуса в поле значение обнуляется. Оnkeyup анализирует ввод текста и в div с id="city_result" подгружает список ссылок с названиями городов с помощью функции search_position. Это все работает.
    Необходимо функцией hide_city при нажатии на ссылку текст ссылки вставлять в поле input, а при потере фокуса вне ссылки возвращать значение по умолчанию $city. Буду благодарен за помощь.
     
  2. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Чувак, ты в 90-х, досих-пор?

    placeholder

    Не... не слышал!
     
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А если я что-то ввел в поле, потом перевел фокус, потом вернулся назад? Привет, пустая строка? :)
    По какой ссылке? По любой на странице?
     
  4. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    rodent90 не ну спасибо конечно, но во первых хотелось бы корректности отображения во всех (основных) браузерах, во вторых при написании в поле текста и не выборе появляющейся ссылки (то есть потере фокуса вне предложенных ссылок), в поле останется набранный текст, а по условиям задачи в поле должен быть либо текст по умолчанию, либо текст ссылки. Как плэйсхолдер решает эту задачу, чувак?
    Fell-x27
    1) Если вы ввели в поле текст, появится список ссылок с названиями городов. Если вы выбрали одну из ссылок, то текст ссылки должен вставиться в поле. Если фокус потерян и ссылка не выбрана, то должно появиться значение по умолчанию. Если ранее в поле был текст (либо по умолчанию, либо ранее выбранная ссылка), и в поле появляется фокус, то текст должен пропасть. Если фокус был потерян, то должен появиться ранее введенный текст.
    2) Не по любой, а именно по ссылке из предложенного списка. Например вы вводите "Но" появляется список ссылок городов
    "Норильск"
    "Ноябрьск"
    и т.д.
     
  5. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    onBlur="this.value='';"
    бгг.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Вот, после уточнения оказалось, что автор пишет автокомплит, а не просто инпут с костылями вместо плейсхолдеров.

    Добавлено спустя 54 секунды:
    Автор, запости на JSFiddle работающий экземпляр странички, по фен-шую. Мб поковыряю на досуге. То бишь завтра вечерком. Мне сейчас много практики на JS нужно как раз. А такие вещи куда полезнее скучных синтетических задачек, от которых подташнивает уже.
     
  7. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    JSFiddle пробовал лишь однажды. Даже не знаю как в этой песочнице ПХП использовать (уж прошу прощения за невежество).
    По этому выложу свой код здесь.
    Код из основной страницы:
    Код (Text):
    1.  
    2. function search_position(word)
    3. {
    4.     if ($('#position').val()!='')
    5.     {
    6.         $.post( 'search_position.php', {word: word}, onSuccess);
    7.         function onSuccess(data)
    8.         {
    9.             $('#city_result').html(data);
    10.             var myD = document.getElementById('city_result');
    11.             myD.style.display = 'block';
    12.         }
    13.     }
    14.     else $('#city_result').html('');
    15. }
    16. function hide_city()
    17. {
    18.     //здесь надо что-то придумать
    19.     //и желательно перенести впоследствии весь код из onblur инпута
    20. }
    21. function close_div()
    22. {
    23.     document.getElementById('city_result').style.display = 'none';
    24. }
    25. <div id="search_position">
    26. <input type="text" name="city_region" id="position" onkeyup="search_position(this.value)" value="<? echo $city.", ".$rayon.", ".$region; ?>" onblur="if (this.value=='') this.value='<? echo $city.", ".$rayon.", ".$region; ?>'; hide_city(); " onfocus="this.value=''; close_div();" />
    27. <div id="city_result"></div>
    28. </div>
    Код страницы search_position.php, запрашиваемой аяксом:
    Код (Text):
    1.  
    2. <?php
    3. $fh = fopen('http://geocode-maps.yandex.ru/1.x/?geocode='.$_POST['word'],'r');
    4. if($fh)
    5. {
    6.     while(!feof($fh)) $text.=fread($fh,4096);
    7.     fclose($fh);
    8. }
    9. else echo "'error'";
    10. $l = simplexml_load_string($text);
    11. foreach ($l->GeoObjectCollection->featureMember as $key => $value)
    12. {
    13.     if ($value->GeoObject->metaDataProperty->GeocoderMetaData->AddressDetails->Country->CountryNameCode=="RU" &&
    14.         $value->GeoObject->metaDataProperty->GeocoderMetaData->AddressDetails->Country->AdministrativeArea->SubAdministrativeArea->Locality->LocalityName)
    15.         echo '<a href=\'javascript:;\' onclick=hide_city()><p onclick="$(\'#position\').val($(this).html()); document.getElementById(\'city_result\').style.display = \'none\';">'.
    16.         $value->GeoObject->metaDataProperty->GeocoderMetaData->AddressDetails->Country->AdministrativeArea->SubAdministrativeArea->Locality->LocalityName
    17.         .', '.
    18.         $value->GeoObject->metaDataProperty->GeocoderMetaData->AddressDetails->Country->AdministrativeArea->SubAdministrativeArea->SubAdministrativeAreaName
    19.         .', '.
    20.         $value->GeoObject->metaDataProperty->GeocoderMetaData->AddressDetails->Country->AdministrativeArea->AdministrativeAreaName
    21.         .'</p></a>';
    22. }
    23. ?>
    Была мысль при вызове функции hide_city() передавать в нее переменную с текстом выбранной ссылки. В этом случае при потере фокуса в инпуте функция hide_city должна анализировать эту переменную на ее наличие/отсутствие. При наличии будет эту переменную вводить в поле инпута, а при отсутствии будет оставлять предыдущее значение. Как реализовать не знаю... не хватает знаний ни JS ни AJAX.
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    1) в JSFiddle перенеси код уже работающей страницы, уже сгенерированной.
    2) Данные вместо получаемых от сервера подсунь тестовые, в виде уже полученного объекта. Чтоб "ajax" вместо запроса к серверу просто сразу пускал этот объект в оборот.

    Коврять то, что есть сейчас нет никакого желания, если честно.

    И сходу вопрос: а почему в поле выбора именно вот ссылки? Ты ссылкой просто варианты называешь, или это именнопрям вот какие-то URL-ы? Что ты подрразумеваешь под словом "ссылка"?
     
  9. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Вроде получилось, вот https://jsfiddle.net/93ntvzmq/1/
    По поводу ссылок. Это не обязательно должны быть именно ссылки <a...></a>, можно просто текст.
    Просто когда предлагаемые варианты городов выглядят как ссылки, мне кажется для пользователя так нагляднее.
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А вывод результатов, по которым надо клацать, пока вообще не реализован?
     
  11. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    у меня он реализован
    Код (Text):
    1. foreach ($l->GeoObjectCollection->featureMember as $key => $value)
    2. {
    3.    if ($value->GeoObject->metaDataProperty->GeocoderMetaData->AddressDetails->Country->CountryNameCode=="RU" &&
    4.       $value->GeoObject->metaDataProperty->GeocoderMetaData->AddressDetails->Country->AdministrativeArea->SubAdministrativeArea->Locality->LocalityName)
    5.       echo '<a href=\'javascript:;\' onclick=hide_city()><p onclick="$(\'#position\').val($(this).html()); document.getElementById(\'city_result\').style.display = \'none\';">'.
    6.       $value->GeoObject->metaDataProperty->GeocoderMetaData->AddressDetails->Country->AdministrativeArea->SubAdministrativeArea->Locality->LocalityName
    7.       .', '.
    8.       $value->GeoObject->metaDataProperty->GeocoderMetaData->AddressDetails->Country->AdministrativeArea->SubAdministrativeArea->SubAdministrativeAreaName
    9.       .', '.
    10.       $value->GeoObject->metaDataProperty->GeocoderMetaData->AddressDetails->Country->AdministrativeArea->AdministrativeAreaName
    11.       .'</p></a>';
    12. }
    как показать это в JSFiddle не знаю
     
  12. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    Пробую реализовать таким образом:
    Основная страница:
    Код (Text):
    1. <script>
    2. function hide_city(s)
    3. {
    4.     if (s.text!='')
    5.         $('#position').val(s.text);
    6.     else
    7.         $('#position').val(<? echo $city.", ".$rayon.", ".$region; ?>);
    8.     document.getElementById('city_result').style.display = 'none';
    9.         return false;
    10. }
    11. </script>
    12. <input type="text" name="city_region" id="position" onkeyup="search_position(this.value)" value="<? echo $city.", ".$rayon.", ".$region; ?>" onblur="hide_city();" onfocus="this.value=''; close_div();" />
    13. <div id="city_result"></div>
    Часть кода страницы search_position.php, запрашиваемой аяксом:
    Код (Text):
    1. echo "<a href=\'javascript:;\' onClick=\"return hide_city(this)\">$s</a><br>";
    не работает в части касательно если потерян фокус импута без нажатия на ссылку.
    в чем ошибка?
     
  13. kit

    kit Активный пользователь

    С нами с:
    18 дек 2006
    Сообщения:
    331
    Симпатии:
    1
    Адрес:
    местный
    в общем сделал...
    пришлось покопаться с очередностью выполнения команд в JS, и в итоге отделался двумя простыми функциями для onblur и onfocus.
    получился совершенно замечательный автокомплит удовлетворяющий моим потребностям.