是否有与 MooTools 的 Element() 构造函数等效的 jQuery?

Posted

技术标签:

【中文标题】是否有与 MooTools 的 Element() 构造函数等效的 jQuery?【英文标题】:Is there a jQuery equivalent of MooTools' Element() constructor? 【发布时间】:2010-09-15 15:33:07 【问题描述】:

我将为我的网站启动一个 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 元素。有没有相当于 MooTools 的 Element 的 jQuery?


编辑:我在这里寻找的最重要的事情是我的点击事件到链接的程序化附件。

【问题讨论】:

【参考方案1】:

在语法上,使用 jQuery 可能会更好,但使用起来可能更有效

  document.createElement('li')

并且至少消除了对字符串比较测试和次要标记解析的需要。

flydom 如果你坚持要生成大量的 dom 节点,也可能会引起你的兴趣。 (理论上应该更快,但没有测试过)


注意:在内部,jQuery("") 看起来可以有效地执行此操作(过于简化):

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 ) 解析一些第3 方数据)然后@ 987654326@ 恕我直言,它同样合乎逻辑,并且可以提高速度,以避免大量的正则表达式和缓慢的字符串操作。

相比之下:jQuery(document.createElement('div')) 看起来它有效地做到了这一点(过于简单):

jQuery(matcher) --> function(matcher)

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

【讨论】:

是否有足够现代的浏览器被不包含这些 DOM 方法的主要 js 库支持?我对使用特定于框架的代码的愿望是双重的——第一,保持我的代码中的语法一致,第二,确保我不必关心浏览器的差异。 答案扩展。据我所知,如果浏览器不支持 document.createElement,那么即使 jQuery 也无法使用它。 为了确定您的意图,您说的是:$('').attr('href', '?league=' + League.key )...,您会推荐: $(document.createElement("a")).attr('href', '?league=' + League.key)... ? 我想补充一下——我已经看过几篇文章(我自己也做过一些测试),并且 $(document.createElement('a')) 总是更快地创建新的jQuery 的元素然后依靠 jQuery 为您执行此操作。普通的 JS 可能总是比依赖库为你做的更快(包括设置元素属性,但有时我们谈论的是毫秒差异,所以它几乎没有实际意义,除非你尽可能地挤压)。 @keif 是的,如果它在一个循环中,它更有可能是一个问题,而且它看起来有点像过早的优化。但是使用显式 JS 对我来说甚至似乎 less 容易出错。这是 Javascript,直到最近,默认情况下它还是很慢;)每个微优化都有帮助。【参考方案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;
            )
        )
    ;

【讨论】:

你可以只使用 $('') 而不是 $('') btw 请注意,“”代码是次优的,查看代码显示 jquery 使用正则表达式将其扩展回“”;)

以上是关于是否有与 MooTools 的 Element() 构造函数等效的 jQuery?的主要内容,如果未能解决你的问题,请参考以下文章

普通的 JavaScript 是不是比使用 jQuery 或 MooTools 等框架更好? [关闭]

Mootools 是不是 100% 防止 javascript 关闭?

使用 mootools 查找 DOM 对象是不是可见的最佳方法 [关闭]

如何扩展本机mootools方法

是否有与 Haskell 'let' 等效的 Python

是否有与 Mysql 的“多语句查询”等效的 java