Мы не можем привязать это к setTimeout()
, поскольку он всегда выполняется с глобальным объектом (Window), если вы хотите получить доступ к контексту this
в функции обратного вызова, а затем с помощью bind()
к функции обратного вызова, которую мы можем достичь как:
setTimeout(function(){
this.methodName();
}.bind(this), 2000);
Не путать с CORS !
Вы не можете получить доступ к <iframe>
с разным началом с использованием JavaScript, это было бы огромным недостатком безопасности, если бы вы могли это сделать. Для браузеров того же происхождения блокируют сценарии, пытающиеся получить доступ к кадру с другим происхождением.
Происхождение считается другим, если не поддерживается хотя бы одна из следующих частей адреса:
<protocol>://<hostname>:<port>/path/to/page.html
Протокол, имя хоста и порт должны быть одинаковыми для вашего домена, если вы хотите получить доступ к кадру.
Вот что произойдет, пытаясь получить доступ к следующим URL-адресам из http://www.example.com/home/index.html
URL RESULT
http://www.example.com/home/other.html -> Success
http://www.example.com/dir/inner/another.php -> Success
http://www.example.com:80 -> Success (default port for HTTP)
http://www.example.com:2251 -> Failure: different port
http://data.example.com/dir/other.html -> Failure: different hostname
https://www.example.com/home/index.html.html -> Failure: different protocol
ftp://www.example.com:21 -> Failure: different protocol & port
https://google.com/search?q=james+bond -> Failure: different hostname & protocol
-origin блокирует скрипты от доступа к содержимому сайтов с другим происхождением, если у вас есть обе страницы, вы можете обойти эту проблему, используя window.postMessage
и ее относительное message
событие для отправки сообщений между двумя страницами, например:
var frame = document.getElementById('your-frame-id');
frame.contentWindow.postMessage(/*any variable or object here*/, '*');
<iframe>
(см. основную страницу): window.addEventListener('message', function(event) {
// IMPORTANT: Check the origin of the data!
if (~event.origin.indexOf('http://yoursite.com')) {
// The data has been sent from your site
// The data sent with postMessage is stored in event.data
console.log(event.data);
} else {
// The data hasn't been sent from your site!
// Be careful! Do not use it.
return;
}
});
Этот метод может применяться в обоих направлениях, создавая слушателя на главной странице и получая ответы от фрейма. Та же логика также может быть реализована во всплывающих окнах и в основном в любом новом окне, создаваемом главной страницей (например, с использованием window.open()
), без какой-либо разницы.
Уже есть некоторые хорошие ответы на эту тему (я просто нашел их googling), поэтому для браузеров, где это возможно, ll ссылку относительный ответ. Однако помните, что отключение политики одного и того же происхождения (или CORS) повлияет только на на ваш браузер . Кроме того, при запуске браузера с настройками безопасности с одинаковым исходным кодом отключены доступ к веб-сайту для ресурсов с перекрестными источниками, поэтому он очень опасен и должен выполняться только для целей разработки.
Проверьте веб-сервер домена для конфигурации http://www.<domain>.com
для X-Frame-Options
. Это функция безопасности, предназначенная для предотвращения атак типа clickJacking,
Технически зло имеет iframe
с источником на страницу жертвы.
<html>
<iframe src='victim_domain.com'/>
<input id="username" type="text" style="display: none;/>
<input id="password" type="text" style="display: none;/>
<script>
//some JS code that click jacking the user username and input from inside the iframe...
<script/>
<html>
Если вы хотите, чтобы запрос веб-сервера отображался в iframe
, добавьте x- frame-options
Параметры X-Frame DENY
Возможные варианты:
- SAMEORIGIN / / разрешить только моему собственному домену, сделать мой HTML внутри iframe.
- DENY // не разрешать отображение моего HTML внутри любого iframe
- "ALLOW-FROM https : //example.com/ "// разрешить определенному домену отображать мой HTML внутри iframe
Это пример конфигурации IIS:
<httpProtocol> <customHeaders> <add name="X-Frame-Options" value="SAMEORIGIN" /> </customHeaders> </httpProtocol>
Решение вопроса
Если веб-сервер активировал функцию безопасности, это может привести к безопасности на стороне клиента как следует.
В дополнение к ответу Марко Бонелли: лучший текущий способ взаимодействия между фреймами / фреймами использует window.postMessage
, , поддерживаемый всеми браузерами
window.postMessage
, будет только дублировать принятый ответ, который я уже упоминаю. Кроме того, существенное значение, которое добавляет мой ответ, - это именно ссылка на внешнюю документацию.
– Geert
4 April 2016 в 12:42
Мое приложение разбилось с помощью SecurityError
, если оно помещено внутри iframe
. Проблема заключалась в том, что .animate({scrollTop: top}, 0)
jQuery был применен непосредственно на window
.
Удаление LOC устранило проблему для нас.
Для меня я хотел реализовать двухстороннее рукопожатие, то есть: - родительское окно будет загружаться быстрее iframe - iframe должен поговорить с родительским окном, как только он будет готов - родитель готов получить iframe message и replay
этот код используется для установки белой метки в iframe с использованием [CSS custom property] кода: iframe
$(function() {
window.onload = function() {
// create listener
function receiveMessage(e) {
document.documentElement.style.setProperty('--header_bg', e.data.wl.header_bg);
document.documentElement.style.setProperty('--header_text', e.data.wl.header_text);
document.documentElement.style.setProperty('--button_bg', e.data.wl.button_bg);
//alert(e.data.data.header_bg);
}
window.addEventListener('message', receiveMessage);
// call parent
parent.postMessage("GetWhiteLabel","*");
}
});
parent
$(function() {
// create listener
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message";
eventer(messageEvent, function (e) {
// replay to child (iframe)
document.getElementById('wrapper-iframe').contentWindow.postMessage(
{
event_id: 'white_label_message',
wl: {
header_bg: $('#Header').css('background-color'),
header_text: $('#Header .HoverMenu a').css('color'),
button_bg: $('#Header .HoverMenu a').css('background-color')
}
},
'*'
);
}, false);
});
Естественно, вы можете ограничить исход и текст, это легко работать с кодом. Я нашел этот пример полезным: [Междоменные сообщения с postMessage]
Access-Control-Allow-Origin
не применяется к iFrames, только к XHR, Fonts, WebGL иcanvas.drawImage
. Я считаю, чтоpostMessage
- единственный вариант. – snappieT 14 January 2015 в 13:12iframe.src
, и если сайт отличается от имени хоста вашего домена, вы не сможете получить доступ к этому фрейму. – Marco Bonelli 17 October 2015 в 09:34~
возвращает дополнение 2 к числу, поэтомуn
становится-n-1
, а это означает, что только-1
станет0
(который интерпретируется какfalse
), и любое другое значение пройдет тест. И.Е.0 = -(-1)-1
, а не-(-1+1)
. – Marco Bonelli 8 November 2016 в 07:18