Не стандартный поиск на сайте

Здравствуйте. Прошу помочь разобраться с кодом. Есть поиск по сайту от Яндекса. Для упрощения задачи пользователя, хочу сделать так чтобы при клике на характеристики они подставлялись в строку поиска Яндекса.
Задача напрямую с modx не связана, но очень прошу помочь.
Функция подстановки характеристик
<script>  
        window.onload=function(){document.getElementById('tags').value='';}

	function fcreateteg(value) { var allteg=document.getElementById('tags').value+=value+'+';    }

</script>

Выбор характеристик
<select  multiple size="10" name="tagi" class="form-control" id="ticket-sections" onchange="fcreateteg(value);">
                   <option  value="характеристика 1">характеристика 1</option>
                   <option  value="характеристика 2">характеристика 2</option>
                   <option  value="характеристика 2">характеристика 2</option>
</select>

Поиск от яндекса
<div class="ya-site-form ya-site-form_inited_no" onclick="return {'action':'https://yandex.ru/search/site/','arrow':false,'bg':'transparent','fontsize':12,'fg':'#000000','language':'ru','logo':'rb','publicname':'Поиск','suggest':true,'target':'_self','tld':'ru','type':2,'usebigdictionary':true,'searchid':2246000,'input_fg':'#000000','input_bg':'#ffffff','input_fontStyle':'normal','input_fontWeight':'normal','input_placeholder':'Выбранные характеристики','input_placeholderColor':'#000000','input_borderColor':'#cc6600'}">
<form action="https://yandex.ru/search/site/" method="get" target="_self">
<input type="hidden" name="searchid" value="2246507"/>
<input type="hidden" name="l10n" value="ru"/>
<input type="hidden" name="reqenc" value=""/>
<input id="tags" type="search"  name="text" value=""/>
<input type="submit" value="Найти"/>
</form>
</div>
<style type="text/css">.ya-page_js_yes .ya-site-form_inited_no { display: none; }</style>
<script type="text/javascript">(function(w,d,c){var s=d.createElement('script'),h=d.getElementsByTagName('script')[0],e=d.documentElement;if((' '+e.className+' ').indexOf(' ya-page_js_yes ')===-1){e.className+=' ya-page_js_yes';}s.type='text/javascript';s.async=true;s.charset='utf-8';s.src=(d.location.protocol==='https:'?'https:':'http:')+'//site.yandex.net/v2.0/js/all.js';h.parentNode.insertBefore(s,h);(w[c]||(w[c]=[])).push(function(){Ya.Site.Form.init()})})(window,document,'yandex_site_callbacks');</script>
</div>
Если строку
<input id="tags" type="search"  name="text" value=""/>
вынести за пределы кода Яндекса то в нее все подставляется, а внутрь кода ни в какую не хочет. В чем может быть проблема?
Борис И
07 декабря 2015, 14:14
modx.pro
2 692
0

Комментарии: 8

