Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

focus() not working in safari or chrome

Tags:

I have a div that has been given a tabindex, when the div is focused(click or tabbed to) it does the following:

inserts an input into itself, gives the input focus

this works great in FF, IE and Opera

but in Chome/Safari it gives the input focus but fails to actually put the cursor inside the input (I know it gives it focus because the safari/chrome focus borders appear).

Any suggestions as to what is going on?

I have to fix the key handler after this so the arrow keys and backspace keys work too, feel free to chime in on that if you'd like.

Thank you in advance!

Here's a sample of the code:

var recipientDomElem = $("#recipientsDiv"); recipientDomElem[0].tabIndex = 0; $("#recipientsDiv").focus(function(e){ var code = (e.keyCode ? e.keyCode : e.which); window.clearTimeout(statusTimer); recipientDivHandler(code, null); });   function recipientDivHandler(code, element){ $("#recipientsDiv").append('<input type="text" id="toInput" class="inlineBlockElement rightSpacer" style="border:0px none #ffffff; padding:0px; width:40px;margin-bottom:3px;padding:0; overflow:hidden; font-size:11px;" />'); $("#toInput").focus(); } 

Another oddity about this is that tabbing through to the div will fire the div.focus() function and correctly give the input focus...it's just the click that fails. I tried putting a .click() function on the div to do the same as the focus, but it's not working.

like image 433
BinarySolo00100 Avatar asked Jan 15 '10 19:01

BinarySolo00100


2 Answers

I got the answer on my own, it might seem weak, and too simple, but it works.

Ready for this awesomeness..?

Just add a timer of 0 to the focus...for some reason it just gives it enough time to fully load the input into the DOM.

function recipientDivHandler(code, element) {   $("#recipientsDiv").append('<input type="text" id="toInput" class="inlineBlockElement rightSpacer" style="border:0px none #ffffff; padding:0px; width:40px;margin-bottom:3px;padding:0; overflow:hidden; font-size:11px;" />');   setTimeout(function() {     $("#toInput").focus();   }, 0); } 

If someone else can further explain this or has a better answer please feel free to take the stage :-)

like image 163
BinarySolo00100 Avatar answered Sep 28 '22 02:09

BinarySolo00100


Although I couldn't find this specifically stated anywhere, .focus() only works on input elements and links. It also isn't supported properly in Chrome and Safari. I posted a demo here to show you what I mean. Also note that focus() and focusin() (v1.4) have the same results.

So that being determined, try changing your function to .click()

$("#recipientsDiv").click(function(e){ ... }) 
like image 34
Mottie Avatar answered Sep 28 '22 02:09

Mottie