@Scorpiored88

Как получить доступ к методам и аргументам самовызывающиеся функции?

Всем доброго!
Подскажите пожалуйста можно ли как нибуть вызвать функцию из самовызывающиеся функции?
Тоесть, к станице подлючен js файл как
<script type="text/javascript" src="/content/js/card.js"></script>

в котором самовызывающиеся функция:
(function () {
    var modal = (function () {

        var modal = null,
            content = null;

        function generate() {
            var template = '<div id="modal-attach-card" class="modal">' +
                '<div class="modal-content"></div></div>';

            $('#modal-attach-card').remove();
            $('.lean-overlay').remove();
            modal = $(template).appendTo('body');
        }

        function open(uid) {
            $.ajax({
                url:"url"
                type: "GET",
                success: function (data) {
                    generate();
                    modal.find('.modal-content').html(data);
                    modal.openModal();
                    modal.draggable({
                        // axis: 'x',
                        containment: 'window',
                        cancel: '.global-content, #modal-confirm',
                        drag: function(e, ui) {

                            if(ui.position.left < 265) {
                                ui.position.left = 265;
                            }

                            if(ui.position.top > window.innerHeight - ($(this).height())) {
                                ui.position.top = window.innerHeight - ($(this).height());
                            }
                        }
                    })
                },
                error: function (data) {
                    toast.error(data.responseText)
                }

            });

        }

        function close() {
            if (modal) {
                modal.find('.modal-content').empty();
                modal.closeModal();
            }
        }

        return {
            open: open,
            close: close
        }
    }());

var socket = (function () {
    var uri = 'localhost:8080/path', socket, client;
    connect();
    function connect(callback) {
        socket = new SockJS(uri);
        client = Stomp.over(socket);

        armAPP.socketClient = socket;

        client.connect({}, function () {
            this.subscribe('/queue/attach', function (obj) {
                var data = JSON.parse(obj.body);
                modal.open(data.uid);
                console.log('######## attach');
                console.log(data);
                console.log('####################');
            });
            this.subscribe('/queue/de-attach', function (obj) {
                modal.close();
                console.log('######## de-attach ');
                console.log(obj);
                console.log('####################');
            });

            console.log('connected');
            if (callback) {
                callback();
            }
        }, function () {
            setTimeout(function () {
                connect(function () {
                    console.log("restart current")
                });
            }, 5000);
        });
    }


    function close() {
        client.disconnect();
    }

    return {
        close: close
    }
}());


Не пойму каким образом можно вызвать от туда функцию modal.openModal(); или другую ?
Или же как вызивать собития подписки this.subscribe ....
Пробовал через windows.cards. ... достучатся, но не получается...

Хочу использовать для вызова из расширения для Chrome, через content script
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Armalon
У Вас кажется пропущено в конце "}());" закрытие вызова самой первой функции.
Тут две проблемы.
Во-первых из content_script просто так достучаться до любых методов и объектов из JS окружения веб-страницы нельзя, они специально действуют в разных. Но есть такой прием когда код из content_script уже будет иметь доступ к окружению страницы:

// делаем строку с функцией
var injectedCode = '(' + function(stringParameter) {
// вот этот код уже будет выполняться в контексте целевой страницы
// тут можно вызывать любые глобальные методы, которые были подключены на странице сайта
// даже можно витиевато передать какое-нибудь строковое значение
// например как мы передали в stringParameter
} + ')("' + '12345' + '");';
// создаем script элемент, суем туда эту строку и подключаем его к странице сайта
var script = document.createElement('script');
script.textContent = injectedCode;
(document.head || document.documentElement).appendChild(script);
// можно сразу и выпилить его =)
script.remove();

Вторая проблема это то, что если снаружи самовызывающейся фукнции не "торчит" какого-нибудь глобального объекта, то мы к тому коду не можем обратиться никак. Но обычно снаружи должно быть что-нибудь доступно, иначе в чем смысл создания этих объектов modal и socket.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
ИА «Кельник» Санкт-Петербург
от 50 000 до 70 000 руб.
Biganto Москва
от 130 000 до 130 000 руб.
14 авг. 2018, в 22:43
350 руб./за проект
14 авг. 2018, в 19:03
10000 руб./за проект
14 авг. 2018, в 18:10
1000 руб./в час