Получить текст из строки (без вариантов select)
Всем привет, снова у меня проблемы с js и уже долго не могу решить((
Есть html код:
<h2 id="zadanie">
John is
<select class="input">
<option>a</option>
<option>an</option>
<option>are</option>
</select>
honest person</h2>
Есть скрытый input, куда надо поместить текст из строки выше, без html тегов и без вариантов select: <input type="hidden" name="ans1" id="ans1" value=""> Максимум что смог написать это:
test1 = document.getElementById('zadanie').textContent;
document.getElementById('ans1').value=test1;
Этот js вызывается, каждый раз когда я выбираю что-то в select. Данный код, записывает в скрытый инпут так: John is aanarean honest person а надо чтобы было так (к примеру в select выбран вариант 'an'): John is an honest person |
Цитата:
Разделяй и властвуй! (с)
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<!--
<script src='https://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
document.addEventListener('DOMContentLoaded',function(){
document.querySelector('#test select').addEventListener('change',text);
text();
function text(){
var o=document.querySelectorAll('#test span');
var txt=o[0].textContent;
txt+=' '+document.querySelector('#test select').value;
txt+=' '+o[1].textContent;
alert(txt);
};
});
</script>
</head>
<body>
<p id="test">
<span>John is</span>
<select class="input">
<option value='a'>a</option>
<option value='an'>an</option>
<option value='are'>are</option>
</select>
<span>honest person</span>
</p>
</body>
</html>
|
видимые текстовые ноды в элементе
Leon2110,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<script>
document.addEventListener( "DOMContentLoaded" , function() {
zadanie.addEventListener("change", function(event) {
for (var parent, txt, node, temp = [], textNodes = document.createTreeWalker(this, NodeFilter.SHOW_TEXT, null, false); node = textNodes.nextNode();) {
txt = node.nodeValue.trim();
parent = node.parentNode;
if(parent == this || parent.selected) txt && temp.push(txt);
}
ans1.value = temp.join(" ")
})
});
</script>
</head>
<body>
<h2 id="zadanie">
John is
<select class="input" >
<option>a</option>
<option>an</option>
<option>are</option>
</select>
honest person</h2>
<input name="ans1" id="ans1" value="">
</body>
</html>
|
Спасибо за ответы, они оба рабочие. Я даже на радостях чуть усложнил все) Теперь этот селект может быть в любом месте, в начале, в середине в конце и может быть даже не один.
Взял за основу код рони (хоть он и практически не понятен, но работает сразу с несколькими селектами и влюбом месте). Скрин: https://i.ibb.co/MZjKJWN/image.jpg Скрин выше, я добавил в это предложение еще один селект, js успешно отрабатывает и выводит все в input. Чтобы учитель мог сразу сам протестить игру, решил написать мини проверку, ниже есть кнопка, которая аяксом отправляет в php файл эту строку, там эта строка проверяется с правильным ответом из базы и возвращается строка правильно или нет. В общем после отправки ajax и получения результата на экран, js код заполнения input больше не работает (ошибки js в консоли нет, просто больше не записывает в input ничего). К примеру учитель специально отправил ложный вариант, увидел надпись "ответ не верный!", следом исправляет, отправвляет еще раз на проверку, а инпут больше не меняется и постоянно уже "ответ не верный!", надо обновлять страницу и тогда снова все работает, до отправки на проверку. Нет мыслей как сделать, чтобы не переставало работать?(( Цитата:
Игру где вместо select будут input, то есть не выбор из вариантов, а надо самому слова дописать в предложения, уже сделал. Игра с перетаскиванием слов, тоже почти готова. Вот с этой с выбором из вариантов застрял)) |
Цитата:
|
Цитата:
Для таких случаев используется делегирование https://learn.javascript.ru/event-delegation Или придется каждый раз опять "навешивать" обработчики на новые элементы... |
Вот смотрите, мне кажется что дело не в этом (это не точно). Ниже самой игры, на скрине можно видеть есть кнопка "Отправить на проверку", обычная кнопка:
<button type="button" class="btn btn-leo btn-success btn-icon-fixed" onclick="proverka()"><span class="icon-paper-plane"></span>Отправить на проверку</button> Еще чуть ниже кнопки, блок, куда аяксом загружается строка, верно или не верно: <div id="result_divs"> <div id="download_img" style="display:none;"><img src="img/loading.gif" width="100" height="100" /></div> </div> Ну и в самом низу, мой примитивный обработчик, он отправляет ид игры и строку ответа ans1 в пхп файл и оттуда возвращается верно или нет (текст):
<script>
function proverka() {
ans1 = $("#ans1").val();
// game_id = <?php echo $edit_id; ?>;
//Показываем картинку загрузки
//$('div#download_img').css('display', 'block');
//Отправляем ajax-запрос
//$.ajax({
// type:"POST",
// url:"php/test_rez.php",
// data: {"ans1":ans1, "game_id":game_id},
// cache: false,
//success: function(responce){
//Загружаем результат в блок с id=result_divs и прячем картинку загрузки
//$('div#result_divs').html(responce);
// $('div#download_img').css('display', 'none');
//}
// })
}
</script>
Как видно, я почти всю кухню с отправкой аякс закоментарил, ради теста, и даже в этом случае, после нажатия кнопки "Отправить на проверку", js с заполнением input больше не работает(( Думаю что-то не так с ans1 = $("#ans1").val(); - если комментарю и ее, тоесть остается пустая функция function proverka() { }, тогда все работает после нажатия))) Ошибок в консоли нет, чисто. |
Цитата:
|
Цитата:
придумайте для переменной другое имя, не совпадающее с любым id на странице. <input name="ans1" id="ans1" value=""> |
Leon2110,
либо добавьте var
function proverka() {
var ans1 = $("#ans1").val();
иначе строка ans1.value = temp.join(" ") перестанет работать. можно и тут по изобретать выход,
document.querySelector("#ans1").value = temp.join(" ")
но лучше заменить имя и добавить var. |
| Часовой пояс GMT +3, время: 00:08. |