【问题标题】:Add button to span将按钮添加到跨度
【发布时间】:2015-03-19 01:41:24
【问题描述】:

我想为给定类的所有跨度添加一个按钮。这个问题的答案仍然是首选的方法吗(我一直看到答案因为过时而相互矛盾)?

adding onclick event to dynamically added button?

这是我的代码(到目前为止):

var button = document.createElement("button");
button.innerText = "Add test";

var allSpans = document.getElementsByTagName('span');

allSpans.forEach(function(span) {
    if(span.class == "behavior-header-title"){
        span. //i'd like to call something like addElement(button) here
    }
});

【问题讨论】:

    标签: javascript html


    【解决方案1】:

    将 HTMLCollection 转换为数组并使用 appendChild 附加按钮元素:

    var allSpans = document.getElementsByTagName('span');
    
    [].slice.call(allSpans).forEach(function(span) {
        if(span.className === 'behavior-header-title') {
            var button = document.createElement('button');
            button.innerText = 'Add test';
            span.appendChild(button);
        }
    });
    <span></span>
    <span class="behavior-header-title"></span>
    <span></span>
    <span class="behavior-header-title"></span>

    【讨论】:

    • 应该是slice.call(allSpans)?
    • 啊,明白了。对不起。试图翻译成我自己的代码
    • 这对我不起作用,我不知道为什么。我没有理由相信这不起作用,但它对我的 atm 不起作用。
    • 您是否在控制台中遇到错误?你能提供一个 JSFiddle 你试图运行的代码吗? jsfiddle.net/61eeoxm4
    • 实际上它在 jsfiddle 中工作。必须与html有关。我得再仔细看看。
    【解决方案2】:

    当您拨打getElementsByTagName 时,您会收到HTMLCollection。它就像一个数组,但它不是数组,所以它没有forEach 方法。所以你必须callArray.prototype.forEach。

    要进行实际的附加,您需要Node#appendChild,它将一个节点附加到另一个节点。但是,节点只能出现在 DOM 中的一处。如果您两次附加相同的节点,它将从其位置移动到新位置。所以每次都需要clone这个按钮。

    把它们放在一起:

    var button = document.createElement("button");
    button.innerText = "Add test";
    
    var allSpans = document.getElementsByTagName('span');
    Array.prototype.forEach.call(allSpans, function(span) {
      if(span.className === 'behavior-header-title') {
        span.appendChild(button.cloneNode(button))
      }
    });
    

    【讨论】:

      【解决方案3】:

      您要做的是构建一个动态网页。虽然这应该更多地留给 PHP(PHP 超文本处理器,一种被多个 Web 服务器广泛支持的服务器端脚本语言),但在 javascript 中有一个解决方案。

      这个问题有多种解决方案,但我将为您提供实现此目标所需要做的基本基础知识。


      您需要做的第一件事是使按钮具有onclick 属性集。你可以这样做:

      var button=document.createElement("BUTTON");
      button.setAttribute("onclick","yourFunction()"); //Function Definition will go here.
      

      这将使您的按钮在添加到文档时具有功能。

      接下来,您必须实际创建函数。我假设您想要以下两件事之一:

      1. 已经为使用它的环境创建的集合函数,或者
      2. 一种动态函数,根据调用者的不同而不同。

      我将分别举一个小例子。

      对于set函数:

      var button=document.createElement("BUTTON");
      button.onclick = function(){
          //Event handling code.
      };
      

      对于动态功能(多一点努力):

      //...FUNCTION...//
      function bFunc(/*parameters*/){
          /*Code (Using Parameters)*/
      }
      
      //...BUTTON...//
      
      var button=document.createElement("BUTTON");
      button.onclick = function(){
          bFunc(/*Any parameters needed*/);
      };
      

      然后将按钮添加到span中:

      var spans = document.getElementsByTagName("span"); //CREATE ARRAY OF ALL SPANS
      for(var i = 0; i < spans.length; i++){
          spans[i].appendChild(button); //APPEND THE BUTTON TO EACH SPAN
      }    
      

      【讨论】:

      • 我对您的回答投了反对票,因为混合 JavaScript 事件处理程序和 HTML 是不好的做法,例如使用 onclick 属性,它缺乏关注点分离。您鼓励在 setAttribute 参数中将函数编写为字符串,这绝对是错误的方法。最后var spans[] = 不是你定义数组的方式。请在发布之前测试您的代码。
      • 哦,对不起!我的答案通常更具概念性,仅包含我试图传达的内容的本质。我将编辑我的答案。
      • 没问题!不过很抱歉,我最近又回到了 Java,我认为这是与数组混淆的地方。
      【解决方案4】:

      我无法想象首选方式,至少在生产中,不涉及 jQuery。使用 jQuery,代码将是:

      $(function() {
          $("span.behavior-header-title").each( function(index, element) {
              element.append("<button></button")
          });
      });
      

      没有 jQuery 的工作小提琴:https://jsfiddle.net/tsclaus/b2by02yv/2/

      【讨论】:

      • 为什么你不能“想象”首选的方式是没有 jQuery? jQuery 仍然是 JavaScript。
      • 我希望你的回答是讽刺。
      • 我很欣赏这个答案,但我试图纯粹用 JS 来做。部分是为了学习JS。 (不,我没有投票给你)
      • @Ramy 如果我关心否决票,我会删除我的答案(因为它会返回声誉)。我已经用相当简洁的代码编辑了我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多