Как я могу получить доступ к функциям, заключенным в $ (document) .ready (function () {}) iframe? - PullRequest
5 голосов
/ 06 октября 2011

Итак, у меня есть iframe, некоторые функции которого заключены в $ (document) .ready (function () {}), как это.

<script>
    $(document).ready(function(){
        function foo(){
            // do some stuff
        }
    });
</script>

Я знаю, что могу получить доступ к DOM с помощью чего-токак $ ('iframe'). contents (). find ('что-то'), но могу ли я получить доступ к функции foo () сверху?

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

Вы не можете получить доступ к переменным в этой функции готовности iframe по той же причине, по которой вы не можете получить доступ к локальным переменным любой другой функции (вы не можете «опуститься» в области видимости).Однако, если вы можете изменить код в iframe, вы всегда можете увеличить его.Итак, в вашем коде iframe:

$(document).ready(function() {
    function func1() {
        alert("Function in iframe");
    }

    parent.iframeFunctions = {
        test: func1
    }
});

Следующая проблема заключается в том, что вам нужно иметь доступ к функции.Вы не можете использовать обычный готовый документ jquery, потому что iframe не завершает загрузку, когда DOM родительской страницы готов, и, следовательно, ваш объект iframeFunctions все еще не определен на родительской странице.Вам нужно это:

$(window).load(function() {
    iframeFunctions.test();
});

Однако вы можете получить доступ к глобальному пространству iframe.О да, пока все это предполагает, что источник iframe находится в рамках одной политики домена.Если нет, то нужно проделать гораздо больше работы, а во многих случаях это даже не стоит.Например, объект jquery находится в глобальном пространстве, так что вот как вы получаете в jquery iframe:

$("iframe")[0].contentWindow.$("#divInIframe")

Итак, если вы изменили содержимое источника iframe, чтобы использовать выражения функций вместо функцийdeclartions:

var func1 = function() {
    alert("Function in iframe");
}

$(document).ready(function() {
    func1();
});

Вы также сможете получить к нему доступ от родителя (после того, как событие загрузки окна сработало):

$(window).load(function() {
    $("iframe")[0].contentWindow.func1();
});
0 голосов
/ 06 октября 2011

Вы не можете. foo - это локальная переменная, и ее нельзя увидеть нигде (представьте, если бы вы могли получить доступ к индексным переменным, таким как i и другим локальным переменным вне их области видимости!).

Если вы можете изменить код в iframe:

1) Вы можете сделать foo глобальным.

$(document).ready(function(){
    foo = function(){
        //this alternate syntax declares a global function foo
        //it is very evil so be sure you really need this
        ...
    };
})

или если foo не использует внутренние переменные, это могло быть объявлено снаружи в

первое место ...

function foo(){
    ...
};

$(document).ready(function(){

})

2) Вы можете передать foo в качестве аргумента тем, кто в нем нуждается (как и в случае с любой другой локальной переменной)

$(document).ready(function(){
    function foo(){
        //this alternate syntax declares a global function foo
        //it is very evil so be sure you really need this
        ...
    };

    function_that_uses_foo();
})

function_that_uses_foo(){
    foo(); //foo is not on cope, this doesnt work!
}

становится

$(document).ready(function(){
    function foo(){
        //this alternate syntax declares a global function foo
        //it is very evil so be sure you really need this
        ...
    };

    function_that_uses_foo(foo);
})

function_that_uses_foo(his_foo){
    his_foo();
}

Если вы не можете изменить iframe , то вам нужно будет скопировать и вставить код функции, если он вообще не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...