我编写了一个名为search
的函数,我希望在点击链接时调用该函数,如下面的代码片段所示:
<script>
function search() {
console.log('Searching');
}
</script>
<a href="#" onclick="search();">Click here</a>
&#13;
但是,代码无法按预期工作,这会在点击链接时导致Uncaught TypeError: search is not a function
错误(在Chrome中)。
我尝试记录search
以查看错误被抛出的原因:
<a href="#" onclick="console.log(search)">Click here</a>
<script>
function search() {
console.log('Searching');
}
</script>
<a href="#" onclick="console.log(search);">Click here</a>
&#13;
这次,每次单击链接时,控制台都会记录一个空字符串。让我感到困惑的是,search
实际上被定义为其他地方的空字符串,使我的函数定义无用。
所以我想知道触发点击事件时会发生什么,以及此处search
何时定义?
答案 0 :(得分:4)
事实证明search
实际上指的是a
元素的search
属性,它是一个控制搜索参数的属性,恰好是一个空字符串这个案例。这是因为使用HTMLAnchorElement
,它是特殊的,因为它用于创建超链接并导航到其他地址,因此search
属性用于通过超链接控制搜索参数(类似于Location
)对象。然后,设置锚元素的search
属性将依次设置全局Location
实例window.location.search
。这会产生命名冲突,因为空字符串不是函数,而是抛出错误。
为函数使用其他名称以消除此冲突。请注意,如果您不使用a
,那么您会发现它运作正常:
<script>
function search() {
alert("foo");
}
</script>
<div onclick="search();">Click me!</div>
答案 1 :(得分:2)
Li357的答案解释了大多数情况,但要指出一点,其原因
<a onclick="search();">Click me!</div>
search
涉及锚点的search
属性的结果是,内联处理程序在其周围有一个隐式with(this)
。对于解释器,以上内容看起来像:
<a onclick="
with(this) {
search();
}
">Click me!</div>
并且search
是HTMLAnchorElement.prototype
的属性,因此在解释器开始寻找window
的属性名称之前,首先找到该属性。
这很不直观。最好避免内联处理程序,也要避免使用with
。您也可以使用Javascript正确添加事件监听器来解决该问题:
function search() {
console.log('Searching');
}
document.querySelector('a').addEventListener('click', search);
<a href="#">Click here</a>
答案 2 :(得分:0)
更改功能名称。刚试过你的代码,一旦我改变了函数的名称就可以了。
<body>
<script type="text/javascript">
function test() {
console.log('Searching');
}
</script>
<a href="#" onclick="test()">Click here</a>