有没有办法检索内联javaScript调用的元素源?
我有一个这样的按钮:
<button onclick="doSomething('param')" id="id_button">action</button>
注意:
我尝试过:
function doSomething(param){
var source = event.target || event.srcElement;
console.log(source);
}
在萤火虫上我得到事件未定义
编辑: 在一些答案之后,使用jQuery覆盖事件处理是非常可接受的。我的问题是如何使用它的原始参数调用原始的onClick函数,并且不知道函数名称。
代码:
<button onclick="doSomething('param')" id="id_button1">action1</button>
<button onclick="doAnotherSomething('param1', 'param2')" id="id_button1">action2</button>.
<button onclick="doDifferentThing()" id="id_button3">action3</button>
.
.
and so on..
所以覆盖将是:
$(document).on('click', 'button', function(e) {
e.preventDefault();
var action = $(this).attr('onclick');
/**
* What to do here to call
* - doSomething(this, 'param'); if button1 is clicked
* - doAnotherSomething(this, 'param1', 'param2'); if button2 is clicked
* - doDifferentThing(this); if button3 is clicked
* there are many buttons with many functions..
*/
});
答案 0 :(得分:27)
你的HTML应该是这样的:
<button onclick="doSomething" id="id_button">action</button>
并将输入参数重命名为此类事件
function doSomething(event){
var source = event.target || event.srcElement;
console.log(source);
}
可以解决您的问题。
作为旁注,我建议看一下jQuery和不引人注目的javascript
答案 1 :(得分:10)
您应该将生成的HTML更改为不使用内联javascript,而是使用addEventListener
代替。
如果您无法以任何方式更改HTML,您可以获取onclick
属性,使用的函数和参数,并将其“转换”为不显眼的javascript,而不是删除onclick
处理程序,并使用事件侦听器。
我们首先从属性中获取值
$('button').each(function(i, el) {
var funcs = [];
$(el).attr('onclick').split(';').map(function(item) {
var fn = item.split('(').shift(),
params = item.match(/\(([^)]+)\)/),
args;
if (params && params.length) {
args = params[1].split(',');
if (args && args.length) {
args = args.map(function(par) {
return par.trim().replace(/('")/g,"");
});
}
}
funcs.push([fn, args||[]]);
});
$(el).data('args', funcs); // store in jQuery's $.data
console.log( $(el).data('args') );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button onclick="doSomething('param')" id="id_button1">action1</button>
<button onclick="doAnotherSomething('param1', 'param2')" id="id_button1">action2</button>.
<button onclick="doDifferentThing()" id="id_button3">action3</button>
它为我们提供了一个由onclick
属性调用的所有和任何全局方法的数组,以及传递的参数,因此我们可以复制它。
然后我们只删除所有内联javascript处理程序
$('button').removeAttr('onclick')
并附上我们自己的处理程序
$('button').on('click', function() {...}
在这些处理程序中,我们将获取存储的原始函数调用及其参数,并调用它们
我们知道内联javascript调用的任何函数都是全局函数,我们可以用window[functionName].apply(this-value, argumentsArray)
调用它们,所以
$('button').on('click', function() {
var element = this;
$.each(($(this).data('args') || []), function(_,fn) {
if (fn[0] in window) window[fn[0]].apply(element, fn[1]);
});
});
在该点击处理程序中,我们可以在调用原始函数之前或之后添加我们想要的任何内容。
一个工作示例
$('button').each(function(i, el) {
var funcs = [];
$(el).attr('onclick').split(';').map(function(item) {
var fn = item.split('(').shift(),
params = item.match(/\(([^)]+)\)/),
args;
if (params && params.length) {
args = params[1].split(',');
if (args && args.length) {
args = args.map(function(par) {
return par.trim().replace(/('")/g,"");
});
}
}
funcs.push([fn, args||[]]);
});
$(el).data('args', funcs);
}).removeAttr('onclick').on('click', function() {
console.log('click handler for : ' + this.id);
var element = this;
$.each(($(this).data('args') || []), function(_,fn) {
if (fn[0] in window) window[fn[0]].apply(element, fn[1]);
});
console.log('after function call --------');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button onclick="doSomething('param');" id="id_button1">action1</button>
<button onclick="doAnotherSomething('param1', 'param2')" id="id_button2">action2</button>.
<button onclick="doDifferentThing()" id="id_button3">action3</button>
<script>
function doSomething(arg) { console.log('doSomething', arg) }
function doAnotherSomething(arg1, arg2) { console.log('doAnotherSomething', arg1, arg2) }
function doDifferentThing() { console.log('doDifferentThing','no arguments') }
</script>
答案 2 :(得分:2)
尝试这样的事情:
<html>
<body>
<script type="text/javascript">
function doSomething(event) {
var source = event.target || event.srcElement;
console.log(source);
alert('test');
if(window.event) {
// IE8 and earlier
// doSomething
} else if(e.which) {
// IE9/Firefox/Chrome/Opera/Safari
// doSomething
}
}
</script>
<button onclick="doSomething('param')" id="id_button">
action
</button>
</body>
</html>
答案 3 :(得分:0)
您可以在调用函数
时传递this
<button onclick="doSomething('param',this)" id="id_button">action</button>
<script>
function doSomething(param,me){
var source = me
console.log(source);
}
</script>
答案 4 :(得分:0)
我相信@slipset的解决方案是正确的,但不是跨浏览器就绪。
根据Javascript.info,事件(在标记事件之外引用时)一旦确定用这个简单的行定义,就会跨浏览器就绪:event = event || window.event
。
因此,完整的跨浏览器就绪功能将如下所示:
function doSomething(param){
event = event || window.event;
var source = event.target || event.srcElement;
console.log(source);
}
答案 5 :(得分:-1)
USE .live()
$(selector).live(events, data, handler);
从jQuery 1.7开始,不推荐使用.live()方法。使用.on()附加事件处理程序。
$(document).on(events, selector, data, handler);