【问题标题】:Unobtrusive JavaScript - Safe Attributes?不显眼的 JavaScript - 安全属性?
【发布时间】:2010-11-22 10:56:22
【问题描述】:

我正在努力将 JavaScript 代码从我的 HTML 中分离出来。我目前的代码如下所示:

<div onclick="return do_something_with('100566');" class="clickable">Click Me!</div>

我想将 onclick 交换为仅包含我传递给方法的参数的属性。

我正在使用 jQuery 和以下类型的代码:

var $j = jQuery;
$j(function(){
    $j('.clickable').live('click',function(){
        param = $j(this).attr('attribute_name');
        do_something(param);
    });
});

我可以为“attribute_name”使用什么属性来安全地传达此参数值?我知道我可以使用 id,但我已经在 DOM 的不同位置定义了具有相同 id 的元素。

有什么建议吗?

【问题讨论】:

标签: javascript jquery html unobtrusive-javascript


【解决方案1】:

我通常会添加一个有意义的前缀,例如Client-100566,然后使用以下代码访问它:

var param = $(this).attr("id").split("-")[1];

编辑:删除了对无效全数字 id 令牌的建议。

【讨论】:

【解决方案2】:

我经常发现自己要么将 id 用于独特的事物,要么将数据隐藏在 &lt;span&gt; 中。

【讨论】:

    【解决方案3】:

    您不能在div 内的a 上使用rel 标签吗?它允许将 1 个参数或 n 个参数传递给 doSomething。

    <div>
      <a class="clickable" rel="param1 param2 param3">Click Me!</a>
    </div>
    

    所以现在当 param 发送到 doSomething 时,它是一个空格分隔的列表,param.indexOf("param1") 可用于检查已发送的参数?

    【讨论】:

    • 我会成功的:只是为了安全有效......
    【解决方案4】:

    为什么不制作这些a 标签?有几个网站使用锚点(#someThing)部分或使用rel 属性。

    【讨论】:

    • 我的大部分应用程序都可以做到这一点,但我正在寻找 div 可能需要侦听 x 事件并可能传递多个参数的其他区域。
    • Divs 是块元素的意思,而不是文本数据。你总是可以用逗号分隔#,比如#param1,param2
    • 对。我有一些块元素来监听事件并对其他块执行操作。我知道这听起来很奇怪,但这是客户的要求。我此时的方法是尽可能使用标签,并尽可能多地使用 rel 和 href 进行参数传递。我将为多个参数使用逗号或空格分隔的列表。我也喜欢 id="{word}-{real_id}" 对于可能需要将已使用的元素 id 作为参数传递的元素。感谢您的回复。我会投票给更多的 cmets,但由于我是新来的,我还没有这个特权。
    【解决方案5】:

    您可以将 class 或 title 属性用作以空格分隔的参数列表。标题的缺点是当您的元素悬停时它会显示为弹出窗口:

    <div class="clickable param1 param2 param3">
    

    <div class="clickable" title="param1 param2 param3">
    

    这里是other attributes 的列表,您也可以考虑。

    【讨论】:

    • 我宁愿不使用标题,因为您之前提到的“悬停”原因。因为我使用类作为添加某些侦听器的选择器,所以我想我也会远离它。
    【解决方案6】:

    你可以组成任何属性名。

    <div onclick="foo();" silkyvalue="12938">hello</div>
    

    不过,我通常会使用一些命名格式,例如“my_somethingID”。

    【讨论】:

    • 好吧,你们都错了。 HTML 很好,它可能无法通过给定文档类型下的某种 W3C 验证机制,但它是有效的。自定义属性的另一个示例是“accesskey”。电话使用它来将按下的数字映射到链接。使用这种方法是完全可以接受的,即使你们都不熟悉它。至于这是否是解决 OPs 潜在问题的最佳方法,这是值得商榷的。但它是有效的。
    • 它不是有效的 HTML。 HTML 标准不允许“silkyvalue”属性。 w3c HTML 验证器说:属性“SILKYVALUE”不是有效属性。如果你把它做成 HTML5,你可以使用新的 data-* 属性并且仍然有效,所以 data-silkyvalue="12938" 将是一个有效的属性,但按照现在的规范,这些属性在许多情况下是不允许的(如果任何)元素。
    • phalacee,我说在给定的文档类型下它不会验证,但这并不意味着它不能被使用。请参阅我对“accesskey”的评论。这是一种可以接受的方法。 Quirksmode 甚至讨论过它。请做一些研究。
    • 本次讨论纯属学术性。无论是否由验证器支持,该方法都有效,并且在所有浏览器中都受支持。在此基础上,我可以接受。
    • @silky, @cdmckay:你可以用锤子将螺丝钉入木头。但是你会相信一个这样做的木匠吗?
    猜你喜欢
    • 2011-06-10
    • 2014-04-04
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多