Dlaczego ten skrypt DateTimePicker powoduje, że IE6 i IE7 nie ładują strony
Mam kilka stron w witrynie ASP.NET MVC 3, które powodują, że IE6 i 7 pytają „Nie można załadować strony” po załadowaniu menu. Udało mi się rozwiązać ten problem w następujący sposóbDateTimePicker
scenariusz:
<script type="text/javascript">
$('#StartDateTime').datetimepicker({
onClose: function(dateText, inst) {
var endDateTextBox = $('#EndDateTime');
if (endDateTextBox.val() != '') {
var testStartDate = new Date(dateText);
var testEndDate = new Date(endDateTextBox.val());
if (testStartDate > testEndDate)
endDateTextBox.val(dateText);
}
else {
endDateTextBox.val(dateText);
}
},
onSelect: function (selectedDateTime){
var start = $(this).datetimepicker('getDate');
$('#EndDateTime').datetimepicker('option', 'minDate', new Date(start.getTime()));
}
});
$('#EndDateTime').datetimepicker({
onClose: function(dateText, inst) {
var startDateTextBox = $('#StartDateTime');
if (startDateTextBox.val() != '') {
var testStartDate = new Date(startDateTextBox.val());
var testEndDate = new Date(dateText);
if (testStartDate > testEndDate)
startDateTextBox.val(dateText);
}
else {
startDateTextBox.val(dateText);
}
},
onSelect: function (selectedDateTime){
var end = $(this).datetimepicker('getDate');
$('#StartDateTime').datetimepicker('option', 'maxDate', new Date(end.getTime()) );
}
});
</script>
Uważam, że to błąd, który rzuca:
Błąd analizowania HTML: nie można zmodyfikować macierzystego elementu kontenera przed zamknięciem elementu podrzędnego
Teraz rozwiązałem ten problem, ale chcę to wiedziećdlaczego tak się dzieje? Czy to błąd w niektórych wersjach IE? Zauważyłem, że podczas jednej instalacji IE7, jeśli zainstalujesz standardowe aktualizacje, błąd zniknie, a niektórzy ludzie powiedzieli, że mieli błąd na IE8.
Zasadniczo problem polega na tym, że mam stronę układu MVC, która wygląda tak:
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
<section>
@RenderBody()
</section>
<footer>
</footer>
</body>
</html>
A strony, które mają ten problem, zawierają coś takiego:
<h2>Test</h2>
<form action="/Home/Test" data-ajax="true" data-ajax-loading="#loading-progress"
data-ajax-method="GET" data-ajax-mode="replace" data-ajax-update="#results"
id="form0" method="post">
Start Time
<br />
<input data-val="true" data-val-required="The StartDateTime field is required."
id="StartDateTime" name="StartDateTime" type="text" value="" />
<br />
End Time
<br />
<input data-val="true" data-val-required="The EndDateTime field is required."
id="EndDateTime" name="EndDateTime" type="text" value="" /> <br />
<br />
<input type="submit" value="Search" />
<img id="loading-progress" src="../../Content/images/ajax-loader.gif" alt="loading"/>
</form>
<div id="results"></div>
Następuje powyższy skrypt. Więc strona ze skryptem jest renderowana wewnątrz<section>
etykietka.
Aby rozwiązać problem, wszystko, co należy zrobić, to oddzielićform
zscript
więc wszystko, co zrobiłem, to renderowanie formularza w@RenderBody()
jak widać poniżej i skrypt w@RenderSection("Scripts")
.
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
<section>
@RenderBody()
</section>
<footer>
</footer>
@RenderSection("scripts", false)
</body>
</html>
Więc to naprawiło pytanie, ale dlaczego? Zrobił<section>
tag musi zostać zamknięty przed skryptem? Co ciekawsze, jest to tylko problem na stronach zDateTimePicker
scenariusz. Mam wiele stron z podobnym i bardziej złożonym skryptem, który nie ma problemów.