Сергей Шлоков
07 декабря 2015, 18:25
0
Я не гуру яваскрипта, поэтому не понимаю, как вообще у вас работает подстановка, ведь функция ничего не присваивает инпуту, а только зачитывает его значение.
function fcreateteg(value) { var allteg=document.getElementById('tags').value+=value+'+';    }
    Борис И
    07 декабря 2015, 19:28
    0
    Я тоже не очень разбираюсь поэтому и прошу помощи. Но вариант рабочий. При выборе характеристики срабатывает событие
    onchange="fcreateteg(value);"
    вызывающее функцию fcreateteg(value)
    , данная функция
    document.getElementById('tags').value+=value+'+';
    извлекает и записывает (добавляет) значение из input с id=«tags».
    Все работает, но если input находится внутри кода Яндекс поиска, то ничего не получается.
    Борис И
    07 декабря 2015, 19:46
    0
    Если убрать скрипт яндекса
    <script type="text/javascript">(function(w,d,c){var s=d.createElement('script'),h=d.getElementsByTagName('script')[0],e=d.documentElement;if((' '+e.className+' ').indexOf(' ya-page_js_yes ')===-1){e.className+=' ya-page_js_yes';}s.type='text/javascript';s.async=true;s.charset='utf-8';s.src=(d.location.protocol==='https:'?'https:':'http:')+'//site.yandex.net/v2.0/js/all.js';h.parentNode.insertBefore(s,h);(w[c]||(w[c]=[])).push(function(){Ya.Site.Form.init()})})(window,document,'yandex_site_callbacks');</script>
    то подставляет. Но где проблема в скрипте?
      Борис И
      07 декабря 2015, 19:53
      0
      Точнее не проблема, а что мешает?
        Максим Кузнецов
        07 декабря 2015, 20:03
        0
        Возможно, дело в том, что скрипт яндекса подгружает контент асинхронно и его попросту нет в зоне видимости цепляющей функции.

        Не скажу точно, как это переписывается с чистого javascript'a, но в jquery это можно сопоставить примерно с этим:

        $("идентификатор").click(function(){
        	//не будет срабатывать на удовлетворяющий идентификатор, подгруженный через аякс
        });
        
        $(document).on('click', 'идентификатор', function(e) {
        	//тут все ок
        });
          Борис И
          07 декабря 2015, 22:19
          0
          На jquery получилось как то так
          <script> 
          $(document).on("click","#fu",function() {
            val1=$('#tags').val();
            val2=$("#fu option:selected").text();
            val=val2+"+"+val1;
            $('#tags').val(val);
          });
          	
          </script>
          где
          <select  multiple size="5"  id="fu">
                             <option   value="характеристика 1">характеристика 1</option>
                             <option  value="характеристика 2">характеристика 2</option>
                             <option  value="характеристика 3">характеристика 3</option>
                   </select>
          Результат то же, при выносе
          <input id="tags" type="search"  name="text" value=""/>
          работает, а если внутри кода яндекса нет.
          Причем интересная вещь, удаляю скрипт яндекса
          <script type="text/javascript">(function(w,d,c){var s=d.createElement('script'),h=d.getElementsByTagName('script')[0],e=d.documentElement;if((' '+e.className+' ').indexOf(' ya-page_js_yes ')===-1){e.className+=' ya-page_js_yes';}s.type='text/javascript';s.async=true;s.charset='utf-8';s.src=(d.location.protocol==='https:'?'https:':'http:')+'//site.yandex.net/v2.0/js/all.js';h.parentNode.insertBefore(s,h);(w[c]||(w[c]=[])).push(function(){Ya.Site.Form.init()})})(window,document,'yandex_site_callbacks');</script>
          все работает и без него, то есть и подставляет, и осуществляет поиск, но что то мне подсказывает что яндекс будет не в восторге, наверное он там не просто так :)
          Уже голову сломал?
      Борис И
      07 декабря 2015, 22:51
      +1
      Все разобрался.
      Скрипт Яндекса
      <script type="text/javascript">(function(w,d,c){var s=d.createElement('script'),h=d.getElementsByTagName('script')[0],e=d.documentElement;if((' '+e.className+' ').indexOf(' ya-page_js_yes ')===-1){e.className+=' ya-page_js_yes';}s.type='text/javascript';s.async=true;s.charset='utf-8';s.src=(d.location.protocol==='https:'?'https:':'http:')+'//site.yandex.net/v2.0/js/all.js';h.parentNode.insertBefore(s,h);(w[c]||(w[c]=[])).push(function(){Ya.Site.Form.init()})})(window,document,'yandex_site_callbacks');</script>
      подгружает класс для input
      ya-site-form__input-text
      , соответственно меняем скрипт на
      <script> 
      $(document).on("click","#fu",function() {
        val1=$(".ya-site-form__input-text").val();
        val2=$("#fu option:selected").text();
        val=val2+"+"+val1;
        $(".ya-site-form__input-text").val(val);
      });
          
      </script>
      И Ура, все работает! Во всяком случае пока.
        Борис И
        07 декабря 2015, 23:02
        0
        Или так
        <script>  
        	function fcreateteg(value) {   
                var allteg=document.getElementsByClassName('ya-site-form__input-text')[0].value+=value+'+'; 
        
            }   
           
        </script>
        что на мой взгляд более симпатично
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          8