2011-12-05 50 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