Если ваша проблема заключается в удалении только текста, не заключенного в элемент (а оставшийся код правильно сформирован, поэтому у вас нет таких строк, как
var str= "<str>lorem <b>ipsum</str>";
), вы можете использовать регулярное выражение, подобное этому
var str= "<str>rvrv</str>rvrv<q1>vrvv</q1>vrvrv<q2>rtvrvr</q2>",
elements = str.match(/<(.+?)>[^<]+<\/\1>/gi);
console.log(elements.join(''));
и это возвращает
<str>rvrv</str><q1>vrvv</q1><q2>rtvrvr</q2>
Примечание: для обнаружения закрывающих тегов я использовал обратную ссылку (см. http://www.regular -expressions.info / brackets.html )