<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>События клавиатуры</title>
<style type="text/css">
</style>
<script>
window.onload = function(){
document.getElementById("btn").onclick = function(){
var body = document.getElementById("body");
var p = document.createElement("p");
var allP = document.getElementsByTagName("p");
if(allP.length > 10) {
for(var i = 0; i < allP.length; i++){
body.removeChild(allP[i]);
}
return false;
}
p.innerHTML = "PARAGRAPH";
body.appendChild(p);
}
}
</script>
</head>
<body id="body">
<button id="btn">Create Element</button>
</body>
</html>
getElementsByTagName возвращает динамическую коллекцию элементов, т.е. такую, которая автоматически обновляется при добавлении/удалении элементов. Поэтому сейчас у вас происходит следующее: удалили элемент с индексом 0, и у всех остальных элементов изменился индекс на единицу вниз, 0 вместо 1, 1 вместо 2 и т.д. При этом счётчик цикла вы на единицу увеличили, так что на следующей итерации удаляете элемент с индексом 1 - бывший 2. А тот, который был 1 и стал 0 - его вы пропускаете. А после следующего удаления пропускаете ещё один. Ну и т.д. Каждый второй.document.getElementsByTagName("p") на document.querySelectorAll('p'), так вы получите статическую коллекцию элементов.allP от конца к началу:for (let i = allP.length; i--;) {
body.removeChild(allP[i]);
}while (allP.length) {
allP[0].remove();
}body по id - безумие, этот элемент существует в единственном экземпляре и ссылка на него доступна как свойство объекта document. Так что id уберите и замените document.getElementById("body") на document.body.