选择<li>并将值传递给文本字段

时间:2016-11-29 01:24:48

标签: javascript html

我有一个网站,里面有我正在实施的搜索栏。搜索栏正确显示数据库的输出(为了便于理解,我有“硬编码”少量输出)。但是我似乎无法点击显示的搜索项目并且onclick事件不起作用,它只是从焦点中删除列表而不显示它。

function set_item(item) {
  alert(item);
  $('#country_id').val(item);

  $('#country_list_id').hide();
}
body {
  background: #f7f7f7;
  color: #404040;
  font-family: 'HelveticaNeue', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: 13px;
  font-weight: normal;
  line-height: 20px;
}

a {
  color: #1e7ad3;
  text-decoration: none;
}

a:hover {
  text-decoration: underline
}

.container,
.main {
  width: 640px;
  margin-left: auto;
  margin-right: auto;
  height: 300px;
}

.main {
  margin-top: 50px
}

input {
  font-family: 'HelveticaNeue', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  font-size: 13px;
  color: #555860;
}

.search {
  position: relative;
  margin: 0 auto;
  width: 300px;
}

.search input {
  height: 26px;
  width: 100%;
  padding: 0 12px 0 25px;
  background: white url("http://cssdeck.com/uploads/media/items/5/5JuDgOa.png") 8px 6px no-repeat;
  border-width: 1px;
  border-style: solid;
  border-color: #a8acbc #babdcc #c0c3d2;
  border-radius: 13px;
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  -ms-box-sizing: border-box;
  -o-box-sizing: border-box;
  box-sizing: border-box;
  -webkit-box-shadow: inset 0 1px #e5e7ed, 0 1px 0 #fcfcfc;
  -moz-box-shadow: inset 0 1px #e5e7ed, 0 1px 0 #fcfcfc;
  -ms-box-shadow: inset 0 1px #e5e7ed, 0 1px 0 #fcfcfc;
  -o-box-shadow: inset 0 1px #e5e7ed, 0 1px 0 #fcfcfc;
  box-shadow: inset 0 1px #e5e7ed, 0 1px 0 #fcfcfc;
}

.search input:focus {
  outline: none;
  border-color: #66b1ee;
  -webkit-box-shadow: 0 0 2px rgba(85, 168, 236, 0.9);
  -moz-box-shadow: 0 0 2px rgba(85, 168, 236, 0.9);
  -ms-box-shadow: 0 0 2px rgba(85, 168, 236, 0.9);
  -o-box-shadow: 0 0 2px rgba(85, 168, 236, 0.9);
  box-shadow: 0 0 2px rgba(85, 168, 236, 0.9);
}

.search input:focus + .results {
  display: block
}

