Вызовите javascript из Iframe на страницу aspx [дублировать]

1

У меня две страницы a.aspx и b.aspx. a.aspx имеют Iframe и я загружаю страницу b.aspx в Iframe. Можно ли вызвать javascript из b.aspx в a.aspx? заранее спасибо

  • 0
    покажи свой код, который ты уже сделал
  • 0
    Вы имеете в виду iFrame?
Теги:
iframe

2 ответа

1

Один из способов сделать это, в котором также будут рассмотрены сценарии, в которых у вас есть другое происхождение для внешней страницы и страницы в 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 если это необходимо.

1

Скажем, у вас есть следующая функция 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
}

Это должно сработать для вас хорошо и легко!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню