У меня две страницы a.aspx
и b.aspx
. a.aspx
имеют Iframe
и я загружаю страницу b.aspx
в Iframe
. Можно ли вызвать javascript
из b.aspx
в a.aspx
? заранее спасибо
Один из способов сделать это, в котором также будут рассмотрены сценарии, в которых у вас есть другое происхождение для внешней страницы и страницы в IFrame (например, http://site1/a.aspx
и http://site2/b.aspx
) заключается в использовании функции postMessage
.
Это дает дополнительное преимущество, заключающееся в том, что вы "запираетесь" в контракте API между a.aspx
и b.aspx
as, если у вас есть функция DoSomething
в b.apx
которая a.aspx
из a.aspx
, если вы решил переименовать функцию, необходимую для внесения изменений на обе страницы (и любые другие страницы, на которых размещен a.aspx
в a.aspx
). Если вы используете подход postMessage
, единственным местом, которое вам нужно будет изменить, будет слушатель для события "message" в b.aspx
.
Если вы поместите следующий код в a.aspx
:
function sendMessageToEveryIFrame(message)
{
/// <summary>Call a function against all frames</summary>
var frames = document.getElementsByTagName('iframe');
for (var i = 0; i < frames.length; i++)
{
try
{
var frame = frames[i];
frame.contentWindow.postMessage(message, "*");
}
catch (e)
{
// Code to handle errors would go here!
}
}
}
Затем вы можете вызвать его (возможно, нажатием кнопки для тестирования):
sendMessageToEveryIFrame('Test message!');
Затем вам нужен код в b.aspx
который реагирует на входящие сообщения, например:
// This wires up your function that processes the message
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
// logic that reacts to the event/message goes here
alert(event.data);
}
Когда вы нажимаете кнопку в a.aspx
в браузере (или что-то еще, что вы используете для запуска вызова), b.aspx
должно b.aspx
окно предупреждения, содержащее текст "Test message!".
Функция receiveMessage
может отправить запрос и эффективно действовать в качестве брокера. Итак, если у вас есть две функции внутри b.aspx
которые вы хотели вызвать, вы можете переписать код следующим образом:
В a.aspx
:
function callFrameFunction(functionName, parameters)
{
/// <summary>Call a function against all frames</summary>
var frames = document.getElementsByTagName('iframe');
for (var i = 0; i < frames.length; i++)
{
try
{
var frame = frames[i];
var message =
{
Function: function,
Parameters : parameters
};
frame.contentWindow.postMessage(message, "*");
}
catch (e)
{
// Code to handle errors would go here!
}
}
}
Это означает, что callFrameFunction
принимает два параметра, имя функции и параметры для этой функции. Затем вы обновите код в b.aspx
чтобы он выглядел следующим образом:
// This wires up your function that processes the message
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
// logic that reacts to the event/message goes here
switch(event.data.FunctionName)
{
case "function 1":
alert('Function called was \'function 1\'');
break;
case "function 2":
alert('Function called was \'function 2\'');
break;
}
}
Вы можете заменить вызовы на alert
вызовами своих функций, передавая значения в параметрах event.data.Parameters
если это необходимо.
Скажем, у вас есть следующая функция javascript в b.aspx
.
function DoSomething()
{
//Do you required tasks
}
И вы хотите вызвать эту функцию в a.aspx
. a.aspx
имеет b.aspx
загружен и iframe следующим образом.
<iframe id="fraExample" name="fraExample" scrolling="no" src="b.aspx"></iframe>
Так вы b.aspx
функцию DoSomething, написанную в b.aspx
из функции, написанной в a.aspx
function CallFunction()
{
// This function will be in a.aspx
// some tasks
var bFrame = document.getElementById('fraExample'); // Get the iframe
bFrame.contentWindow.DoSomething();
// some other tasks
}
Это должно сработать для вас хорошо и легко!