Ответ 1
Вместо вызова метода modal show
upfront сначала загрузите все активы, а затем вызовите метод modal show
.
echo "<script>
$(window).load(function(){
$('#thankyouModal').modal('show');
});
</script>";
Релевантная страница здесь: http://marcmurray.net/test_sites/cans/news.php
Я пытаюсь загрузить текстовое подтверждение сообщения некоторое время после того, как пользователь отправит электронное письмо, но не может заставить его работать вообще.
До сих пор я пробовал повторять весь вывод script, запуская script и меняя хэш в URL-адресе и проверяя его, который работал в других областях сайта.
Добавление таких функций, как предупреждения и эхо-текст на странице, работает нормально, но когда я использую метод show, он не работает. Это заставляет меня полагать, что я либо избегаю персонажей, либо неправильно понимаю, как модальность работает немного. Может ли кто-нибудь увидеть, где я запутался?
PHP:
<?php
if(isset($_POST["submit"])) {
// Checking For Blank Fields..
if($_POST["vname"]==""||$_POST["vemail"]==""||$_POST["sub"]==""||$_POST["msg"]==""){
echo "Please fill out everything! We need to know who you are, and why you want to get in touch with us!";}
else
{
// Check if the "Sender Email" input field is filled out
$email=$_POST['vemail'];
// Sanitize E-mail Address
$email =filter_var($email, FILTER_SANITIZE_EMAIL);
// Validate E-mail Address
$email= filter_var($email, FILTER_VALIDATE_EMAIL);
$emailConfirmed=$_POST['vemail'];
if (!$email){
echo "Don't forget to include your email adress! Otherwise we can't get back to you.";
}
else
{
$subject = $_POST['sub'];
$message = $_POST['msg'];
$headers = 'From:' . $emailConfirmed . "\r\n"; // Sender Email
$headers .= 'Cc:' . $emailConfirmed . "\r\n"; // Carbon copy to Sender
// Message lines should not exceed 70 characters (PHP rule), so wrap it
$message = wordwrap($message, 70);
// Send Mail By PHP Mail Function
mail("[email protected]", $subject, $message, $headers);
echo "<script>$('#thankyouModal').modal('show')</script>";
};
}
}
?>
HTML для модального
<div class="modal fade" id="thankyouModal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title" id="myModalLabel">Thank you for pre-registering!</h4>
</div>
<div class="modal-body">
<p>Thanks for getting in touch!</p>
</div>
</div>
</div>
</div>
EDIT: обновленный код будет проще, чем исходный вопрос.
Вместо вызова метода modal show
upfront сначала загрузите все активы, а затем вызовите метод modal show
.
echo "<script>
$(window).load(function(){
$('#thankyouModal').modal('show');
});
</script>";
Вместо того, чтобы повторять script, почему бы просто не обнаружить вашу форму submit с помощью javascript, а затем отобразить модальный?
Что-то вроде
$("form").on('submit', function(){
$('.modal').show();
})
(Если вы используете JQuery)
Первая проблема, которую я вижу в вашем примере кода, не нужна\на следующий код. echo "<script> \
. Удалите его
Второе: включаете ли вы все необходимые js и css файлы для boostrap modal? Если вы не обновляете код со следующими строками кода
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
Наконец, не запускается событие, чтобы открыть boostrap modal. Добавьте следующий код для запуска модального.
$(window).load(function(){
$('#myModal').modal('show');
});
Конечный код:
echo "<script>
var newHTML = document.createElement ('div');
newHTML.innerHTML =
newHTML = document.createElement ('div');
newHTML.innerHTML = ' <div id=\"myModal\" class=\"modal fade\" tabindex=\"-1\" role=\"dialog\"> <div class=\"modal-dialog\"><div class=\"modal-content\"><div class=\"modal-header\"></div>';
document.body.appendChild (newHTML);
$(window).load(function(){
$('#myModal').modal('show');
});
</script>";
Надеюсь, это поможет.
Возможно, это проблема.
echo "<script>$('#thankyouModal').modal('show')</script>";
Я бы сделал это....
$var = "<script>$(document).ready(function(){
$('#thankyouModal').modal('show')
});</script>";
И позже напечатайте его на правой части в вашей голове в html-шаблоне.
Используя вашу опцию и добавив $(document).ready внутри script, вы эхом не думаете, что это сработает... проблема с последней опцией заключается в том, что вы будете эхо из script, но jquery может и не быть полностью загружен, и он не узнает его.
Итак, я предлагаю отправить его в качестве параметра, а затем распечатать.
Если вы не используете фреймворк, и вам сложно передать параметр, вы можете подумать над этим URL и сделать что-то вроде моего project.com/result.php?submit=true
и в вашем интерфейсе вы прочтете эту переменную
Как
if(isset($_GET["submit"]) && ($_GET["submit"]) ){
//echo your modal script
}
Я обнаружил, что .in(устанавливает непрозрачность в 1) класс, который, как мне кажется, должен быть установлен Bootstrap, не отображается после отправки формы.
$('.modal').show().addClass('in');
Btw. у вас есть ошибка в консоли
$(...).parsley(...).on is not a function
$('#thankyouModal').submit(function(e) {
e.preventDefault(); // don't submit multiple times
this.submit(); // use the native submit method of the form element
$('#thankyouModal').modal('show'); //Open the model
});
или Вы можете вручную создать кнопку после отправки формы и нажать на эту кнопку, чтобы открыть модальный.
$('#thankyouModal').click(function(e) {
e.preventDefault(); // don't submit multiple times
$("form").submit(); // use the native submit method of the form element
$('<button type="button" id="btnThankYou" class="hidden" data-toggle="modal" data-target="#thankyouModal">ThankYouButton</button>').appendTo('body');
//This will click the button and open the modal
$("#btnThankYou" ).trigger("click");
});
Как говорится в xkcd149, если вы хотите загрузить модальный файл на одной странице без перезагрузки, вы должны использовать AJAX-запросы:
заменить атрибут onsubmit формы на функцию, которая отправляет данные запроса
window.onload = function() {
var forms = document.getElementsByTagName("form");
for(var f in forms) {
frm[f].onsubmit = xhr; // xhr is the function that sends the XHR
}
}
в функции отправки, используемой выше, добавьте успешные обратные вызовы и ошибки:
function xhr(){
var client = new XMLHttpRequest();
...
client.onerror = xhrerr;
client.onreadystatechange = handler;
client.send(...);
...
}
функция успеха должна отображать модальный, если возвращаемый код HTTP равен 200 (или что вам нужно/нужно)
function handler(){
if (this.readyState == 4 && this.status == 200) {
var widget = document.getElementById("modal-body");
// add content to the body of the modal
} else {
// manage error
}
}
Поместите эти ссылки в свой тег HEAD:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
а затем измените это:
<script>$('#thankyouModal').modal('show')</script>
в
$(document).ready(function(){
<script>$('#thankyouModal').modal('show')</script>
});
$modal = "<script>$(document).ready(function(){
$('#thankyouModal').modal('show')
});</script>";
if(isset($_GET["submit"]) && ($_GET["submit"]) ){
// after running other script
echo $modal;
}
Вы можете попробовать как
$('#thankyouModal').submit(function(e) {
e.preventDefault(); // don't submit multiple times
this.submit(); // use the native submit method of the form element
$('#thankyouModal').modal('show'); //Open the model
});
Возможно, вам нужно отправить форму через ajax, поэтому после отправки события вам не нужно обновлять свою страницу.
Пока вы не обновляете свою страницу, ваш модальный будет успешно загружен.
<?php
if(isset($_POST["submit"])) {
// Checking For Blank Fields..
$checkpost = false;
if($_POST["vname"]==""||$_POST["vemail"]==""||$_POST["sub"]==""||$_POST["msg"]==""){
echo "Please fill out everything! We need to know who you are, and why you want to get in touch with us!";}
else
{
// Check if the "Sender Email" input field is filled out
$email=$_POST['vemail'];
// Sanitize E-mail Address
$email =filter_var($email, FILTER_SANITIZE_EMAIL);
// Validate E-mail Address
$email= filter_var($email, FILTER_VALIDATE_EMAIL);
$emailConfirmed=$_POST['vemail'];
if (!$email){
echo "Don't forget to include your email adress! Otherwise we can't get back to you.";
}
else
{
$checkpost = true;
$subject = $_POST['sub'];
$message = $_POST['msg'];
$headers = 'From:' . $emailConfirmed . "\r\n"; // Sender Email
$headers .= 'Cc:' . $emailConfirmed . "\r\n"; // Carbon copy to Sender
// Message lines should not exceed 70 characters (PHP rule), so wrap it
$message = wordwrap($message, 70);
// Send Mail By PHP Mail Function
mail("[email protected]", $subject, $message, $headers);
echo "<script>$('#thankyouModal').modal('show')</script>";
};
}
} ? >
в html
<?php if($checkpost){ ?>
<script>
$('.modal').show();
</script>
<?php } ?>
Я знаю, что уже слишком поздно, чтобы ответить. Но, надеюсь, это может помочь другим.
Приведенный ниже код работал для меня, когда я использую шаблон Post-Redirect-Get. Откройте модал после отправки формы.
window.onpageshow = function() {
if (typeof window.performance != "undefined"
&& window.performance.navigation.type === 0) {
$('#myModal').modal('show');
}
}