Ваш вариант не далёк от истины, но я бы сделал как-то так:
$(document).one('click', function(event) {
var q = function (i, e) {
if(e.tagName.toLowerCase() !== 'body') {
if((!$(arr[0]).attr('id') && e.id) || $(e).length > 1 || i == -1)
arr.push(
(e.id && "#"+e.id)
|| (e.className && e.tagName.toLowerCase()+"."+e.className)
|| (e.tagName.toLowerCase() + ":eq(" + $(e).index() + ")")
);
if(e.id)
return false;
}
else
return false;
}
var arr = [];
q(-1,event.target);
$(event.target).parents().each(q);
console.log(arr.reverse().join(' '));
});
Выдаёт максимально оптимизированный результат.