Is it possible to do something like $("#container").trigger("click");
using only AngularJS ? And if it's not possible to trigger
, is there another way to manage this behavior ?
I have a basic example that creates a box on a button click. The created box is draggable. Now, currently the user has to click on the button (to create the box) and click again to drag the box. I would like the user to simply click once : to create the box and then trigger the drag event of the box so that the user doesn't have to click again.
var app = angular.module("app", []);
// This directive is attached to the button and makes it create a box every time the is a 'mousedown' event
app.directive("boxCreator", function($document, $compile) {
return {
restrict: 'A',
link: function($scope, $element, $attrs) {
$element.bind("mousedown", function($event) {
var newNode = $compile('<div class="box" drag></div>')($scope);
newNode.css({
top: $event.pageY - 25 + "px",
left: $event.pageX - 25 + "px"
});
angular.element($document[0].body).append(newNode);
// I'd like to do something like : '$(newNode).trigger("mousedown");'
});
}
}
});
// Makes the binded element draggable
app.directive("drag", function($document) {
return function(scope, element, attr) {
var startX = 0, startY = 0, x = event.pageX - 25, y = event.pageY - 25;
element.css({
position: 'absolute',
cursor: 'pointer'
});
element.on('mousedown', function(event) {
event.preventDefault();
startX = event.pageX - x;
startY = event.pageY - y;
$document.on('mousemove', mousemove);
$document.on('mouseup', mouseup);
});
function mousemove(event) {
y = event.pageY - startY;
x = event.pageX - startX;
element.css({
top: y + 'px',
left: x + 'px'
});
}
function mouseup() {
$document.off('mousemove', mousemove);
$document.off('mouseup', mouseup);
}
};
});
JSFIDDLE
element(newNode). triggerHandler('mousedown'); Will trigger the handler. The only thing is, this doesn't include any of the event data, so you will also have to remove the dependency on event.
The trigger() method triggers the specified event and the default behavior of an event (like form submission) for the selected elements. This method is similar to the triggerHandler() method, except that triggerHandler() does not trigger the default behavior of the event.
Event methods trigger or attach a function to an event handler for the selected elements. The following table lists all the jQuery methods used to handle events.
The documentation you want to look at is angular.element
, which is angular's JQLite implementation.
You can see from this that there is a .triggerHandler()
method.
So something like:
angular.element(newNode).triggerHandler('mousedown');
Will trigger the handler. The only thing is, this doesn't include any of the event data, so you will also have to remove the dependency on event.pageY
. I did this crudely by modifying these two lines:
startX = (event.pageX - x) || 0;
startY = (event.pageY - y) || 0;
You could also look into passing params, but I couldn't get that to work at all.
Hopefully this gets you started.
Updated fiddle
You can use a triggerHandler
and pass custom event data.
element.triggerHandler({
type: 'mousedown',
pageX: 0,
pageY: 0
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With