2011-06-05 57 views
0

我喜歡範圍內的所有的我的jQuery函數和事件匯$ jQuery的功能(窗口).load,就像這樣:

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

通常情況下,我在這個範圍內完成所有工作,但我有一個案例,我想從由獨立JQuery小部件構建的HREF調用Foo(27)。 HREF看起來像這樣:

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

但是,當我單擊鏈接時沒有找到Foo()函數。我怎麼能這樣做?

[編輯]

所以,我剛剛接受了下面的答案,並希望分享我的最終實現。 Foo()已被替換爲我正在使用的實際方法的名稱。是的,我知道String.format()本身不存在;它是我自己的基礎庫的一部分。記住這一點,這就是我所擁有的。這是來自我定義所有全局名稱空間的文件。這個定義存在於jQuery範圍之外。

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

下面是構建HREF的jQuery構件的一行。標題是預測,而HREF導航到詳細信息頁面預測:

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

而這裏的實際執行NavDetails功能在我的$(窗口).load() - 範圍的jQuery的文件:

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

在javascript中沒有'String.format'。也請詳細說明你想在加載時傳遞給'Foo'? – naveen 2011-06-05 05:29:47

回答

7

你可以做到這一點

$(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/

海事組織,更好的辦法是設置一個命名空間爲您的應用程序,這樣你就不會污染gobal命名空間

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/

但是,你可能想consi你從你的腳本中調用它,而不是從標記中調用它。

+0

但是,如何從HREF調用此函數? – 2011-06-05 05:24:46

+0

你正在做內聯,檢查我發佈的小提琴'Click me!' – jaime 2011-06-05 05:26:09

+0

從技術上講,如果'Foo'旨在全球化,則不需要做'var Foo'。我更喜歡你的第一種方法,因爲它更明確。 – MooGoo 2011-06-05 05:30:16

0

無論是移動Foo功能您$(window).load()功能之外或綁定Foo到加載函數內部<a>元素。您無法從外部進入您的$(window).load()回撥。


從您的意見,它看起來像你需要Foo留在你$(window).load()匿名函數裏面,因爲它需要訪問該範圍內其他的事情。您可以通過在匿名函數外移動對Foo的引用來解決此問題。的jm-'s方法這個變種:

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

這使得在window對象Foo參考,因爲window是默認的範圍,你應該能夠訪問它在你的<a>元素。

+0

織補。我希望能夠以某種方式(例如Click me!或其他)修飾來自HREF的Foo調用,以使Foo()可見。我不能將Foo()移動到全局空間中,因爲我需要訪問$(window).load中的變量和支持函數。所以我想我只需在構建錨標記時將ID存儲在expando屬性中,然後使用傳統的jQuery語法來吸收點擊事件。然後這可以調用Foo()並傳遞$(this),然後從Foo()我可以查看expando來獲取ID。 – 2011-06-05 05:15:25

+0

@Armchair:你可以將'Foo'保留在它所在的位置(因此它可以訪問當前範圍內的所有內容),然後爲外部可見的外部設置一個別名,這是jm-方法的一種變體。 – 2011-06-05 05:23:11

0

你必須選擇在該範圍內工作,並有一個可訪問的功能。唯一的另一種方法是強制重新加載或將其綁定到錨點的點擊處理程序。

此外,您可能已更改原型,但除非有,否則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

是的,除非有人獨自提出更好的解決方案,這就是我已經在做的事情。一般來說,我試圖避免在存在替代方案時使用expando屬性。在這種情況下,我希望只將ID作爲參數傳遞給Foo()。但是由於我無法做到這一點,因此我會將ID添加爲expando,將一個共享CSS類添加到該錨點,在該CSS類別上接收點擊事件,然後提取expando ID值。 – 2011-06-05 05:23:15

+0

BTW:Re String.format - 這已經是我擁有的另一個庫的一部分,並且我非常依賴於該文件,因此我不能再編寫執行古老字符串連接的代碼! :-)帶有可替換參數的String.format()是這個庫中我最喜歡的功能之一。 – 2011-06-05 05:26:57

+0

我對數據屬性(試圖找到一個解決方案留在JS內部)同樣不情願的態度,儘管它們派上用場。當我將Chrome擴展程序國際化時(尤其是使用'data-i18n =「someString」'替換標記中的所有文本),情況尤其如此。您可以使用單獨的靜態HTML頁面,但這很痛苦。至於'String.format',我很喜歡它的許多語言,我只是想確保你不是一些對JS有着同樣期望的Java/C#人。 ;) – brymck 2011-06-05 05:33:15

相關問題