Я работаю над формой (вот рабочий пример), которая разработана с помощью html/php.
Фрагменты html/php-код, принадлежащие форме:
echo '<table class = "table table-striped"><thead class = "thead-dark"><tr><th scope = "col"><a class = "btn btn-primary" style = "float:right;" role = "button">Insert ABC</a></th></tr></thead><tbody><tr><td width = "*" valign = "top">';
echo '<form action = "add.php" id = "myform" method = "post">'; // Form START
echo '<input name = "wdate" type = "hidden" id = "wdate" value = "'.$this_date.'">';
echo '<div class = "form-row">';
// Titles
echo '<div class = "form-group col-md-6"><label for = "title_en">Title (EN)</label><input name = "title_en" type = "text" id = "title_en" value = "" class = "form-control"></div>';
echo '<div class = "form-group col-md-6"><label for = "title_fr">Title (FR)</label><input name = "title_fr" type = "text" id = "title_fr" value = "" class = "form-control"></div>';
echo '</div>';
echo '<div class = "form-row">';
// Descriptions
echo '<div class = "form-group col-md-6"><label for = "description_en">Description (EN)</label><textarea rows = "3" name = "description_en" id = "description_en" class = "form-control"></textarea></div>';
echo '<div class = "form-group col-md-6"><label for = "description_fr">Description (FR)</label><textarea rows = "3" name = "description_fr" id = "description_fr" class = "form-control"></textarea></div>';
echo '</div>';
echo '<div class = "form-row">';
// Program
echo '<div class = "form-group col-md-6"><label for = "program_id">Program</label><select class = "form-control" id = "program_id" name = "program_id">';
$programs_list = programList();
foreach($programs_list as $prog){
echo '<option value = "'.$prog['program_id'].'">'.$prog['title_en'].' (ID#'.$prog['program_id'].')</option>';
}
echo '</select></div>';
echo '</div>';
echo '<div class = "form-row">';
// Time selection
date_default_timezone_set('America/Toronto');
$time = date('H:i');
echo '<div class = "form-group col-md-3 bootstrap-timepicker timepicker"><label for = "air_date">Air Date (24 hr)</label><input id = "air_date" name = "air_date" type = "text" class = "form-control input-small" value = "'.$time.'"><span class = "input-group-addon"><i class = "glyphicon glyphicon-time"></i></span>';
?>
'
'
'
'
'
echo '</form>' // Form END
В приведенном выше коде и в рабочий пример в 1-й строке есть кнопка Вставить азбуку. При нажатии этой кнопки форма должна автоматически принимать общие данные следующим образом:
Title (EN): Good Morning.
Title (FR): Bonjour
Description (EN): Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.
Description (FR): Dans la bibliothèque des composants se trouvent le composant Texte modèle qui vous pouvez faire glisser sur le plan de dessin.
Program: ABC (ID#6)
Постановка задачи:
Мне интересно, какие изменения я должен внести в приведенный выше php-код, чтобы при нажатии кнопки «Вставить ABC» заполнялись следующие значения.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны использовать JavaScript для этого.
Добавьте «onClick» к кнопке, которая вызывает функцию. В функции установите значение этих входов.
У меня есть еще один вопрос. Это не похоже. Мне интересно, можете ли вы взглянуть.
Если ваш вывод исходит из PHP, просто добавьте эту дополнительную строку в тег script. Так:
<script>
document.getElementsByClassName("ABC-Fill")[0].addEventListener("click",function(){
let yourForm = document.getElementById("myform");
yourForm.title_en.value = "Good morning.";
yourForm.title_fr.value = "Bonjour";
yourForm.description_en.value = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.";
yourForm.description_fr.value = "Dans la bibliothèque des composants se trouvent le composant Texte modèle qui vous pouvez faire glisser sur le plan de dessin.";
yourForm.program_id.value = 6;
});
</script>
Кроме того, дайте вашей кнопке определенный класс для работы с ней (например, class="ABC-Fill"), например:
<a class = "btn btn-primary ABC-Fill" style = "float:right;" role = "button">Insert ABC</a>
Вот ваша рабочий пример с работающим кодом:
Возможно, вы можете сгенерировать атрибуты data-x, а затем заполнить входные значения этими данными.
HTML:
<form>
First: <input data-default = "First def" class = "put-def" type = "text"/>
Second: <input data-default = "Second def" class = "put-def" type = "text"/>
</form>
<button onClick = "fill();">
Fill!
</button>
JS, например, с JQuery:
function fill(){
$(".put-def").each(function(){
$(this).val($(this).data('default'));
});
}
Рабочий пример: https://jsfiddle.net/fh1xapru/10/
Мне нравится идея задавать значение по умолчанию для каждой строки в атрибуте данных, но я рекомендую использовать тот же атрибут данных для селектора jquery. Мое эмпирическое правило: классы css предназначены для применения стилей, идентификаторы и атрибуты данных — для применения функциональности., т.е. $("[data-default]").each(...)
Может быть :P Я не очень хорошо разбираюсь в рекламе, так что это тоже хороший совет для меня.
В вашем jsfiddle вы использовали document.getElementsByName, и он возвращает NodeList[], а не элемент. Возможно, вам придется использовать document.getElementById, чтобы этот код работал.
<a class = "btn btn-primary" onclick = "myFunction()" style = "float:right;" role = "button">Insert ABC</a>
function myFunction() {
document.getElementById("title_en").value = "Good Morning";
document.getElementById("title_fr").value = "Bonjour";
document.getElementById("description_en").value = "Bonjour";
document.getElementById("description_fr").value = "Bonjour";
document.getElementById("program_id").value = "6";
}
проверьте мою обновленную скрипку в ответе Алана П.. Я отправил это 25 минут назад.
Хорошо, я видел скрипку. В теория должно работать. Проблема в том, что JS Fiddle упаковывает код js в область, в которой ваша форма не может его найти.
Если вы откроете консоль, то увидите сообщение «функция myFunction не существует». И если вы посмотрите, как JS Fiddle отрисовывает ваш код, вы увидите, что function myFunction () находится внутри другой функции, что помещает его НЕ в глобальную область видимости, недоступную для любого элемента html.
Если вам нужна рекомендация, я бы немного изменил html. так:
Удалите onclick = "myFunction()" из html и вместо этого добавьте идентификатор этой кнопки.
<button id = "btn-to-apply-defaults">...
Реструктурируйте функцию, чтобы она выглядела следующим образом:
document.getElementById("btn-to-apply-defaults").addEventHandler("click", function () {
// here go the contents of the original myFunction()
});
Это то, что некоторые назвали бы «ненавязчивым» js, что означает, что js не привязан к элементам непосредственно в самом элементе html, вместо этого вы привязываете событие впоследствии.
Если это все еще не работает, это связано с тем, что кнопка может еще не существовать в DOM, когда вы выполняете getElementById. Это связано с тем, что JS Fiddle вставляет скрипт над в html. У вас есть два варианта:
$(document).on("click", "#btn-to-apply-defaults", function () {
// here go the contents of the original myFunction()
});
Событие привязано к самому document, которое обязательно существует в этот момент, но срабатывает только тогда, когда «currentTarget» равно #btn-to-apply-defaults
Выглядит хорошо. Похоже, что jsfiddle терпит неудачу из-за ошибки jquery, не уверен, почему это так, но похоже на проблему jsfiddle. Вот код в Codepen: codepen.io/anon/pen/YgYevX?editors=1010 Единственное изменение, которое я сделал, это изменить вашу кнопку, чтобы использовать элемент «кнопка» вместо «а» (и удалить «роль = 'кнопка'»)