2013-09-10 20 views
7

Próbuję przekonwertować zwykły stary tabel HTML na jqGrid. Stara tabela zawiera kolumnę zawierającą tagi, które są konstruowane przy użyciu nieuporządkowanej listy i elementów listy.jqGrid - Wstaw niestandardowy kod HTML do komórki

Here is an example (jsfiddle) z tabeli przed i jqGrid po.

W tym przykładzie używam custom formatter, który używa jQuery Templates do skonstruowania elementów DOM, a następnie formater zwraca $ .html() z wynikowych elementów DOM.

function getTagCellContents(cellvalue) { 
    var domitems=$("#jqgrid-tag-list-item").tmpl({tags: callvalue}); 
    return domitems.html(); 
} 

Problem z tym, że białe spacje zawarte w wynikowym html powodują, że wiersze są zbyt wysokie. Powoduje to również niezręczne atrybuty "Tytuł" na komórkach.

Czy jqGrid udostępnia interfejs API do wstawiania obiektów DOM bezpośrednio do komórki zamiast zwracania tekstu z niestandardowego formatyzatora? Jaka jest najlepsza praktyka umieszczania spersonalizowanego html w komórce jqGrid?

Odpowiedz

7

Uważam, że twoje pytanie jest bardzo interesujące, a więc +1 ode mnie na pytanie.

Główny problem z rozumieniem korzystania z formatowania niestandardowego: wymaga, aby funkcja zwrotna zwracała fragment HTML jako ciąg. Zaletą jest dobra wydajność, którą widać głównie na dużej sieci. Jeśli pracujesz z elementami DOM i używasz konstrukcji takich jak domitems.html(), nie będziesz mieć tak dobrej wydajności.

Przede wszystkim polecam Ci użycie funkcji $.template jQuery Templates. Umożliwia pracę z ciągami bez użycia DOM. The answer na przykład opisuje główną ideę modyfikacji kodu.

Aby naprawić główny problem, proponuję po prostu usunąć \n i withespace z napisu. Nie jestem RegEx profesjonalny więc proponuję następującą szybki i brudny roztwór:

// Create and cache a named template function 
$("#jqgrid-tag-list-item").template("cellContents"); 
var tmpl = $.template("cellContents"); // template function 

function getTagCellContents(a) { 
    var strings = tmpl($, {data: {tags: a}}); // array of strings 
    return strings.join('') 
       .replace(/\n+/g,'') 
       .replace(/\s+/g,' ') 
       .replace(/> </g,'><'); 
} 

Twój jsfiddle demo będzie the following po takiej modyfikacji.

+0

Oleg, czy można dodać nową metodę do interfejsu API jqGrid, która faktycznie dodaje obiekt DOM lub jQuery do komórki? Rozumiem, że używanie HTML jest szybsze, ale czasami nie ma odpowiednika HTML dla DOM. Na przykład chcę wstawić przycisk z niestandardowym parametrem eventListener. Nie mogę wykonać przycisku '' ponieważ moje 'doSomething()' jest funkcją prywatną i nie jest dostępne przez HTML. Dzięki! –

+0

@LeiZhao: Pamięć używana przez przeglądarkę zostanie zwiększona po ustawieniu każdego * osobnego uchwytu zdarzenia '' onclick'. 'click' obsługuje propagację zdarzeń: jeśli nie istnieje uchwyt zdarzenia na'

+0

Oleg, dziękuję za sugestie. Jednak w wielu przypadkach wciąż muszę wstawić/uzyskać dostęp/manipulować DOMem. Zdarzenie kliknięcia było tylko przykładem. Czasami to coś więcej. Na przykład muszę wstawić natywny tag '