Ответ 1
Как правильно сказал Стивен Сюй, вставка HTML-строк происходит быстрее, чем манипулирование DOM, поэтому я рекомендую создавать элементы с манипуляциями строк вместо jQuery.
Вам нужно только изменить это:
var s = "<a title=\"Blah\" href=\"javascript:BlahFunc('" + options.rowId +
"')\">This is blah<a>";
:
var s = "<a title=\"Blah\" href=\"javascript:BlahFunc('" + options.rowId +
"')\">This is blah</a>";
(закрыть тег <a>
с </a>
в конце строки).
Строковая манипуляция намного быстрее, чем манипуляция DOM (см. это). Более того, разница будет намного больше, если вы попытаетесь вставить фрагмент DOM в середине большого HTML-кода. Использование DOM DocumentFragments может немного улучшить производительность, но использование конкатенации строк является самым быстрым способом.
Все остальные ответы написали свой ответ, не зная о контексте (jqGrid custom formatter), где вы его используете. Я пытаюсь объяснить, почему это важно в вашем случае.
Из-за преимуществ производительности jqGrid создает фрагменты HTML-кода для сетки сначала как массив строк, затем строит одну строку из массива строк по отношению к .join('')
и вставляет результат в тело таблицы в конце всего только. (Я полагаю, что вы используете gridview: true параметр jqGrid, который почти всегда рекомендуется). jqGrid custom formatter - это функция обратного вызова, используемая jqGrid во время построения тела сетки (таблицы). Пользовательский форматировщик должен вернуть фрагмент кода HTML в качестве строки в качестве результата. Строка будет конкатенирована с другими строками, которые строят тело сетки (таблицы).
Итак, если вы измените свой текущий код на чистую манипуляцию с строкой на манипуляцию JQuery DOM и преобразуете результаты в строку (которую необходимо вернуть в результате пользовательского форматирования), тогда ваш код будет работать медленно, и вы будете иметь нет других преимуществ *.
Единственным реальным недостатком использования строковых манипуляций является проблема проверки кода, который вы создаете. Например, использование кода без тегов close </a>
является потенциальной проблемой, которую вы можете иметь. В большинстве случаев проблема будет решена при вставке фрагмента DOM, но иногда вы можете получить реальные проблемы. Поэтому вы должны просто проверить код, который вы вставили очень тщательно.
Еще одно замечание: если вы хотите следовать ненавязчивый стиль JavaScript, вы можете использовать "#" в качестве значения для атрибута href
и связать соответствующее событие click
внутри обработчика событий gridComplete
или loadComplete
. Если у вас возникнут проблемы с реализацией этого, вы можете открыть новый вопрос, и я попытаюсь написать для вас соответствующий пример кода.
Примечание. Я считаю, что лучшим способом реализации будет использование onCellSelect
или beforeSelectRow
вместо привязки события click
к каждому элементу <a>
в столбце. Я рекомендую прочитать следующие ответы: этот, другой и еще один старый ответ.