.search .results {
  display: none;
  position: absolute;
  top: 35px;
  left: 0;
  right: 0;
  z-index: 10;
  padding: 0;
  margin: 0;
  border-width: 1px;
  border-style: solid;
  border-color: #cbcfe2 #c8cee7 #c4c7d7;
  border-radius: 3px;
  background-color: #fdfdfd;
  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fdfdfd), color-stop(100%, #eceef4));
  background-image: -webkit-linear-gradient(top, #fdfdfd, #eceef4);
  background-image: -moz-linear-gradient(top, #fdfdfd, #eceef4);
  background-image: -ms-linear-gradient(top, #fdfdfd, #eceef4);
  background-image: -o-linear-gradient(top, #fdfdfd, #eceef4);
  background-image: linear-gradient(top, #fdfdfd, #eceef4);
  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
  -ms-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
  -o-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}

.search .results li {
  display: block
}

.search .results li:first-child {
  margin-top: -1px
}

.search .results li:first-child:before,
.search .results li:first-child:after {
  display: block;
  content: '';
  width: 0;
  height: 0;
  position: absolute;
  left: 50%;
  margin-left: -5px;
  border: 5px outset transparent;
}

.search .results li:first-child:before {
  border-bottom: 5px solid #c4c7d7;
  top: -11px;
}

.search .results li:first-child:after {
  border-bottom: 5px solid #fdfdfd;
  top: -10px;
}

.search .results li:first-child:hover:before,
.search .results li:first-child:hover:after {
  display: none
}

.search .results li:last-child {
  margin-bottom: -1px
}

.search .results a {
  display: block;
  position: relative;
  margin: 0 -1px;
  padding: 6px 40px 6px 10px;
  color: #808394;
  font-weight: 500;
  text-shadow: 0 1px #fff;
  border: 1px solid transparent;
  border-radius: 3px;
}

.search .results a span {
  font-weight: 200
}

.search .results a:before {
  content: '';
  width: 18px;
  height: 18px;
  position: absolute;
  top: 50%;
  right: 10px;
  margin-top: -9px;
  background: url("http://cssdeck.com/uploads/media/items/7/7BNkBjd.png") 0 0 no-repeat;
}

.search .results a:hover {
  text-decoration: none;
  color: #fff;
  text-shadow: 0 -1px rgba(0, 0, 0, 0.3);
  border-color: #2380dd #2179d5 #1a60aa;
  background-color: #338cdf;
  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #59aaf4), color-stop(100%, #338cdf));
  background-image: -webkit-linear-gradient(top, #59aaf4, #338cdf);
  background-image: -moz-linear-gradient(top, #59aaf4, #338cdf);
  background-image: -ms-linear-gradient(top, #59aaf4, #338cdf);
  background-image: -o-linear-gradient(top, #59aaf4, #338cdf);
  background-image: linear-gradient(top, #59aaf4, #338cdf);
  -webkit-box-shadow: inset 0 1px rgba(255, 255, 255, 0.2), 0 1px rgba(0, 0, 0, 0.08);
  -moz-box-shadow: inset 0 1px rgba(255, 255, 255, 0.2), 0 1px rgba(0, 0, 0, 0.08);
  -ms-box-shadow: inset 0 1px rgba(255, 255, 255, 0.2), 0 1px rgba(0, 0, 0, 0.08);
  -o-box-shadow: inset 0 1px rgba(255, 255, 255, 0.2), 0 1px rgba(0, 0, 0, 0.08);
  box-shadow: inset 0 1px rgba(255, 255, 255, 0.2), 0 1px rgba(0, 0, 0, 0.08);
}

:-moz-placeholder {
  color: #a7aabc;
  font-weight: 200;
}

::-webkit-input-placeholder {
  color: #a7aabc;
  font-weight: 200;
}

.lt-ie9 .search input {
  line-height: 26px
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<section class="main">
  <form class="search">
    <input type="text" name="q" id="country_id" onkeyup="autocomplet()" />
    <ul class="results">
      <div id="country_list_id">
        <li onclick="set_item('349')">
          <p hidden="" id="hiddennr">349</p><a>SKY News<br><span>Hispasat 1D/1E (30.0W)</span></a></li>
        <li onclick="set_item('350')">
          <p hidden="" id="hiddennr">350</p><a>SKY News<br><span>Hispasat 1D/1E (30.0W)</span></a></li>
        <li onclick="set_item('934')">
          <p hidden="" id="hiddennr">934</p><a>ALASKANDRIA<br><span>Nilesat102/201 - Eutelsat 7WA (7.0W)</span></a></li>
        <li onclick="set_item('1542')">
          <p hidden="" id="hiddennr">1542</p><a>Sky News Arabia<br><span>Nilesat102/201 - Eutelsat 7WA (7.0W)</span></a></li>
        <li onclick="set_item('1543')">
          <p hidden="" id="hiddennr">1543</p><a>Sky News Arabia HD<br><span>Nilesat102/201 - Eutelsat 7WA (7.0W)</span></a></li>
        <li onclick="set_item('1544')">
          <p hidden="" id="hiddennr">1544</p><a>Sky News HD<br><span>Nilesat102/201 - Eutelsat 7WA (7.0W)</span></a></li>
        <li onclick="set_item('1937')">
          <p hidden="" id="hiddennr">1937</p><a>Sky TG24 HD<br><span>Eutelsat 5WA (5.0W)</span></a></li>
        <li onclick="set_item('1978')">
          <p hidden="" id="hiddennr">1978</p><a>2000 - ESKA SES<br><span>Amos 2/3 (4.0W)</span></a></li>
        <li onclick="set_item('1979')">
          <p hidden="" id="hiddennr">1979</p><a>2010 - ESKA Belchatow<br><span>Amos 2/3 (4.0W)</span></a></li>
        <li onclick="set_item('1980')">
          <p hidden="" id="hiddennr">1980</p><a>2020 - ESKA Bialystok<br><span>Amos 2/3 (4.0W)</span></a></li>
      </div>
    </ul>
  </form>
</section>

function autocomplet() {
var min_length = 2; 
var keyword = $('#country_id').val();
if (keyword.length >= min_length) {
    $.ajax({
        url: 'ajax_refresh.php',
        type: 'POST',
        data: {keyword:keyword},
        success:function(data){
            $('#country_list_id').show();
            $('#country_list_id').html(data);
        }
    });
} else {
    $('#country_list_id').hide();
}
}


$pdo = connect();
$keyword = '%'.$_POST['keyword'].'%';
$sql = "SELECT * FROM mychannels WHERE Service_Name LIKE (:keyword) ORDER BY      idchannel ASC LIMIT 0, 10";
$query = $pdo->prepare($sql);
$query->bindParam(':keyword', $keyword, PDO::PARAM_STR);
$query->execute();
$list = $query->fetchAll();
foreach ($list as $rs) {

$country_name = str_replace($_POST['keyword'], '<b>'.$_POST['keyword'].'</b>', $rs['Service_Name']);


echo  '<li onclick="set_item(\''.str_replace("'", "\'", $rs['idchannel']).'\')"><p hidden id="hiddennr">'.$rs['idchannel'].'</p><a>'.$rs['Service_Name'].'<br /><span>'.$rs['Satellite_name'].'</span></a></li>';
}

This is the fiddle

我想要实现的目标是:我想点击

  • 项目,我想运行函数set_item(),它应填充文本字段中的数据

      

    块引用

  • 2 个答案:

    答案 0 :(得分:0)

    请参阅此更新的小提琴https://jsfiddle.net/u4j7mxvd/6/

    添加以下代码

    //的CSS

    .search .results:active {
        display: block;
    }
    

    同时更改以下javascript设置

    1. 在“框架和扩展”中添加jQuery

    2. 将载入类型设置为'无换行-in'或'无换行'

    答案 1 :(得分:0)

    由于(ab)使用css技巧来显示/隐藏内容,因此必须写答案。出于某种原因:

    .search input:focus + .results {
      display: block;
    }
    
    CSS中的

    是问题的原因(?)。点击LI元素根本没有注册,所以当点击.results列表时,没有调用函数set_item()。删除指定的行后,一切正常。

    演示:https://jsfiddle.net/m70jgcrj/42/

    P.S。用jQuery显示/隐藏列表也不错:

    $('#country_id').click(function() {
    
    $('.results').slideDown();
    });
    
    $('.results').click(function() {
    
    $(this).slideUp();
    });
    

    这是js / CSS碰撞(?)的有趣案例,以及为什么(imho)CSS&#39;事件&#39; (&#39;复选框hack&#39;,:focus和:active tricks)应该避免。 CSS用于styiling,js用于交互。 :)