我有一个使用Bootstrap 3的网页。在这个页面中,我需要一个人可以回答的文本区域。答案是故事问题。故事问题出现在模态对话框中。可以在此Bootply中查看设置。代码如下所示:
<div class="container">
<form>
<div class="form-group">
<label>Answer (<a id="showProblemLink" href="#">view problem</a>)</label>
<textarea class="form-control" rows="7"> </textarea>
</div>
</form>
<div id="problemModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<p>
The local school wants a new playground.
The lot they can use for the playground is shaped like a rectangle.
The school has decided to let the students design the new playground.
The students have decided that they want 1/4 of the playground to be a football field.
Another 3/8 of the lot will be used for a basketball court.
How much of the lot is remaining for the slides and swings?
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>
我的用户希望能够在输入答案时在模态窗口中打开故事问题。这将让他们仔细检查他们的答案。显而易见的答案是让他们重新打开对话框。但是,显然,这还不够好。我真的需要保持对话框打开,让用户在其后面/下面的文本区域中输入数据。对我来说似乎很奇怪。但是,这就是我要做的事情。
我的问题是,当我点击textarea
时,对话框消失了。我尝试添加data-backdrop="false"
。虽然保持对话框打开,但它并没有让我实际编辑textarea
。我错过了什么?
答案 0 :(得分:4)
实际上,让完全你想要的东西非常简单。
您实际需要的是对话,而不是模态。
这是使用jQuery UI对话的working example。
<强>解释强>
这是关于它的SO discussion
有关示例的一些详细信息:
默认情况下,标题可以拖动对话框。我保持示例类似于你的模态,所以我使用:
取出标题dialogClass: 'dialog-modal'
和
.dialog-modal .ui-dialog-titlebar {
display:none;
}
为了使整个对话框可以拖动我使用:
draggable: false
和
.parent().draggable();
如果您确实需要标题,则可以删除所有这些部分。这是example with a header
答案 1 :(得分:2)
我的问题是,当我点击textarea时,对话框消失了。一世 尝试添加data-backdrop =“false”。
这是因为你实际上没有点击textarea,你点击了一个覆盖元素,它会在点击时关闭模态。
我不确定删除叠加元素是否能够在文本区域输入,但即便如此,我认为这不是一个好主意(删除叠加层并且能够在模态为时执行某些操作还在吗。
所以我的建议是: 点击时在模态上有一个按钮,它应该显示另一个textarea。当您在textarea上输入内容时,它会更新主文本区域内的内容。
所以这是新模式:
见工作example。
答案 2 :(得分:2)
您想要实现的目标并非易事。
我知道您希望节省页面空间,这就是为什么我会建议最干净的选项,并且最接近您要实现的目标:Bootstrap Collapse
答案 3 :(得分:1)
我能想到的一些解决方案是:
将您的回答textarea
移至包含问题的对话框。
或使用popover而不是模态。
所以here is my example使用弹出而不是模态。
Stackoverflow片段,看起来很糟糕,因为它缺少所有引导样式,所以检查bootply链接:
$(".pop-div > a").popover({
html: true,
placement: "left",
trigger: "click",
title: function() {
return $(this).siblings('.pop-title').text()
},
content: function() {
return $(this).siblings('.pop-content').text()
}
});
.pop-div {
display: inline;
}
.pop-title,
.pop-content {
display: none;
}
.popover-title {
font-size: 15px;
}
.popover-content {
font-size: 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<div class="container">
<form>
<div class="form-group">
<label>Answer (
<div class="pop-div">
<a href="javascript:void(0);">view problem</a>
<div class="pop-title">Question</div>
<div class="pop-content">
<p>
The local school wants a new playground. The lot they can use for the playground is shaped like a rectangle. The school has decided to let the students design the new playground. The students have decided that they want 1/4 of the playground to be a football
field. Another 3/8 of the lot will be used for a basketball court. How much of the lot is remaining for the slides and swings?
</p>
</div>
</div>
)</label>
<textarea class="form-control" rows="7"></textarea>
</div>
</form>
</div>
答案 4 :(得分:0)
由于这是一个奇怪的问题,这需要一些小小的问题,但这是我提出的解决方案。
我在内部创建了隐藏在视图中的模态,并将捕获模态打开时完成的任何输入。当用户关闭模态时,焦点将被发送回真正的文本区域。
HTML(略有修改):
<div class="container">
<form>
<div class="form-group">
<label>Answer (<a id="showProblemLink" href="#">view problem</a>) </label>
<textarea id="outside-modal" class="form-control" rows="7"> </textarea>
</div>
</form>
<div id="problemModal" class="modal" tabindex="-1" role="dialog" data-backdrop="false">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<p>
The local school wants a new playground.
The lot they can use for the playground is shaped like a rectangle.
The school has decided to let the students design the new playground.
The students have decided that they want 1/4 of the playground to be a football field.
Another 3/8 of the lot will be used for a basketball court.
How much of the lot is remaining for the slides and swings?
</p>
<textarea id="inside-modal"></textarea>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>`
CSS:
textarea#inside-modal {
position:absolute;
left:-4000px;
}
jQuery的:
$("#showProblemLink").on("click", function() {
//show the modal
$('#problemModal').modal('show');
//fill the hidden textarea with the real textarea's contents
$('#problemModal textarea#inside-modal').val($('textarea#outside-modal').val());
//capture user input in modal and send to outside textarea
$('#problemModal textarea#inside-modal').on('input',function(e) {
//fill the outside textarea with the inside textarea's contents
$('textarea#outside-modal').val($('textarea#inside-modal').val());
}).focus();
});
//when modal closed, send focus back to textarea
$("#problemModal").on('hidden.bs.modal',function() {
$('textarea#outside-modal').focus();
});
请参阅this bootply
答案 5 :(得分:0)
另一种解决方案是使用Popover,在textarea的焦点事件中,你有一个“类似模态”的功能。
这样做的好处是,您可以保留用户专注于哪个textarea属于哪个故事的能力,就像当您删除叠加层时,您可能会丢失需要模态的位置的上下文,或者用户执行的操作如打开多种模态等。
答案 6 :(得分:0)
我制作了一个代码段here,可以满足您的需要,我会在显示模式时使用textarea
和event.key
手动输入event.keyCode
。
var $text = $('#textarea');
var backEdit = false;
var $modal = $('#problemModal');
$("#showProblemLink").on("click", function() {
$modal.modal('show');
});
$modal.on('shown.bs.modal', function() {
backEdit = true;
})
$modal.on('hidden.bs.modal', function() {
backEdit = false;
})
$(document).keypress(function(e) {
if (backEdit) {
var keyCode = e.keyCode;
formatTextArea(keyCode);
}
});
function formatTextArea(keycode) {
var val = $text.val();
var caretPos = $text[0].selectionStart;
var textAreaTxt = $text.val();
$text.val(textAreaTxt.substring(0, caretPos) + String.fromCharCode(keycode) + textAreaTxt.substring(caretPos));
}
&#13;
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<div class="container">
<form>
<div class="form-group">
<label>Answer (<a id="showProblemLink" href="#">view problem</a>)</label>
<textarea class="form-control" rows="7" id="textarea"></textarea>
</div>
</form>
<div id="problemModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-body">
<p>
The local school wants a new playground. The lot they can use for the playground is shaped like a rectangle. The school has decided to let the students design the new playground. The students have decided that they want 1/4 of the playground to be a football
field. Another 3/8 of the lot will be used for a basketball court. How much of the lot is remaining for the slides and swings?
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>
&#13;
答案 7 :(得分:0)
模态是每个定义'模态'又名'总是在顶部对话框',所以你所要做的就是使它非模态,使用你的html布局这可以通过jQuery完成:
$('#problemModal').removeClass('modal')
.hide()
.css('position','absolute')
.css('top',0)
.css('left',(screen.width - $('#problemModal').width())/2);
$("#showProblemLink").on("click", function() {
$('#problemModal').show();
});
$('#modal-close-btn').click(function(){
$('#problemModal').hide();
});
这是一个有效的Bootply作为演示。
答案 8 :(得分:0)
您可以停用模式&#34;强制对焦&#34; (例如:通过删除文档事件&#34; focusin.modal&#34;来阻止外部文本区域的编辑:
$("#problemModal").on("shown.bs.modal", function() {
$(document).off("focusin.modal");
});
如果你想在模态打开后将光标聚焦在textarea上,只需添加$("textarea").focus();
$("#problemModal").on("shown.bs.modal", function() {
$(document).off("focusin.modal");
$("textarea").focus();
});