javascript - 将 onclick 事件设置为自定义函数会导致语法错误

标签 javascript onclick dom-events

鉴于以下示例代码,我想将 onclick 事件设置为我在同一方法中声明的函数(全局范围内没有函数):

<HTML>
<HEAD>
<Title>Title</Title>
</HEAD>
<body>
<img id="img" class="std" src="http://www.free-animated-pictures.com/bug_crawls_on_screen.gif"/>
<script type='text/javascript'>
var i = document.getElementById("img");
var func = function(){
    var i = document.getElementById("img");
    if(i.className === "std"){
        i.className = "hid";
        i.style.display = "none";
    }
    else if(i.className === "hid"){
        i.className = "std";
        i.style.display = "block";
    }
};
//func = func.toString();
//func = func.replace("function ()", "")
document.body.setAttribute("onclick", func);
</script>
</body>
</HTML>

如果我按原样使用代码,则在事件触发时只会收到以下错误:

Uncaught SyntaxError: Unexpected token (

如果我获取函数的字符串并删除其中的 function 部分,则脚本将按预期工作:

func = func.toString();
func = func.replace("function ()", "")

为什么会这样呢?有没有更好的办法?显然我无法声明没有 function 部分的函数,那么再次删除它有什么意义呢?

最佳答案

您使用 setAttribute 设置实际文本元素的属性 string,该属性又自动包装在函数中!
另外,如果它有效的话,一旦图像消失,就不会再有任何可以点击的物体了。

这是一个工作示例您不应该使用,只是为了解释上述声明:

这里有一个函数func,它被转换为字符串(在需要字符串的地方,javascript通常会自动调用.toString()方法,我把它放在清楚地显示发生了什么)。
然后,为了防止引用问题(您在 html 中使用了双引号,并且出于某些(在我看来,疯狂的)原因,某些浏览器将 javascript 中的单引号替换为双引号(我什至亲眼目睹了某些浏览器中的一些预编译) )),我天真(因为对于这个特定函数来说是安全的)将所有双引号替换为单引号。
然后我们仍然需要删除 function(){ 和尾随的 }
现在我们到达了函数字符串,我们可以传递它。
最后,浏览器设置实际的文本属性并将代码再次包装在函数内,以便其正常工作。

<img id="img" class="std" src="http://www.free-animated-pictures.com/bug_crawls_on_screen.gif" />
intentional text filler, otherwise body shrinks to 0*0 px leaving nothing to click on...
<script type='text/javascript'>
var func = function(){ 
    var i = document.getElementById('img');
    if(i.className === 'std'){
        i.className = 'hid';
        i.style.display = 'none';
    }
    else if(i.className === 'hid'){
        i.className = 'std';
        i.style.display = 'block';
    }
};

document.body.setAttribute( 'onclick'
                          , func.toString()
                                .replace(/\"/g,'\'')
                                .replace(/^function *\( *\) *{/,'')
                                .replace(/} *$/,'')
                          );
</script>

解决方案显然是直接document.body.onclick=func(正如gillesc已经评论的那样),或者使用document.body.addEventListener('click' ,func,false) (这可能是您感到困惑的)。

请注意,为了向后兼容(尤其是 < IE9),您需要 attachEvent,这是一个基本的 workaround :

function addEventHandler(elem, eventType, handler) {
 if (elem.addEventListener)
     elem.addEventListener (eventType,handler,false);
 else if (elem.attachEvent)
     elem.attachEvent ('on'+eventType,handler); 
}

关于javascript - 将 onclick 事件设置为自定义函数会导致语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30248735/

相关文章:

javascript - 单击 WordPress 中的按钮后调用函数(开发插件)

javascript - 如何根据嵌套数组中的值检索正确的父对象

javascript - 无法在 setTimeout() 函数调用的对象函数中获取具有 "this"属性的对象变量

javascript - 如果cookie存在,如何隐藏div

javascript - 进行多个 fb.api 调用

javascript - 在更改图像或重新加载页面时将页面保持在一个位置?

javascript - ReactJS onClick 不起作用 - 浏览器和系统控制台中没有任何反应

javascript - 一个 html 文件中正在处理大量数据(过载)

javascript - 如何使用 Javascript 知道按下的键?

javascript - 原型(prototype)事件 : Use Input Value From When Event is Created