【问题标题】:Best way to create a link using JQuery?使用 JQuery 创建链接的最佳方法?
【发布时间】:2011-05-14 18:50:12
【问题描述】:

我们使用 jqGrid 自定义格式化程序在 JQuery 网格中输出链接。我们只是使用字符串操作来构造链接:

var s = "<a title=\"Blah\" href=\"javascript:BlahFunc('" + options.rowId + "')\">This is blah<a>";

有没有更“聪明”的方法来使用 JQuery 创建链接(和其他表单元素)?

【问题讨论】:

    标签: jquery jqgrid


    【解决方案1】:
    jQuery('<a>').attr('href', 'url').text('blah')
    

    将创建一个 jquery 对象,然后您可以使用 .append 将其添加到 dom。

    【讨论】:

    • 有没有办法只返回原始 HTML? jQuery('&lt;a&gt;').attr('href', 'url').text('blah').html() 之类的东西?
    • 我能够做到这一点的唯一方法是将它附加到另一个 div 并获取它的 html。比如:jQuery('&lt;div&gt;').append(jQuery('&lt;a&gt;').attr('href', 'url').text('blah')).html() .html 只会得到当前元素内的内容,所以我不得不将它包装在其他东西中。但是TBH,你的问题很好。我以前用过jQGrid,我就是这样做的。
    【解决方案2】:

    我的首选方式是这样的:

    $("<a>", {
      title: "Blah",
      href: "javascript:BlahFunc('" + options.rowId + "')"
      }).append( "This is blah" );
    

    这篇文章有很好的信息:
    http://marcgrabanski.com/articles/building-html-in-jquery-and-javascript

    【讨论】:

    • 好电话,我本来打算写这篇文章,但我总是忘记你确实需要括号。
    【解决方案3】:

    一般来说,插入一个 HTML 字符串更快,并且多次 DOM 注入和 DOM 操作,这就是这个 jQuery DOM 操作的意义所在。如果您想插入其中的 500 个,就性能而言,最好的选择是准备 HTML 字符串,然后附加 HTML。

    但出于您的简单目的,您当前的选择将非常适合您。为了更聪明,您可以在新元素上使用 jQuery 的 DOM 操作库。下面的例子应该是不言自明的,但如果我不清楚具体是什么,请留下评论,我会帮助你。

    var toBeAdded = [
      { title: "one", row: 1, content: "ONE" },
      { title: "two", row: 2, content: "TWO" },
      { title: "three", row: 3, content: "THREE" }
    ];
    
    var s = toBeAdded.length;
    for(i=0;i<s;i++) {
      var a = $('<a>');
      a.attr('title', toBeAdded[i].title);
      a.attr('rel', toBeAdded[i].row);
      a.text(toBeAdded[i].content);
      a.addClass('blah_class');
      a.appendTo($('body'));
    }
    

    然后在你的通用脚本中:

    $('a.blah_class').live('click', function(){
      var rel = $(this).attr('rel');
      BlahFunc(rel);
    });
    

    【讨论】:

      【解决方案4】:

      我觉得最好的人

      $('<a>',{
          text: 'This is blah',
          title: 'Blah',
          href: '#',
          click: function(){ BlahFunc( options.rowId );return false;}
      }).appendTo('body');
      

      现场示例http://www.jsfiddle.net/gaby/RhWgf/

      我已将内联 javascript 替换为附加的处理程序

      引用文档中关于jQuery()

      jQuery(html, props)

      html 定义单个字符串, 独立的 HTML 元素(例如 &lt;div/&gt;&lt;div&gt;&lt;/div&gt;)。
      道具属性、事件和 调用新创建的方法 元素。


      更新

      如果您想要链接的实际文本,您应该将其包装在一个 div 中并返回其中的 .html()

      或者:您可以使用访问原始元素的.outerHTML 属性

      完整示例 at http://www.jsfiddle.net/gaby/RhWgf/1/删除了单击处理程序,因为它会在字符串版本中丢失,并将其替换为针对特定类型的 live 处理程序链接)

      【讨论】:

        【解决方案5】:

        正如 Steven Xu 正确提到的,插入 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>";
        

        (关闭&lt;a&gt;标签,在字符串末尾加上&lt;/a&gt;)。

        字符串操作比 DOM 操作快得多(例如,参见 this)。此外,如果您尝试在大型 HTML 代码中间插入 DOM 片段,差异会更大。使用DOM DocumentFragments可以稍微提升性能,但是使用字符串拼接是最快的方式。

        所有其他答案都在不了解您使用它的上下文(jqGrid 自定义格式化程序)的情况下写了他的答案。我试图解释为什么它在你的情况下很重要。

        由于性能优势,jqGrid首先为网格构建HTML代码片段作为字符串数组,然后从字符串数组中针对.join('')构建一个字符串,并将结果插入到表体的所有末尾只要。 (我想你使用gridview:true jqGrid 选项,几乎总是推荐)。 jqGrid custom formatter 是 jqGrid 在构建网格(表)体期间使用的回调函数。自定义格式化程序必须将 HTML 代码片段作为 string 作为结果返回。该字符串将与构建网格(表格)主体的其他字符串连接。

        因此,如果您将当前代码从纯字符串操作更改为 jQuery DOM 操作并将结果转换为字符串(需要作为自定义格式的结果返回),那么您的代码将运行缓慢,您将拥有没有其他优势*。

        使用字符串操作的唯一真正缺点是验证您构建的代码的问题。例如,使用没有关闭标签&lt;/a&gt; 的代码是您可能遇到的潜在问题。在大多数情况下,问题会在插入 DOM 片段的过程中得到解决,但有时您会收到真正的问题。所以你应该非常仔细地测试你插入的代码。

        再说明:如果要关注unobtrusive JavaScript style,可以使用“#”作为href属性的值,并在gridCompleteloadComplete事件处理程序中绑定对应的click事件。如果您在执行时遇到问题,您可以打开一个新问题,我会尝试为您编写相应的代码示例。

        注意:我认为最好的实现方式是使用onCellSelectbeforeSelectRow,而不是将click 事件绑定到列中的每个&lt;a&gt; 元素。我建议阅读以下答案以了解详细信息:this oneanother oneone more old answer

        【讨论】:

        • "HTML 字符串的插入比 DOM 更快" - 当然,这也是确保您遇到大量 XSS 问题的最佳方法。
        • @oreoshake:对不起,但我不确定我是否理解正确。我回答的问题是关于 jqGrid 自定义格式化程序 的使用。它是 jqGrid 用来构造特定列中单元格的 HTML 内容的回调。所以自定义格式化程序必须返回字符串,因为它是 jqGrid 接口的要求。存在这个要求是因为 jqGrid 将网格的所有行构建为一个字符串*,并将其作为一个 DOM 操作插入。它提高了性能。 “Gaby aka G. Petrioli”的答案与问题无关,因为 它不能与 jqGrid 一起使用
        【解决方案6】:

        这对我有帮助,从按钮获取链接以获取新链接

        var $jsClonedButtonLinkContainer = $('.js-cloned-button-link-container');
        $jsClonedButtonLinkContainer.each(function() {
            $('<a>', {
              href: $(this).find('a.nectar-button').attr('href'),
              'class': 'flip-box__cloned-button-link'
            }).prependTo($(this).find('.flip-box-back'));
          });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-21
          • 2021-06-02
          • 1970-01-01
          • 2012-06-25
          • 2018-09-19
          • 1970-01-01
          • 2021-01-04
          相关资源
          最近更新 更多