Вызов функции включенного кода JavaScript из другого включенного JavaScript - PullRequest
2 голосов
/ 13 февраля 2010

Я пытаюсь работать с различными загруженными JavaScript на моей странице, но я не могу позволить им говорить.

<html>
<script type="text/javascript" src="jquery144.js"></script>
<script type="text/javascript" src="shared_functions.js"></script>
<script type="text/javascript" src="page_function_callers.js"></script>
</html>


// shared_functions.js
$(document).ready (function () {
    function sayHello (what) {
        alert (what);
    }
});

// page_function_callers.js
$(document).ready (function () {
    $("div.my_button").click (function () {
        sayHello ("Hello world!");
    });
});

Я работаю с jQuery и хотел бы использовать этот способ, потому что он должен позволить мне переопределить многие публичные методы. Где я не прав?

Ответы [ 4 ]

3 голосов
/ 13 февраля 2010

Функция sayHello объявлена ​​внутри области действия события DOMReady ($(document).ready). Он не будет доступен за пределами этой области. Но не нужно для объявления функции внутри этой области. Даже если sayHello использует много объектов DOM (чего в вашем примере нет), он не будет выполнен до тех пор, пока не будет вызван, поэтому единственное, что вам нужно убедиться, это то, что такая функция не вызывается до окончания DOMReady.

Таким образом, вы можете просто удалить первую и последнюю строку в shared_functions.js, т.е. $(document).ready(function() { и }); соответственно, и ваш код будет работать.

2 голосов
/ 13 февраля 2010

Когда вы объявляете "sayHello" (кто-нибудь помнит ту песню Шарлотты Черч? Черт возьми ...) внутри функции "ready", она является локальной для этой функции. Вы можете сделать его глобальным, если хотите, выполнив следующее:

window['sayHello'] = function sayHello(what) {
  alert(what);
};

(Приятно дать функции «локальное» имя & ndash; имя после ключевого слова «function» & mdash; потому что тогда функция не будет отображаться как «анонимная» в Firebug.)

Я бы посоветовал вам исследовать превращение вашей глобальной функции в плагин jQuery или, по крайней мере, в «глобальный» jQuery, поместив его в объект jQuery вместо «окна».

2 голосов
/ 13 февраля 2010

Попробуйте определить функцию sayHello вне вашего звонка $(document).ready.

0 голосов
/ 13 февраля 2010

В приведенном выше коде метод sayHello () определен только внутри области действия анонимной функции.

Этот код может работать лучше для вас:

// shared_functions.js
window.MyNamespace = window.MyNamespace || {};
MyNamespace.sayHello = function(what)
{
  alert(what);    
};

// page_function_callers.js
$(document).ready (function ()
{
    $("div.my_button").click (function ()
    {
      MyNamespace.sayHello('hello world');    
    });
});

Убедитесь, что вы загружаете файлы JS в правильном порядке. Есть более элегантные решения, но это довольно простое и понятное решение.

Одним из преимуществ такого подхода было бы не загрязнять глобальное пространство имен.

...