To make any element focusable, not only interactive content ones, you have to set tabindex attribute.
In your sample, it would be:
<div id='myeditdiv' contenteditable='true'>
<span class='foo_cl' tabindex="-1">FOO<span class='bar_cl' tabindex="-1">bar</span</span>
</div>
Note: negative tabindex
makes element focusable but not tabbable because using tabbing method would start at 0
using absolute value (spec).
Now in jQuery, you could delegate focus
event to these elements:
$('[contenteditable]').on('focus', '*', function(e){
e.stopPropagation();
console.log(this);
});
-jsFiddle-
As a side note, jQuery UI has a :focusable
pseudo selector. If you wish to dynamically set tabindex
attribute to not focusable elements, you could use:
$('[contenteditable]').find(':not(:focusable)').attr('tabindex', -1);
-jsFiddle (including jQuery UI)-
If you don't want to include jQuery UI just to get :focusable
pseudo selector, you can create your own custom selector:
//include IIFE if not already including jQuery UI
(function () {
function focusable(element, isTabIndexNotNaN) {
var map, mapName, img,
nodeName = element.nodeName.toLowerCase();
if ("area" === nodeName) {
map = element.parentNode;
mapName = map.name;
if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") {
return false;
}
img = $("img[usemap='#" + mapName + "']")[0];
return !!img && $(img).is(':visible');
}
return (/^(input|select|textarea|button|object)$/.test(nodeName) ? !element.disabled :
"a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) &&
// the element and all of its ancestors must be visible
$(element).is(':visible');
}
$.extend($.expr[":"], {
focusable: function (element) {
return focusable(element, !isNaN($.attr(element, "tabindex")));
}
});
})();
-jsFiddle-
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…