2009-03-16 19 views
5

tengo un vínculo que tiene un oyente que se le atribuye (estoy usando YUI):Javascript: simular un clic en un enlace

YAHOO.util.Event.on(Element, 'click', function(){ /* some functionality */}); 

me gustaría la misma funcionalidad que suceda en otro escenario que no implica un clic de usuario. Idealmente, podría simplemente simular "hacer clic" en el elemento y hacer que la funcionalidad se active automáticamente. ¿Cómo podría hacer esto? Lástima que esto no funciona:

$('Element').click() 

Gracias.

Respuesta

3

Puede declarar su función por separado.

function DoThisOnClick() { 
} 

asignarlo a evento onclick como lo hace en este momento, por ejemplo:

YAHOO.util.Event.on(Element, 'click', DoThisOnClick) 

Y se le puede llamar siempre que lo desee :-)

DoThisOnClick() 
+0

Verdadero ... pero el controlador de eventos YUI tiene acceso a variables como 'esto' y otros parámetros manejados por el marco YUI. Sería ideal simplemente disparar el mismo evento. –

+0

"this" hace referencia al objeto sobre el que hizo clic. Si llama a la función usted mismo, no hay tal objeto. Entonces tu función necesita lidiar con eso. Pruebe: if (this) // do smth; else // hacer smth cuando no hay "esto" –

-1

Por supuesto $ ('Elemento'). Click() no funcionará, pero si se incluye jquery, puede funcionar bien junto con yui.

Mientras untestand que tiene que hacer lo siguiente:

function myfunc(){ 
//functionality 
} 

YAHOO.util.Event.on(Element, 'click', myfunc); 

luego llamar a myfunc cuando algo más tiene que suceder.

-4

La imposibilidad de simular un clic de usuario en un elemento arbitrario es intencional, y por razones obvias.

+0

Por favor, elabore. – TweeZz

9

Está buscando fireEvent (IE) y dispatchEvent (otros).

Para YUI 3 Esto es todo muy bien envuelto en Y.Event.simulate():

YUI().use("node", function(Y) { 
    Y.Event.simulate(document.body, "click", { shiftKey: true }) 
}) 
9

MDC tiene una buena example of using dispatchEvent para simular eventos de clic.

Aquí hay un código para simular un clic en un elemento que también comprueba si algo cancelado el evento:

function simulateClick(elm) { 
    var evt = document.createEvent("MouseEvents"); 
    evt.initMouseEvent("click", true, true, window, 
    0, 0, 0, 0, 0, false, false, false, false, 0, null); 
    var canceled = !elm.dispatchEvent(evt); 
    if(canceled) { 
    // A handler called preventDefault 
    // uh-oh, did some XSS hack your site? 
    } else { 
    // None of the handlers called preventDefault 
    // do stuff 
    } 
} 
+0

Esto funciona muy bien, y es muy fácil de implementar. Gracias ! – gramm

+0

¿Tengo que tener YUI para hacer esto? –

+0

No, no tiene que usar YUI para usar esto. –

0

1) PRIMERA SOLUCIÓN

El artículo http://mattsnider.com/simulating-events-using-yui/ se describe cómo simular un clic mediante YA HOO:

var simulateClickEvent = function(elem) { 
    var node = YAHOO.util.Dom.get(elem); 

    while (node && window !== node) { 
     var listeners = YAHOO.util.Event.getListeners(node, 'click'); 

     if (listeners && listeners.length) { 
      listeners.batch(function(o) { 
       o.fn.call(o.adjust ? o.scope : this, {target: node}, o.obj); 
      }); 
     } 

     node = node.parentNode; 
    } 
}; 

Como se puede ver, la función de los bucles sobre el nodo y sus padres y para cada uno de ellos obtiene la lista de oyentes y los llama.

2) segunda solución

También hay otra manera de hacerlo. Por ejemplo:

var elem = YAHOO.util.Dom.get("id-of-the-element"); 
elem.fireEvent("click", {}); 

donde se utiliza la función como

3) tercera solución

Versión 2.9 de YUI2 tiene una mejor solución: http://yui.github.io/yui2/docs/yui_2.9.0_full/docs/YAHOO.util.UserAction.html

4) ADELANTE SOLUCIÓN

YUI3 también tiene una solución mejor y más limpia: http://yuilibrary.com/yui/docs/event/simulate.html

Cuestiones relacionadas