Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Fluent Interface внешнего .js (https://javascript.ru/forum/misc/51776-fluent-interface-vneshnego-js.html)

jsnb 19.11.2014 15:06

Цитата:

Сообщение от Siend (Сообщение 341755)
Так в том то и проблема что мне необходимо чтобы в test.js было .ready

Зачем?

Цитата:

Сообщение от Siend (Сообщение 341755)
да и тогда почему пример с $( document ).ready(function() {testFunction()}) не сработал, он же тоже должен выполниться, после того как все загрузится?

Цитата:

Сообщение от jsnb
во-вторых, доступа к testFunction у тбя всё равно не будет т.к. оно недоступно из вне.

Ну сделай window.testFunction = testFunction, если уж так хочешь в глобал закинуть из ready.

jsnb 19.11.2014 15:19

Как я понял тебе надо что-то вроде этого:
(function(){

var menuObj = {
  method1: method1,
  method2: method2,
  method3: method3
}

function method1() {
  //some code
  return menuObj;
}

function method2() {
  //some code
  return menuObj;
}

function method3() {
  //some code
  return menuObj;
}

window.yourMenu = menuObj;

$(document).ready(function() {
  //этот код будет выполнен после загрузки документа
  yourMenu.method1();
  yourMenu.method2();
  yourMenu.method3();

  yourMenu.method1().method2().method3();
});

})();


Ну а еще лучше сделать полноценный конструктор.

Siend 19.11.2014 15:21

Цитата:

Сообщение от jsnb
Сообщение от Siend
Так в том то и проблема что мне необходимо чтобы в test.js было .ready
Цитата:

Зачем?

В тесте то не зачем, но в нормальном скрипте у меня если убрать
$(document ).ready(function() { ... })

вылезает ошибка на строке:
menu.onmousedown = myDown;

А если добавить
$(document ).ready(function() { ... })

то все ок!!!

вот полный код:
var menu = document.getElementById('menu')
    menu.onmousedown = myDown;
    menu.onmouseup = myUp;
    menu.onmousemove = myMove;

    function myDown(e) {
        switch (e.button) {
            case 0:
                break
            case 2:
                switch (showMenu) {
                    case false:             
                        xMenu = xMouse;
                        yMenu = yMouse;
                        showMenu = true;
                        drawMenu()
                        break
                    case true:
                        clearMenu();
                        break
                }
                break
            default:
                alert('Bad request');
                break
        }
    }

Siend 19.11.2014 15:25

ААААААААА, ФАК ФАК ФАК ФАК, Я ЛООХ!
Кароче, да, вы были правы) Ошибка то вылезала потому что я скрипт подключал в head а там еще не существует элемента с id="Menu"
>__________<

Вообщем осталась последняя проблема которую так и не решил)
У меня в menu.js нужно указать функцию которая будет описана в основном коде страничке, т.е. в index.html

P.S.: Уже решил, в принципе все заработало и так, стоило описать функцию перед подгрузкой скрипта.

Спасибо огромное за помощь, побольше вам жирных плюсов в репутацию!)

jsnb 19.11.2014 15:28

Ну так и суй в ready только тот код, который должен непосредственно с DOM работать. В данном случае это вот этот код:
var menu = document.getElementById('menu')
    menu.onmousedown = myDown;
    menu.onmouseup = myUp;
    menu.onmousemove = myMove;

Siend 19.11.2014 15:40

А нет, кстати, что забавно все равно остался косяк который теперь мне тем более не понятен.

<script>
        function MyMenuActions(a) { alert(a)}
    </script>
<script src="menu.js" type="text/javascript"></script>
    <script>
        myMenu
    </script>

Так все ок, на myMenu не ругается, а вот если сделать
myMeny.AddMenu("Main","New") Выдает ошибку, мол знать не знаю таких функций. В js эта функция выглядит так:

window.myMenu = function () {
        
        var pub

        function AddMenu(a,b) {
            for (var i=0;i<menuList.length;i++)
                if (menuList[i][1] == a) {
                    menuList[i].push(b)
                    menuList.push(b)
                }
            return pub
        }
        
        pub = {
            'AddMenu': AddMenu,
        }
        return pub
    }

jsnb 19.11.2014 15:50

Ну так у тебя myMenu - это функция, у нее нет методов. Делай так:
window.myMenu = (function () {
        
        var pub

        function AddMenu(a,b) {
            for (var i=0;i<menuList.length;i++)
                if (menuList[i][1] == a) {
                    menuList[i].push(b)
                    menuList.push(b)
                }
            return pub
        }
        
        pub = {
            'AddMenu': AddMenu,
        }
        return pub
    })();

Siend 19.11.2014 16:08

ДА, вот теперь это решило проблему)
Спасибо огромное за потраченное на меня время!!!)

Erolast 19.11.2014 19:18

Siend, функции принято с маленькой буквы называть. С большой называют классы (в JS - конструкторы).


Часовой пояс GMT +3, время: 10:51.