jquery
  • jquery-ui
  • jquery-ui-tabs
  • 2011-12-22 27 views 1 likes 
    1

    我有以下簡單的代碼:jQuery UI選項卡添加事件保持相同的值?

    var tabs = null; 
    function addTab(id, title, data) { 
        alert("Begin: " + data.name); 
        if (tabs === null) { 
         tabs = $("#center-tabs").tabs({ 
          tabTemplate: "<li style='line-height: 0.5'><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close'>Remove Tab</span></li>", 
          add: function (event, ui) { 
           alert("Event: " + data.name); 
          } 
         }); 
        } 
        tabs.tabs("add", id, title); 
        tabs.tabs("select", id); 
    } 
    

    當我打電話: addTab( 「#製表1」, 「製表1」,{ 名: 「實施例1」 });顯示 兩個警報( 「開始:實施例-1」 和 「事件:實施例-1」)

    但是,如果我再次調用: addTab( 「#製表2」, 「製表2」,{ 名稱:「Example-2」 }); 顯示兩條警報,但第一條顯示正確的消息,第二條顯示第一條消息(「Begin:Example-2」,但是「Event:Example-1」)

    我在做什麼錯? 它是一個製表符執行錯誤?

    在此先感謝

    回答

    0

    不,它不是一個錯誤。

    您第一次打電話addTab()變量tabsnull因此if語句的主體被執行。如果你在內部定義add方法,可以使用data.nameExample 1)。這是預料之中的。

    問題是,在第一次運行期間,會創建一個包含data變量的閉包,其值爲Example 1。當您第二次致電addTab()tabs已被創建並且在add方法data.name內仍指在第一次運行期間得到保存的data.name。您的alert()看不到data的新值。

    請參閱http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

    您可以通過訪問內部addaddTabs變量/參數直接,因爲這將「保存」成閉合,但使用其他機制,如jQuery的.data()解決它。

    var tabs = null; 
    function addTab(id, title, data) { 
       if (tabs === null) { 
           tabs = $("#center-tabs").tabs({ 
               tabTemplate: "...", 
               add: function (event, ui) { 
                 console.log("Event: " + $(this).data('name')); 
               } 
           }); 
       } 
       tabs.data('name', data.name); 
       tabs.tabs("add", id, title); 
       tabs.tabs("select", id); 
    } 
    

    ​​就是一個例子。

    +0

    非常感謝,事實上在某些時候我雖然對此有所瞭解,但我不知道爲什麼我放棄了封閉的情況......也許我太累了:0) – 2011-12-22 04:59:29

    +0

    @MichelFornaris很高興幫助:)。請不要忘記提供有用的答案並接受一個答案(請參閱[常見問題](http://stackoverflow.com/faq#howtoask))。謝謝 :)! – kubetz 2011-12-22 13:16:49

    +0

    當然,我只是做了,但沒有足夠的聲望投票:(笑! – 2011-12-22 15:49:32

    0

    要設置在#中心的選項卡的標籤容器兩次,一次與每個調用addTab。嘗試更改您的代碼是這樣的:

    var tabs = $("#center-tabs"); 
    function addTab(id, title, data) { 
        alert("Begin: " + data.name); 
        if (!tabs.hasClass('ui-tabs')) { 
         tabs.tabs({ 
          tabTemplate: "<li style='line-height: 0.5'><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close'>Remove Tab</span></li>", 
          add: function (event, ui) { 
           alert("Event: " + data.name); 
          } 
         }); 
        } 
        tabs.tabs("add", id, title); 
        tabs.tabs("select", id); 
    } 
    
    相關問題