#javascript #jquery #html #dom
#javascript #jquery #HTML #dom
Вопрос:
Я пытаюсь закрыть родительское окно из дочернего окна с помощью javascript, но это не сработает.
Пожалуйста, поделитесь со мной кодом, если у вас есть какой-либо.
Мой родительский html :
<script>
var winr;
var selfw;
function openAn(){
selfw=self.window;
winr=window.open("shell.htm","");
}
function justClose(){
//setTimeout("closeAfterMin()",2000);
winr.close();
}
function closeAfterMin(){
alert("sd");
selfw.close();
}
</script>
<body onload='openAn()' >
<h1>New Web Project Page</h1>
</body>
Мой дочерний html :
<script>
function closeAll(){
window.parent.close();
}
</script>
<body>
<div onclick="closeAll();" onunload="window.opener.close();">
Close Parent and self
</div>
</body>
Пожалуйста, помогите мне..
Комментарии:
1. Используете ли вы
iframe
внутри родительского окна? И вы хотите закрыть родительское окно внутриiframe
?2. нет, я не использовал ни одного iframe внутри родительского окна
3. Можете ли вы включить код, который вы используете, и / или JSFiddle? Перечисленные решения уже кажутся такими, как будто они должны работать, но у вас они не работают.
4. JavaScript может закрывать только те окна, которые он открыл. Поскольку ваше родительское окно, скорее всего, не было открыто JavaScript, оно не может быть закрыто JavaScript.
5. @TusharAhirrao Вы не используете элемент IFRAME?
Ответ №1:
Этот метод разрешается вызывать только для окон, которые были открыты скриптом с использованием метода window.open. Если окно не было открыто скриптом, в консоли JavaScript появляется следующая ошибка: Скрипты могут не закрывать окна, которые не были открыты скриптом.
Вы можете закрыть дочернее окно из родительского, но не наоборот.
Комментарии:
1. Да, вы можете. Посмотрите мой ответ, пожалуйста.
2. Если вы используете Firefox, вы можете отключить это ограничение только в своем собственном браузере. Посетите
about:config
, затем установитеdom.allow_scripts_to_close_windows
значениеtrue
. Теперь только в вашем браузереwindow.close()
будет работать во всех окнах.
Ответ №2:
Возможно, вы захотите попробовать это
window.opener.close()
Ответ №3:
function closeW() {
window.open('javascript:window.open("", "_self", "");
window.close();', '_self');
}
вызовите описанную выше функцию с таймаутом с дочерней страницы. Это работает в IE, а иногда и в Chrome.
setTimeout(closeW, 500);
Комментарии:
1. «иногда и в Chrome» звучит слишком схематично для использования
Ответ №4:
Обновленный ответ То, что дочерний элемент закрывает родительский, является плохой связью. Мой первоначальный ответ сработал только потому, что мое родительское окно само было открыто через javascript дедушкиным окном!
Правильный способ сделать это, чтобы избежать ненужной связи, состоит в том, чтобы родительское окно опросило дочернее окно, используя setInterval
, для события, которое запускает закрытие. В этом примере этим событием является закрытие дочернего окна. На самом деле я использую это, чтобы обновить часть страницы с помощью ajax, а не закрывать окно, но принцип тот же…
$('#open_child').click(
function(e) {
e.preventDefault();
docs_popup = window.open($('#open_child').attr('href'),'upload_doc');
var timer = setInterval(function() {
if(docs_popup.closed) {
window.close();
}
}, 1000);
return false;
} );
Оригинальный ответ
На самом деле для этого есть довольно простое решение.
Создайте страницу, которая ничего не делает, кроме как закрывается сама, например close.html
:
<!DOCTYPE html>
<html>
<head>
<script>window.close();</script>
</head>
<body>
<p>This window should close automatically.</p>
</body>
</html>
Затем в дочернем окне перенаправьте открыватель на страницу, которая сама закрывается:
window.opener.location.href='close.html';
Комментарии:
1. У вас есть какой-нибудь работающий пример, чтобы показать, как это работает?
2. Я использовал этот метод в системе интрасети для работы.
Ответ №5:
Если вы имеете в виду дочерний фрейм внутри родительского фрейма, то используйте
window.parent.close();
Если вы имеете в виду открытое окно (с помощью window.open()), то попробуйте это
window.opener.close();
Ответ №6:
Есть рабочее решение (по крайней мере, в Chrome):
Вот код для родительской страницы:
<html>
<head>
<script type="text/javascript">
function openChild() {
var w = window.open("parent_close_child.html", "child");
}
</script>
</head>
<body>
<input type="button" value="Open" onclick="openChild()" />
</body>
</html>
Вот код для дочерней страницы:
<html>
<head>
<script type="text/javascript">
function closeParent() {
var w = window.opener;
window.opener = self;
w.close();
}
</script>
</head>
<body>
<input type="button" value="Close parent" onclick="closeParent()" />
</body>
</html>
Просто попробуйте!
Комментарии:
1. Это не работает в Firefox или Chrome. В IE7 сначала запрашивается пользователь.
2. Я только что попробовал это в Chrome, и оно закрывает родительское окно, ничего не спрашивая (хотя, я не знаю почему, вам нужно дважды нажать на кнопку). Но вы правы: это не работает в Firefox и IE.
3. Это закрывает дочернее окно. Требуется два щелчка мыши, потому что при первой попытке закрыть родительское окно (сбой из-за мер безопасности) присваивается
self
window.opener
. Во второй раз оно пытается закрытьсяself
, что допустимо в соответствии с документацией MDN, которую я процитировал в своем ответе.4. Хорошо, правильно. Но, я думаю, мы можем настроить этот код так, чтобы он работал с первого клика. Итак, в Chrome есть решение, но его нет в других браузерах.
5. ЕСЛИ это работает, то, скорее всего, это ошибка, и вы не можете ожидать, что это сработает в будущей версии.
Ответ №7:
function closeAll()
{
window.opener.justClose();
}
Комментарии:
1. родительское окно принадлежит вам? у вас есть контроль над ним?
2. я изменил на
opener
вы заметили?