Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.01.2020, 01:09
Аспирант
Отправить личное сообщение для Leon2110 Посмотреть профиль Найти все сообщения от Leon2110
 
Регистрация: 04.07.2016
Сообщений: 78

Получить текст из строки (без вариантов 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

Последний раз редактировалось Leon2110, 27.01.2020 в 01:12.
Ответить с цитированием
  #2 (permalink)  
Старый 27.01.2020, 08:07
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от Leon2110
у меня проблемы с js и уже долго не могу решить((
Книжки видать так и не читаешь...

Разделяй и властвуй! (с)
<!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>
Ответить с цитированием
  #3 (permalink)  
Старый 27.01.2020, 08:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

видимые текстовые ноды в элементе
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>

Последний раз редактировалось рони, 27.01.2020 в 08:19.
Ответить с цитированием
  #4 (permalink)  
Старый 28.01.2020, 01:24
Аспирант
Отправить личное сообщение для Leon2110 Посмотреть профиль Найти все сообщения от Leon2110
 
Регистрация: 04.07.2016
Сообщений: 78

Спасибо за ответы, они оба рабочие. Я даже на радостях чуть усложнил все) Теперь этот селект может быть в любом месте, в начале, в середине в конце и может быть даже не один.

Взял за основу код рони (хоть он и практически не понятен, но работает сразу с несколькими селектами и влюбом месте).

Скрин: https://i.ibb.co/MZjKJWN/image.jpg

Скрин выше, я добавил в это предложение еще один селект, js успешно отрабатывает и выводит все в input. Чтобы учитель мог сразу сам протестить игру, решил написать мини проверку, ниже есть кнопка, которая аяксом отправляет в php файл эту строку, там эта строка проверяется с правильным ответом из базы и возвращается строка правильно или нет.
В общем после отправки ajax и получения результата на экран, js код заполнения input больше не работает (ошибки js в консоли нет, просто больше не записывает в input ничего). К примеру учитель специально отправил ложный вариант, увидел надпись "ответ не верный!", следом исправляет, отправвляет еще раз на проверку, а инпут больше не меняется и постоянно уже "ответ не верный!", надо обновлять страницу и тогда снова все работает, до отправки на проверку.

Нет мыслей как сделать, чтобы не переставало работать?((


Сообщение от ksa
Книжки видать так и не читаешь...
Постоянно, что-то изучаю, но js плохо дается, вон уже почти сервис по созданию таких мелких игр написал) Будет несколько вариантов игр которые можно создавать, после сделаю возможность создавать тест, под тестом я понимаю оболочку в которую можно включить сколько угодно этих мелких игр и уже эти тесты отдавать ученикам. Работа "бесплатная", но интересная.
Игру где вместо select будут input, то есть не выбор из вариантов, а надо самому слова дописать в предложения, уже сделал. Игра с перетаскиванием слов, тоже почти готова. Вот с этой с выбором из вариантов застрял))

Последний раз редактировалось Leon2110, 28.01.2020 в 01:39.
Ответить с цитированием
  #5 (permalink)  
Старый 28.01.2020, 05:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от Leon2110
и получения результата на экран,
возможно вывод результата некорректен
Ответить с цитированием
  #6 (permalink)  
Старый 28.01.2020, 07:20
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от Leon2110
В общем после отправки ajax и получения результата на экран, js код заполнения input больше не работает
На новом контенте просто нет обработчиков...

Для таких случаев используется делегирование
https://learn.javascript.ru/event-delegation
Или придется каждый раз опять "навешивать" обработчики на новые элементы...
Ответить с цитированием
  #7 (permalink)  
Старый 28.01.2020, 09:39
Аспирант
Отправить личное сообщение для Leon2110 Посмотреть профиль Найти все сообщения от Leon2110
 
Регистрация: 04.07.2016
Сообщений: 78

Вот смотрите, мне кажется что дело не в этом (это не точно). Ниже самой игры, на скрине можно видеть есть кнопка "Отправить на проверку", обычная кнопка:

<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() { }, тогда все работает после нажатия)))
Ошибок в консоли нет, чисто.

Последний раз редактировалось Leon2110, 28.01.2020 в 09:45.
Ответить с цитированием
  #8 (permalink)  
Старый 28.01.2020, 09:44
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от Leon2110
мне кажется что дело не в этом
Так тестируй свой код шаг за шагом и смотри в чем дело... Это и называется "отладкой" алгоритма или программы.
Ответить с цитированием
  #9 (permalink)  
Старый 28.01.2020, 09:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от Leon2110
ans1 = $("#ans1").val();
так делать опасно!

придумайте для переменной другое имя, не совпадающее с любым id на странице.
<input name="ans1" id="ans1" value="">
Ответить с цитированием
  #10 (permalink)  
Старый 28.01.2020, 09:51
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Leon2110,
либо добавьте var

function proverka() {

var ans1 = $("#ans1").val();


иначе строка ans1.value = temp.join(" ") перестанет работать.
можно и тут по изобретать выход,
document.querySelector("#ans1").value = temp.join(" ")

но лучше заменить имя и добавить var.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Раскрывающийся список с объемными текстами morzer Общие вопросы Javascript 4 11.07.2016 14:54
Для события onCLick получить индекс строки и объект грида. progi2007 ExtJS 4 05.08.2009 11:31
Как сделать чтобы text() брал только текст родителя без текста вложенных контейнеров? Andrey32 jQuery 3 23.05.2009 01:33
На входе HTML получить на выходе просто текст, как? Dmitry Общие вопросы Javascript 2 25.08.2008 10:42