限制调用JavaScript函数以内联DOM元素的事件处理程序

时间:2015-05-22 13:22:07

标签: javascript html

是否有任何方法或解决方法使(全局,如果您希望,但不一定)函数仅可用于DOM元素的内联事件处理程序?

的JavaScript

function forInlineCallsOnly() {
    // only callable from inline "on" attributes of DOM elements
};

也就是说,上述函数不能从脚本的其他部分调用,只能来自,例如:

HTML

<a onclick="forInlineCallsOnly();">Click me</a>

使用堆栈跟踪可以实现吗?

注意:这不是关于应该定义事件处理程序的最佳实践的问题。

2 个答案:

答案 0 :(得分:2)

我能给出的最佳答案;而且,它不是很好。

<a data-onclick-attach="forInlineCallsOnly">

JS

eventMethodsMap: {
  forInlineCallsOnly: function() {
    ...
  }
}
Array.prototype.forEach.call(document.querySelectorAll('[data-onclick-attach]'), function(elem) {
  elem.onclick = eventMethodsMap[elem.dataset.onclickAttach];
});

这与Dojo这样的系统大致相同;事件可以在HTML中定义为数据属性,但它们以更自定义的方式连接起来。如果你不想特定于onclick,你可以想出一个更好的查询选择器。

编辑:您可能还希望从onClickAttach属性中修剪括号,以防人们开始以与onclick相同的方式对其进行处理。

答案 1 :(得分:-1)

使用来自JavaScript isDOM -- How do you check if a JavaScript Object is a DOM Object?

的isElement函数

并将您的代码更新为:

HTML:

<a onclick="forInlineCallsOnly(this);">Click me</a>

JAVASCRIPT:

function forInlineCallsOnly(obj) {
    // only callable from inline "on" attributes of DOM elements
    if(!isElement(obj)){
        return;
    }
    // Put code you want to allow to run here
};