2009-02-24 4 views
6

Tengo problemas para obtener el código de UI para que funcione bien en IE.Problemas de rendimiento de jQuery UI con una tabla en IE

Tengo una tabla: una matriz de valores. Cada celda puede estar vacía o contener una lista de elementos.

Quiero que los usuarios puedan arrastrar elementos entre las celdas.

Así que mi HTML se ve algo como esto:

<table> 
    <tr><td></td><th scope="col">col 1</th><th scope="col">col 2</th></tr> 
    <tr><th scope="row">row 1</th> 
     <td class="droppable-cell"> 
      <div class="draggable-item">item A</div> 
      <div class="draggable-item">item B</div> 
     </td> 
     <td class="droppable-cell"></td> 
    </tr> 
    <tr><th scope="row">row 2</th> 
     <td class="droppable-cell"></td> 
     <td class="droppable-cell"> 
      <div class="draggable-item">item C</div> 
      <div class="draggable-item">item D</div> 
     </td> 
    </tr> 
</table> 

Entonces estoy usando jQuery 1.3.1 y jQuery UI 1.6rc6:

$j('.draggable-item').each(function() 
{ 
    $j(this).draggable({ 
     addClasses: false, 
     revert: true, 
     zIndex: 2000, 
     cursor: 'move' 
    }); 
}); 

$j('.droppable-cell').each(function() 
{ 
    $j(this).droppable({ 
     addClasses: false, 
     activeClass: 'droppable-cell-candrop', 
     hoverClass: 'droppable-cell-hover', 
     tolerance: 'pointer', 

     drop: function(event, ui) 
     { 
      //function to save change 
     }); 
    }); 
}); 

Tenga en cuenta que esto se simplifica, truncada y sin terminar código.

Mi problema es que en FX, Safari, Chrome, etc. (es decir, todos los navegadores decentes) esto funciona bien.

Aunque el IE realmente tiene problemas. Con una tabla de 5x5, el retraso de IE al inicio de un arrastre es notable. En una tabla de 10x10 con quizás 100 elementos, el inicio de la acción de arrastre bloquea el navegador.

Quiero ser capaz de admitir células redondas de hasta 20x15 y tal vez hasta 500 elementos. ¿Es esto simplemente imposible? No parece que debería ser.

¿Estoy haciendo algo mal? ¿Hay alguna manera de hacer esto que no ralentice la página en IE de esta manera?

+1

también estoy teniendo este problema exacto. mesa grande, divs anidados dentro de la mesa. firefox muestra la página en 10 segundos, es decir, procesa la tabla luego de una espera de 2 minutos. firefox sigue comprimiendo y arrastrando y girando, es decir, se arrastra ... de hecho se congela, y el comando arrastrar y soltar no funciona. voy a probar algunas de las soluciones a continuación. el ancho fijo, y las referencias #id tagname.class.Pero me temo que todavía será lento. si alguien más tiene buenas i deas, yo sería todo oídos. – Bingy

+0

Sí, mi solución fue limitar los usuarios de IE; solo pueden seleccionar un pequeño subconjunto de filas y columnas que los usuarios de FX y Chrome pueden. Incluso entonces, IE8 solo hace frente a quizás 25 celdas (cuadrícula de 5x5), 7 y 6 permanecen sin esperanza. Te trae recuerdos del desarrollo web de finales de los 90 y es algo horrible de hacer, pero ¿qué otra cosa puedes hacer si su navegador es tan pobre? – Keith

+0

Con el mismo problema, IE es súper lento con una grilla grande, pero Chrome y Firefox están bien. –

Respuesta

2

Este es el problema exacto por el que iGoogle y otras aplicaciones similares utilizan una caja transparente con una línea punteada alrededor del borde. IE no puede arrastrar objetos completos, debido al problema que describió anteriormente.

+0

¿Te refieres a http://www.google.com/ig? Incluso en IE esa página arrastra el contenido real. Solo estoy tratando de arrastrar pequeños divs. – Keith

2

Podría ser la representación de la tabla ... ¿Puedes probar sin la tabla?

Si las células son del mismo tamaño que puede alcanzar la pantalla a modo de mesa flotando:

<style> 
.droppable-cell{ 
    float:left; width: 50%; height: 20px; border: 1px solid black; 
} 
</style> 

<div class="droppable-cell"> 
     <div class="draggable-item">item A</div> 
     <div class="draggable-item">item B</div> 
</div> 
<div class="droppable-cell"></div> 
<div class="droppable-cell"></div> 
<div class="droppable-cell"> 
     <div class="draggable-item">item C</div> 
     <div class="draggable-item">item D</div> 
</div> 

Si se utiliza una tabla es una de seleccionar el estilo table-layout a 'fijo' necesidad y especificando el tamaño de las células puede ayuda.

+0

Gracias, buena idea, pero esto es realmente datos tabulares. Los encabezados de fila y columna son jerárquicos con tramos. Tampoco creo que pueda arreglar el tamaño de la celda. – Keith

3

Limitar la parte del DOM que jQuery tiene para buscar puede ayudar. Añadir un id al elemento DOM que contiene

<table id="myTable"> 

Entonces alterar su selector de jQuery para encontrar elementos dentro de este contenedor

$j('#myTable .draggable-item').each(function() { ... 
+0

Gracias - Lo intentaré. – Keith

+0

Pensé que esto era $ ('# myTable, .draggable-item') según la documentación. – Jay

+1

@Jay. No, me estaba refiriendo a los selectores 'Ancestor Descendent' (http://docs.jquery.com/Selectors/descendant#ancestordescendant). Una coma sería un selector 'n' (http://docs.jquery.com/Selectors/multiple#selector1selector2selectorN) que es útil en algunos casos, pero no en este –

1

mi solución es dejar caer el 'activeClass' de la definición lanzables, y sólo utilizando 'hoverClass'.

En una tabla de aproximadamente 150 filas con alrededor de 10 columnas. Pasó de 10 segundos de retraso a menos de 1. El arrastre se vuelve un poco desigual, pero no inutilizable.

Cuestiones relacionadas