Есть ли в jQuery эквивалент конструктора Element () в MooTools?

Я собираюсь запустить механизм отчетности javascript для своего веб-сайта и начал создавать прототипы с помощью MooTools. Мне очень нравится делать такие вещи:

function showLeagues(leagues) {
    var leagueList = $("leagues");
    leagueList.empty();
    for(var i = 0; i<leagues.length; ++i) {
        var listItem = getLeagueListElement(leagues[i]);
        leagueList.adopt(listItem);
    }
}

function getLeagueListElement(league) {
    var listItem = new Element('li');
    var newElement = new Element('a', {
        'html': league.name,
        'href': '?league='+league.key,
        'events': {
                'click': function() { showLeague(league); return false; }
        }
    });
    listItem.adopt(newElement);
    return listItem;
}

Из того, что я видел, методы типа jQuery "принимают" принимают только строки html или элементы DOM. Есть ли какой-нибудь jQuery, эквивалентный Элемент MooTools?


EDIT: The big thing I'm looking for here is the programmatic attachment of my click event to the link.
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
9 227
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот то же самое в jQuery. В основном, чтобы создать новый элемент, вы просто вставляете нужный HTML-код.

function showLeagues(leagues) {
    var $leagueList = $("#leagues");
    $leagueList.empty();
    $.each(leagues, function (index, league) {
        $leagueList.append(getLeagueListElement(league));
    });
}

function getLeagueListElement(league) {
    return $('<li></li>')
        .append($('<a></a>')
            .html(league.name)
            .attr('href', '?league=' + league.key)
            .click(function() {
                showLeague(league);
                return false;
            })
        )
    ;
}

Вместо $ ('<li> </li>') вы можете просто использовать $ ('<li />') btw

James 07.10.2008 14:46

обратите внимание, код «<li />» не оптимален, и, глядя на код, видно, что jquery выполняет регулярное выражение, чтобы расширить его обратно до «<li> </li>»;)

Kent Fredric 08.10.2008 12:59
Ответ принят как подходящий

синтаксически может быть лучше использовать jQuery для этого, но, вероятно, более эффективно использовать

  document.createElement('li')

И устраняет необходимость как минимум в тесте сравнения строк и небольшом разборе токенов.

Flydom также может вызвать у вас интерес, если вы настаиваете на создании большого количества узлов dom. (Теоретически должно быть быстрее, но не тестировал)


Примечание. Внутри jQuery ("<html> </html>") выглядит так, как будто он действительно делает это (упрощенно):

jQuery(matcher) --> function(matcher)
{
   return jQuery.fn.init(matcher) --> function(matcher)
   {
      return  this.setArray(
        jQuery.makeArray(
           jQuery.clean(matcher) --> function(matcher)
           { 
               div = document.createElement('div');
               div.innerHTML = matcher;
               return div.childNodes;
           }
        )
      );
   }
}

Таким образом, можно было бы предположить, что «document.createElement» является «требованием», и если вы знать вы хотите получить (то есть: не сравнивать некоторые сторонние данные с $( datahere )), тогда document.createElement будет таким же логичным и с повышением скорости, чтобы избежать многочисленные регулярные выражения и медленные манипуляции со строками.

Для сравнения: jQuery(document.createElement('div')) похоже, что он эффективно делает это (упрощенно):

jQuery(matcher) --> function(matcher)
{
   return jQuery.fn.init(matcher) --> function(matcher)
   {
       this[0] = matcher; 
       this.length = 1; 
       return this; 
   }
}

Есть ли какой-нибудь браузер, достаточно современный для поддержки основных js-библиотек, который не включает эти методы DOM? Мое желание использовать специфичный для фреймворка код было двояким: во-первых, чтобы сохранить согласованный синтаксис в моем коде, и во-вторых, чтобы убедиться, что мне не нужно заботиться о различиях в браузерах.

Chris Marasti-Georg 07.10.2008 15:28

Ответ расширен. Насколько я могу судить, если браузер не поддерживает document.createElement, то даже jQuery не будет работать с ним.

Kent Fredric 08.10.2008 13:00

Чтобы быть уверенным в своих намерениях, вы говорите, что вместо: $ ('<a> </a>') .attr ('href', '? League =' + league.key) ... вы бы порекомендовали : $ (document.createElement ("a")). attr ('href', '? league =' + league.key) ...?

Chris Marasti-Georg 09.10.2008 19:35

Я хотел бы добавить - я видел несколько статей (и провел несколько собственных тестов), и выполнение $ (document.createElement ('a')) последовательно быстрее создает новые элементы для jQuery, а затем полагается на jQuery для сделай это за тебя. Обычный JS, вероятно, всегда будет быстрее, чем полагаться на библиотеку, которая сделает это за вас (включая настройку атрибутов элементов, но иногда мы говорим о миллисекундных различиях, поэтому это почти спорный вопрос, если только вы не стремитесь сжать как можно больше).

keif 16.03.2011 22:01

@keif да, скорее всего проблема будет, если он будет в цикле, и это немного похоже на преждевременную оптимизацию. Но использование явного JS кажется мне даже склонным к ошибке меньше. И это Javascript, до недавнего времени он все равно был очень медленным по умолчанию;) каждая микрооптимизация помогает.

Kent Fredric 01.04.2011 23:39

Другие вопросы по теме