Skip to content

Comments

Added autofocus support for input items in modal template#67

Open
lexbailey wants to merge 1 commit intodwmkerr:masterfrom
lexbailey:master
Open

Added autofocus support for input items in modal template#67
lexbailey wants to merge 1 commit intodwmkerr:masterfrom
lexbailey:master

Conversation

@lexbailey
Copy link

I'm new to Angular and Bootstrap and was looking at this modal service. It mostly does what I wanted but it would only autofocus the input box the first time it appeared. I have added some code that looks for any inputs with the autofocus attribute, if it finds one then it focuses it.

At the moment this relies on a timeout. It doesn't work without the timeout but there may be a better way to get it to happen at the correct time, I don't know enough about angular or bootstrap to be able to come up with a better way.

The complex example should now autofocus the name box.

@coveralls
Copy link

Coverage Status

Coverage decreased (-7.58%) to 92.42% when pulling fc630e9 on danieljabailey:master into beb2c50 on dwmkerr:master.

@dwmkerr
Copy link
Owner

dwmkerr commented Feb 19, 2016

@danieljabailey Hi Daniel, thanks for this. If there is an element with an autofocus field elsewhere in the document tree, for example before and after the modal, this could interfere with the logic yes?

@lexbailey
Copy link
Author

@dwmkerr Yeah, probably but it doesn't make much sense to have two things set to autofocus. You can only focus one of them at a time anyway.

@Xample
Copy link

Xample commented Feb 25, 2016

interesting branch, however I would refocus on the last element which was focused before the modal to open up.

Before we open the modal:

// Keep the current focused element
self.previousFocus = document.activeElement;

Right after we close it

// Set the focus back to the kept element (if any)
self.previousFocus && self.previousFocus.focus();

@rolek
Copy link

rolek commented Nov 4, 2016

My solution to this is:

//  We now have a modal object...
                    var modal = {
                        controller: modalController,
                        scope: modalScope,
                        element: modalElement,
                        close: closeDeferred.promise,
                        closed: closedDeferred.promise
                    };
                    angular.forEach(modalElement.find('input'), function(input) {
                        if (input.attributes.getNamedItem('autofocus')) {
                            input.focus();
                        }               
                    });
                    //  ...which is passed to the caller via the promise.
                    deferred.resolve(modal);

This allows you to have multiple modal templates on a single page and autofocus will work in each of them.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants