views:

10761

answers:

8
+3  Q: 

JQuery focus

Let say i have the next markup:

<div id="content">
    <div id="firstP"><p>First paragraph</p></div>
    <div id="secondP"><p>Second paragraph</p></div>
    <div id="thirdP"><p>Third paragraph</p></div>
    <div id="fourthP"><p>Fourth paragraph</p></div>
</div>

I want to add a new div with Javascript and focus in this new element. Focus does not do anything.

function addParagraph() {
    var html = "<div id=\"newP\"><p>New paragraph</p></div>";
    $("#content").append(html);
    $("#newP").focus();    
}

Any idea?

+13  A: 

There's no problem with your code, it's just that a paragraph or div tag can't receive focus. Focus can only be given to things you can interact with, such as links, input elements, textareas, etc.

To scroll the window to this newly added element, you can use a plugin such as ScrollTo.

On a side note, your code could be simplified a bit:

var html = "<div id=\"newP\"><p>New paragraph</p></div>";
$("#content").append(html);
$("#newP p").focus();

var html = "<div id=\"newP\"><p>New paragraph</p></div>";
$(html)
    .appendTo('#content')
    .focus()   // or scrollTo(), now...
;
nickf
No need to append to $('#content'), just appendTo('#content')
Vincent Robert
thanks, edited - though i suppose that behind the scenes it does the exact same thing...
nickf
Right, it does :-)
Vincent Robert
+2  A: 

I think what you're looking for is using the 'ScrollTo' plugin in jQuery. You can check it out here.

You can specify what to scroll...

$('div.pane').scrollTo(...);//all divs w/class pane

Or just scroll the window:

$.scrollTo(...);//the plugin will take care of this

There are many different ways to specify the target position. These are:

  • A raw number
  • A string('44', '100px', '+=30px', etc )
  • A DOM element (logically, child of the scrollable element)
  • A selector, that will be relative to the scrollable element
  • A hash { top:x, left:y }, x and y can be any kind of number/string like above.

Bonus: In digging up this information, I also found LocalScroll and SerialScroll (animates scrolling from one item to the next).

Dan Esparza
A: 

I want to move the user to the point of the page where the new element has been added so that he realizes that his operation was sucessful.

Similar to internal anchors.

Sergio del Amo
+4  A: 

You need to use a HTML page anchor not focus. Example:

http://localhost/mypage.html#fourthP
Todd Smith
+1  A: 

Only form elements and such can attain focus. If you want the browser to scroll down to that particular paragraph, there is no "default" way of doing so with jQuery, but there is a plugin for it at jQuery.ScrollTo and a blog explaining how to do it manually at Animated scroll with jQuery

Guðmundur Bjarni
+2  A: 

Instead of

$("#newP").focus();

it should be used:

window.location.href=window.location.href + "#newP";
Sergio del Amo
+17  A: 

I think the main answer is incorrect. DIV and P tags can receive focus providing you specify a tabindex property for them. i.e.

<div class="someclass" tabindex="100">

Once the tabindex is specified you can either tab to these elements or shift focus with .focus() .

Using a scrollTo plugin seems like a bit of an overkill here.

Michal
This helped me figure out how to process some keyboard commands in a tree container div. By assigning a keypress event handler to a div with a tabIndex value, I was able to add keyboard commands to a hierarchical data editor.
David Lively
Perfect! Yours is the best solution in terms of being simple. I like simple stuff. I prefer to avoid a script if it can be done without it.
Marcos Buarque
+1  A: 

This code will avoid dependencies on other plugins and allow you to have it on any element.

$('html, body').animate({ scrollTop: $("#newP").offset().top }, 500);
Josh Stuart
Nice idea. I used this rather than a new plugin and just set the timeout to 0. Wonder if I should wrap that up in a function and call it ScrollTo...
Ian Grainger
Yeah you could do that and just have a variable for the #newP so you could focus any element on event.
Josh Stuart