Не стандартный поиск на сайте
Здравствуйте. Прошу помочь разобраться с кодом. Есть поиск по сайту от Яндекса. Для упрощения задачи пользователя, хочу сделать так чтобы при клике на характеристики они подставлялись в строку поиска Яндекса.
Задача напрямую с modx не связана, но очень прошу помочь.
Функция подстановки характеристик
Выбор характеристик
Поиск от яндекса
Задача напрямую с 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=""/>
вынести за пределы кода Яндекса то в нее все подставляется, а внутрь кода ни в какую не хочет. В чем может быть проблема? Комментарии: 8
Я не гуру яваскрипта, поэтому не понимаю, как вообще у вас работает подстановка, ведь функция ничего не присваивает инпуту, а только зачитывает его значение.
function fcreateteg(value) { var allteg=document.getElementById('tags').value+=value+'+'; }
Я тоже не очень разбираюсь поэтому и прошу помощи. Но вариант рабочий. При выборе характеристики срабатывает событие
, данная функция
Все работает, но если input находится внутри кода Яндекс поиска, то ничего не получается.
onchange="fcreateteg(value);"
вызывающее функцию fcreateteg(value), данная функция
document.getElementById('tags').value+=value+'+';
извлекает и записывает (добавляет) значение из input с id=«tags». Все работает, но если input находится внутри кода Яндекс поиска, то ничего не получается.
Если убрать скрипт яндекса
<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>
то подставляет. Но где проблема в скрипте?
Точнее не проблема, а что мешает?
Возможно, дело в том, что скрипт яндекса подгружает контент асинхронно и его попросту нет в зоне видимости цепляющей функции.
Не скажу точно, как это переписывается с чистого javascript'a, но в jquery это можно сопоставить примерно с этим:
Не скажу точно, как это переписывается с чистого javascript'a, но в jquery это можно сопоставить примерно с этим:
$("идентификатор").click(function(){
//не будет срабатывать на удовлетворяющий идентификатор, подгруженный через аякс
});
$(document).on('click', 'идентификатор', function(e) {
//тут все ок
});
На 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>
все работает и без него, то есть и подставляет, и осуществляет поиск, но что то мне подсказывает что яндекс будет не в восторге, наверное он там не просто так :)Уже голову сломал?
Все разобрался.
Скрипт Яндекса
Скрипт Яндекса
<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>
И Ура, все работает! Во всяком случае пока.
Или так
<script>
function fcreateteg(value) {
var allteg=document.getElementsByClassName('ya-site-form__input-text')[0].value+=value+'+';
}
</script>
что на мой взгляд более симпатично
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.