【问题标题】:Inject html using Javascript使用 Javascript 注入 html
【发布时间】:2010-12-28 06:37:56
【问题描述】:

我必须通过 javascript 将以下 html 行注入到文档中:

<button type='button'>btnName </button>

除此之外,我还必须在按钮上注册一个 onclick,要调用的函数需要一个 arg,比如 'arg',所以 javascript 看起来像这样:

var html = "<button type='button' onclick='+ fnName +
    "(the param shld go here)'>" + btnName + "</button>"

我如何实现这一目标? 一个明显的解决方案是为按钮分配一个 Id,然后在将 html 附加到文档后注册一个单击功能。但我不想这样做,因为按钮太多。有没有你能想到的其他选择。

补充: 函数名是动态的,进去的'arg'也是动态的。如果需要,则必须自动生成一个 Id。

**

我有解决办法,请看下面

**

【问题讨论】:

    标签: javascript html inject


    【解决方案1】:

    我会推荐 jquery。

    类似

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js" type="text/javascript"></script>
    <script>
    $(document).append(
      $("input")
      .attr("type", "button")
      .click(function(){
        doSomething()
      ))
    );
    </script>
    

    【讨论】:

    • 这是实现您想要的最简单的方法 - 为什么不赞成?
    【解决方案2】:

    由于您不想以通常的方式分配 onclick 方法,因此一种替代方法是让它们都调用具有唯一标识号的函数。该函数将有一个带有参数的二维数组,这是假设每个按钮都调用具有不同参数的相同函数。

    编辑:我可能理解错了,这里有一些代码not使用了我在最近的项目中使用的jQuery。

    for(var place = 0; place < 5; place++)
            {
                if(document.getElementById('title_'+ place).addEventListener)//this is for compatablity
                    document.getElementById('title_'+ place).addEventListener('click', function(e){/*some code*/});
                else if(document.getElementById('title_'+ place).attachEvent)
                    document.getElementById('title_'+ place).attachEvent('onclick',  function(e){/*some code*/});
                else
                    document.getElementById('title_'+ place) = function(e){/*some code*/};
            }
    

    代码向五个对象添加了一个 onClick 事件,并且由于它检查当前浏览器中哪个方法有效,因此它支持主要浏览器(据我测试过)。

    为了便于阅读,我取出了一些代码,但这只是要调用的函数中的代码。

    【讨论】:

    • 我想说我不想使用通常的点击方式!只是告诉我怎么做。点击=?什么来这里
    【解决方案3】:

    您可以将 document.write 用于该变量。 var html = document.write('' + btnName + '')。请更正单引号和双引号。我不知道这对你有用与否

    【讨论】:

    • 1999年请不要使用document.write
    【解决方案4】:

    如果您不想将事件绑定到每个单独的按钮,您可以将一个事件绑定到所有这些按钮的父级(例如,持有按钮的父级 div),然后使用事件冒泡来实现类似的影响。

    例如

    <div id="parent">   
       <button id="b0">text</button>
       <button id="b1">text</button>
       <button id="b2">text</button>
       <button id="b3">text</button>
       <button id="b4">text</button>
       <button id="b5">text</button>
    </div>
    <script>
       $("#parent").click(function(e){
           if ($(e.target).attr("id") === "b0") {
              // do b0's stuff
           } else if ($(e.target).attr("id") === "b1") {
              //do b1's stuff 
           } //etc 
       });
    </script>
    

    另一种方法是使用jquery live events - 他们基本上是在做我上面写的(当然更优雅)。至于论据,你首先如何获得论据?在不知道的情况下,我真的不能告诉你最好的前进方向。

    【讨论】:

    • args : 来自服务的部分数据
    【解决方案5】:

    我找到了解决方案:-

    var html = "<button type='button' onclick='"+ fnName +"("+ JSON.stringify(data) +")'>"+ btnName + "</button>"
    

    【讨论】:

    • 这与您的问题没有显着差异,并且不包括有关实施的信息。您可以扩展以供将来搜索吗?
    【解决方案6】:

    您应该避免使用onclick 作为 HTML 属性。相反,通过 DOM 接口以编程方式创建按钮并将事件作为属性附加。

    var button       = document.createElement("button");
    button.type      = "button";
    button.innerHTML = btnName;
    button.onclick   = function() {
        window[fnName](data);
    };
    
    // Insert the button into whatever container node you are populating
    someContainerNode.appendChild(button);
    

    或者 jQuery 方式,因为这就是乐队要去的地方:

    $("<button type='button'>" + btnName + "</button>").click(function() {
        window[fnName](data);
    }).appendTo(someContainerNode);
    

    此外,由于您没有将 onclick 处理程序设置为字符串,因此您无需将函数参数 data 转换为 JSON 字符串,这将提高性能。

    【讨论】:

      猜你喜欢
      • 2019-12-15
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 2010-10-31
      • 2021-02-16
      • 1970-01-01
      相关资源
      最近更新 更多