Tengo un script simple que funciona (o debería) en la carga de la página y ordena una lista creada dinámicamente por los ID de los elementos de la lista. Funciona bien en Firefox tanto en Windows como en iPad Firefox, pero no en otros navegadores, incluidos Chrome, Edge, el navegador de mi teléfono Android o Silk de Amazon. Pensé que podría tener algo que ver con mi sitio web, así que puse el código en Codepen y el problema también es exactamente el mismo.
Cuando inspecciono el código en Chrome y Edge, no se informan errores, por lo que simplemente se ignora el código. ¿Por qué?
Aquí hay una versión ligeramente simplificada:
window.onload = function() { let list = document.querySelector('.list'), results = document.querySelectorAll('.sort'); let sliced = Array.prototype.slice.call(results, 0); sliced.sort(sortByElementId()); sliced.reduce(function(list, item) { list.appendChild(item); return list; }, list); function sortByElementId() { return function(a, b) { b.id; a.id; return a.id > b.id; } } } <div class="day-or-evening"> <h4>Meeting</h4> <ul id="meetings" class="list"> <li id="id-22" class="sort li-22">Tuesday afternoon</li> <li id="id-23" class="sort li-23">Tuesday evening</li> <li id="id-25" class="sort li-25">Wednesday evening</li> <li id="id-24" class="sort li-24">Wednesday morning</li> <li id="id-27" class="sort li-27">Thursday evening</li> <li id="id-17" class="sort li-17">Monday afternoon</li> <li id="id-26" class="sort li-26">Thursday afternoon</li> <li id="id-21" class="sort li-21">Monday evening</li> </ul> </div>Su función de comparación de clasificación no es válida. Un comparador de clasificación debe devolver (para los argumentos a y b ) uno de los siguientes:
a debe ir antes de b en el resultado;b debe ir antes a ;a y b ya están en orden. Si no lo hace, puede obtener resultados de clasificación inconsistentes e incorrectos. No hay garantía de que para dos elementos cualesquiera de su matriz, por ejemplo, siempre se pasen como a y b (en lugar de b y a ).
Para ordenar matrices de números, restar uno del otro da como resultado un buen valor de retorno. Para cadenas, como en su caso, puede usar la función .localeCompare() de cadenas, aunque eso tiene un comportamiento posiblemente extraño en algunos casos especiales.