【问题标题】:javascript creating a button from an objectjavascript 从一个对象创建一个按钮
【发布时间】:2010-01-05 23:51:45
【问题描述】:

在从 javascript 对象创建按钮时,我正在执行以下操作:

    for (buttonName in buttons){ 
         var htmlbutton = '<button type="button" onclick="'+buttons[buttonName]()+'">'+buttonName+'</button>' 
}

我正在尝试将函数附加到 onclick 事件,但我无法找出正确的 sythanx

提前致谢

【问题讨论】:

  • 那个onclick函数到底应该做什么?
  • type="button" 是多余的,可能无效
  • 有效,IE需要,错误默认button-type为submit

标签: javascript object


【解决方案1】:

您不能在字符串中嵌入 Function 实例。

如果buttons 变量是全局变量,则onclick 事件处理程序属性内的代码可以访问它:

var htmlbutton= '<button type="button" onclick="buttons[\''+buttonName+'\']()">'+buttonName+'</button>' 

但是,上面没有转义,所以如果buttonName 可以包含&lt;&amp;'" 字符,您将遇到问题(潜在的安全问题)。对于要嵌入字符串的 JavaScript 和 HTML,您必须以各种方式转义这些内容。

更好的是完全避免使用字符串来生成 HTML。然后,您可以使用 DOM 方法和原生 JavaScript 对象,并避免所有令人困惑的字符串内部字符串。

var button= document.createElement('button');
button.type= 'button';
button.appendChild(document.createTextNode(buttonName));
button.onclick= buttons[buttonsName];

【讨论】:

  • 我很欣赏这种替代方法,并且我清楚地看到了安全优势。但是,我坚持在我的代码中实现它,在我从该对象创建 dom 元素之前,我为该对象创建不同的属性。有什么建议吗?
  • 你可以临时查找属性以便稍后分配给 DOM 节点,我想。我不确定为什么您不能在进行过程中创建节点,但是...如果您不想这样做,则不必将它们实际插入到文档中。
  • 上下文是一个模态框(我知道那里有很多脚本,但我以此为借口深入研究 javascript)我正在做的事情是逐个创建模态框。更准确地说,我正在逐个创建模态框对象,最后我想附加对象属性(最终框)。也许我的做法是错误的:(
【解决方案2】:

尝试将您的代码替换为:

for (buttonName in buttons)
{
     var htmlbutton = 
         '<input' + 
         ' type="button"' +
         ' value="' + (buttons[buttonName]).replace(/"/gi, "&quot;") + '"' +
         ' onclick="' + (buttons[buttonName]).replace(/"/gi, "&quot;") + '()"/>';
}

编辑澄清:

因为 HTML 中没有 reliable &lt;button&gt; 标记。

来自W3School网站:

重要提示:如果在 HTML 表单中使用 button 元素,不同的浏览器会提交不同的值。 Internet Explorer 将提交&lt;button&gt;&lt;/button&gt; 标签之间的文本,而其他浏览器将提交value 属性的内容。 使用&lt;input&gt; 元素在 HTML 表单中创建按钮。

【讨论】:

  • 这个按钮没有名字,所以它显然不能作为表单的一部分提交。
【解决方案3】:

我猜你正在寻找这样的东西:

for(buttonName in buttons) {
    var htmlbutton = '<button type="button" onclick="window.buttons[\''+buttonName+'\']()">'+buttonName+'</button>';

这不是在 onclick 属性中打印整个函数,而是打印出可调用的函数名称。只需确保 buttons 在正确的范围内即可。

【讨论】:

【解决方案4】:

虽然在这种情况下不需要使用 jquery,但我正在编写的代码是针对 jquery 插件的。到目前为止,这是我能想到的最佳解决方案:

$.each(buttons, function(name, fn) {   

   $('<input type="button" value="'+name+'" />').click(function() { fn.apply() }); 


  });

我还没有弄清楚在使用 call 或 apply 属性时是否有任何陷阱,但到目前为止,这就像魅力一样。

非常感谢您的想法和意见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多