Есть ли шанс, что этот код Как проанализировать значение из popover to textbox? будет ли работать также с бета-версией Bootstrap 4? Я пытался изменить этот код, но не могу понять. Кто-нибудь может помочь? Спасибо.
Передать всплывающее окно со значением для ввода
Ответы:
Идея, лежащая в основе ответа на упомянутый вариант Bootstrap 3, остается в силе, и она работает и в Bootstrap 4. Я создал свою версию этого в среде Bootstrap 4 во фрагменте ниже.
Смотрите некоторые пояснения в комментариях.
$(function() {
var popover = $('[data-toggle="popover"]');
// Popover init
popover.popover({
'content' : $('#popover-content').html(),
'html' : true,
'placement' : 'auto',
});
// Listen to delegated 'change' events, filtered to `.popover select`
$(document).on('change', '.popover select', function() {
// `this` is the <select> now
// No need to find :selected, use $select.val()
var selected = $(this).val();
$('#input').val(selected);
popover.popover('hide');
});
});
<input id="input" type="text" class="form-control" data-toggle="popover" placeholder="placeholder"/>
<div id="popover-content" style="display:none;">
<select>
<option>Please select</option>
<option value="yes">Yes</option>
<option value="no">No</option>
</select>
</div>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
ОБНОВЛЕНИЕ: для устранения события клика и поддержки нескольких полей ввода.
Первый фрагмент ниже следует логике предыдущего кода с событием change
, но теперь прослушивает событие click
дополнительной кнопки «отправить». Чтобы это работало, пришлось изменить селектор делегированного прослушивателя событий и соответствующим образом скорректировать обработчик кода.
$(function() {
var popover = $('[data-toggle="popover"]');
// Popover init
popover.popover({
'content' : $('#popover-content').html(),
'html' : true,
'placement' : 'auto',
});
// Listen to delegated 'click' events, filtered to `.popover`
$(document).on('click', '.popover', function(event) {
// `this` is the '.popover' now
// `event.target` is the clicked element
// If clicked element was not a `.btn` then return
if (!$(this).find('.btn').filter(event.target).length) {
return;
}
// Finding <select> in popover and grab its selected value
var selected = $(this).find('select').val();
$('#input').val(selected);
popover.popover('hide');
});
});
<input id="input" type="text" class="form-control" data-toggle="popover" placeholder="placeholder"/>
<div id="popover-content" style="display:none;">
<select>
<option>Please select</option>
<option value="yes">Yes</option>
<option value="no">No</option>
</select>
<a href="#" class="btn btn-primary">OK</a>
</div>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
Хотя это все еще просто с парой строк кода, его трудно расширить для использования более чем с одним полем ввода, поскольку $('#input')
жестко запрограммировано в обработчике. Так было и в первом примере.
Итак, наконец, я придумал другой подход, который связывает событие click
с методом .one()
jQuery с самим всплывающим окном. При этом можно относительно ссылаться на несколько полей ввода и соответствующие всплывающие окна.
$(function() {
var inputs = $('[data-toggle="popover"]');
// Popover init
inputs.popover({
'content' : $('#popover-content').html(),
'html' : true,
'placement' : 'auto',
});
inputs.on('shown.bs.popover', function() {
// 'aria-describedby' is an attribute set by Bootstrap indicationg the #id of popover
var popover = $('#' + $(this).attr('aria-describedby'));
// jQuery.one(events [, selector ] [, data ], handler);
// Passing references to <select> and <input> with `data` to `handler`
popover.one('click', '.btn', {
'$select' : popover.find('select'),
'$input' : $(this),
}, function(event) {
// `event.data.$select` === `popover.find('select')`, the <select> in the popover
var selected = event.data.$select.val();
event.data.$input
.val(selected)// set the value of <input>
.popover('hide');// hide the popover
});
});
});
<input type="text" class="form-control" data-toggle="popover" placeholder="placeholder 1"/>
<input type="text" class="form-control" data-toggle="popover" placeholder="placeholder 2"/>
<input type="text" class="form-control" data-toggle="popover" placeholder="placeholder 3"/>
<div id="popover-content" style="display:none;">
<select>
<option>Please select</option>
<option value="yes">Yes</option>
<option value="no">No</option>
<option value="maybe">Maybe</option>
</select>
<a href="#" class="btn btn-primary">OK</a>
</div>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
click
и предлагается новый подход, который также работает с несколькими входными данными. 16.12.2017