Как вызвать функцию JQuery, определенную в $ (window) .load из HREF - PullRequest
0 голосов
/ 05 июня 2011

Мне нравится ограничивать все мои функции и приемники событий JQuery значением $ (window) .load, например:

$(window).load(function ()
{
   function Foo(id)
   {
      alert(String.format("Do Foo for: {0}", id));
   }
});

Обычно я делаю всю свою работу в этой области, но у меня есть случай, когда я хотел бы вызвать Foo (27) из HREF, созданного автономным виджетом JQuery. HREF выглядит так:

<a href="javascript:Foo(27)">Click me!</a>

Однако функция Foo () не появляется, когда я нажимаю на ссылку. Как я могу сделать это так?

[EDIT]

Итак, я просто принял ответ ниже и хотел бы поделиться своим окончательным осуществлением. Foo () была заменена именем фактического метода, который я использую. И да, я знаю, что String.format () не существует изначально; это часть моей собственной базовой библиотеки. Имея это в виду, вот что у меня есть. Это из файла, где я определяю все мои глобальные пространства имен. Это определение существует вне области действия jQuery.

// This is defined in the global namespace
if (typeof (window.App) === "undefined")
{
   window.App = {};
}

Вот строка из виджета jQuery, которая создает HREF. Заголовок предназначен для прогноза, а HREF переходит на страницу сведений для этого прогноза:

r = String.format('<a href="javascript:App.NavDetails({1});" class="link3">{0}</a>',
   Predikt.General.EncodeHtml(options.rowData.Title), 
   options.rowData.PredictionId);

А вот фактическая реализация функции NavDetails в моем файле jQuery $ (window) .load () - scoped:

$(window).load(function ()
{
   App.NavDetails = function (id)
   {
      // Do something interesting with the ID here...
      alert(String.format("The ID is: {0}", id));
   };
});

Ответы [ 3 ]

7 голосов
/ 05 июня 2011

Вы можете сделать это

$(window).load(function (){
    window.Foo =  function(n){
      alert(n);
   }
});

http://jsfiddle.net/JQn8H/

Или это

var Foo;

$(window).load(function (){
    Foo =  function (n){
      alert(n);
   }
});

http://jsfiddle.net/JQn8H/2/

IMO, лучшим подходом было бы установить пространство имен для вашего приложения, чтобы вы не загрязняли глобальное пространство имен

window.App = {};

$(window).load(function (){
   App.Foo =  function (n){
      alert(n);
   }
});

Тогда в html вы бы назвали это:

<a href="javascript:App.Foo(27)">Click me!</a>

http://jsfiddle.net/JQn8H/3/

Но, возможно, вы захотите вызвать его из своего скрипта, а не из разметки.

0 голосов
/ 05 июня 2011

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

Кроме того, вы могли изменить прототип, но, если у вас его нет, String.format не работает.Вы, вероятно, просто хотите сделать "Do Foo for: " + id

function Foo(id) {
  alert("Do Foo for: " + id);
}
$(window).load( ... );

или

<a class="someClass" data-id="23">Click me!</a>

...

$(window).load(function() {
  $("a.someClass").click(function() {
    alert("Do Foo for: " + $(this).data("id"));
  });
});
0 голосов
/ 05 июня 2011

Либо переместите функцию Foo за пределы функции $(window).load(), либо привяжите Foo к элементу <a> внутри функции загрузки.Вы не можете попасть внутрь вашего $(window).load() обратного вызова извне.


Из ваших комментариев видно, что вам нужно Foo, чтобы оставаться внутри вашей $(window).load() анонимной функции, так как ей нужен доступ квещи в этом объеме.Вы можете обойти это, переместив ссылку на Foo за пределы анонимной функции.Этот вариант подхода jm-* :

$(window).load(function() {
    //...
    function Foo() {
        //...
    }
    //...
    window.Foo = Foo;
});

Это оставляет ссылку на Foo в объекте window, и поскольку window является областью по умолчанию, вам следуетиметь доступ к нему в элементе <a>.

...