2011-12-05 48 views
0

發送我有一個手風琴的功能是這樣的:的JavaScript +微分用戶點擊和點擊的功能

$("#notaccordion").addClass("ui-accordion ui-widget ui-helper-reset") 
    .find("h3") 
    .addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-top ui-corner-bottom") 
    .prepend('<span class="ui-icon ui-icon-triangle-1-e"/>') 
    .click(function() { 
     $(this).toggleClass("ui-accordion-header-active").toggleClass("ui-state-active") 
      .toggleClass("ui-state-default").toggleClass("ui-corner-bottom") 
      .find("> .ui-icon").toggleClass("ui-icon-triangle-1-e").toggleClass("ui-icon-triangle-1-s"); 
     if ($(this).next().is(':hidden') == true) { 
      ; 
      $(this).addClass('active'); $(this).next().slideDown('normal'); 
     } 
     else { 
      $(this).removeClass('active'); $(this).next().slideUp('normal'); 
     } 

     //.end().next().slideUp('normal'); 
     return false; 
    }) 
    .next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").hide(); 

和點擊所有的面板功能擴展所有面板一次:

function clickAllPanels() { 
    var elm = document.getElementsByTagName('table'); 
    var i = elm.length; while (i--) { 
     clickItem(elm[i]); 
    } 
} 

function clickItem(divObj) { 
    if (divObj.click) { 
     divObj.click(); 
    } else if (document.createEvent) { 
     var evt = document.createEvent("MouseEvents"); 
     evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 
     var allowDefault = divObj.dispatchEvent(evt); 
    } 
} 

哪有我讓手風琴.click(function()函數知道它是clickAllPanels,它發送'點擊'而不是用戶的物理點擊。我需要這樣做,因爲如果從clickAllPanels開始,我想更改幻燈片的上下邏輯。

+0

是沒可能打開所有的面板沒有模擬點擊? –

回答

1

這往往是對事件處理程序,並在實際工作中不同的功能,你正在做一個好主意:

function do_stuff(suitable_arguments, a_flag){ 
    //... 
} 

$(/*...*/).click(function(){ 
    do_stuff(/*...*/, true); 
} 

in_my_other_code(){ 
    do_stuff(/*...*/, false); 
} 

通過從事件剝離你的邏輯處理,你有更多的靈活選擇時以及如何調用它。

2

我願意做它的方式是使用兩個不同的事件名稱,一個是「點擊」,另一個是類似「強制單擊」:

$(... whatever ...).bind("click forced-click", function(ev) { 
    if (ev.type === "forced-click") { 
    // called by programmatic trigger 
    } 
    // ... 
}); 

當您觸發事件:

$(... whatever ...).trigger("forced-click"); 

另一種方法做它我想是檢查事件對象,看看是否有「originalEvent」屬性。如果沒有,那麼你知道它是以編程方式觸發的。就我個人而言,我不喜歡依賴它,因爲它沒有記錄。

0

爲什麼不你在使用jquery「clickItem()」函數:

function clickItem(divObj) { 
    $(divObj).trigger('click', { manual: true }); 
} 

單擊處理程序將有一個屬性「isTrigger」,當項目將不存在的事件參數在你用鼠標點擊:

$("#notaccordion") 
    ... 
    .click(function(e) { 

     if (e['isTrigger']) { 
      // do this 
     } else { 
      // do that 
     } 

    }); 

這裏有一個fiddle