views:

1574

answers:

4

Hi all,

I have the following code demonstrating contenteditable property and a button that will inject bold text into the paragraph with contenteditable area. My question is how to return focus to where i left off after clicking on bold, if you highlight some text, and click bold, it'll bold those text, but the focus will not be there anymore. Same thing happens if you don't select anything and click bold, the focus will be gone and if you click where you left off again, you can type bold texts.

Thank you very much for your help!

<head>
    <style type="text/css">
    #container{
     width:500;
    }
    .handle{
     float:left;
    }
    </style>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"&gt;&lt;/script&gt;
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"&gt;&lt;/script&gt;
    <script type="text/javascript">
    $(function(){
     $('#bold').click(function (){
      document.execCommand('bold', false, true);
     });
    });
    </script>
</head>
<button id="bold">Bold</button>
<div id="container">
<div class="c"><p contenteditable>Some text here asdf asdf asdf asdf asdf asd fasd fsa dfsa df asdf sadf sa dfa sdf sadf asd fsa df sadf asdf asdf asd fas df asdf as </p></div>

<div class="c"><p contenteditable>Some text here asdf asdf asdf asdf asdf asd fasd fsa dfsa df asdf sadf sa dfa sdf sadf asd fsa df sadf asdf asdf asd fas df asdf as </p></div>
</div>
+2  A: 

You may want to store the last clicked item in a variable and then call .focus() on it after the .execCommand has been executed. Something like this, I guess:

 $(function(){
        $('p').click(function() {
         var clickedItem = $(this);
         clickedItem.attr('contenteditable', true).focus();
      $('#bold').click(function (){
        document.execCommand('bold', false, true);
        clickedItem.focus();
      });
        });
    });

This way you can also remove the "contenteditable" attribute from the markup...

HTH

ALFABreezE
This will bind the action to the click event of `#bold` every time you click a paragraph, resulting in the handler being bound multiple times. You don't want that.
Jake
A: 

HTML: <"b" button onclick="doRichEditCommand('bold')" style="font-weight:bold;">B

JavaScript: function doRichEditCommand(aName, aArg){ getIFrameDocument('editorWindow').execCommand(aName,false, aArg); document.getElementById('editorWindow').contentWindow.focus() }

Refer this may help you:

https://developer.mozilla.org/en/Rich-Text%5FEditing%5Fin%5FMozilla

+3  A: 

You can just use the jQuery .focus() function to focus it. This should work:

var current;
$(function(){
    $("p[contenteditable]").focus(function() {
        current = this;
    });

    $('#bold').click(function (){
            document.execCommand('bold', false, true);
            $(current).focus();
    });
});

This just keeps track of the currently editing field every time it is focused by the user, and when the bold button is clicked focus is set back to that field.

devongovett
+1  A: 

YOU SHOULD USE .contents()

var current;
$(function(){
    $("p[contenteditable]").focus(function() {
        current = this;
    });

    $('#bold').click(function (){
            document.execCommand('bold', false, true);
            $(current).contents().focus();
    });
});
fukid
thanks, this helps!
gryzzly