Javascript onClick在p标记上无法正常工作

Javascript onClick在p标记上无法正常工作,javascript,onclick,Javascript,Onclick,我想将单击事件绑定到每个,但它似乎无法正常工作 当我运行脚本时,我立即收到三个警报。我只想在单击三个'中的任何一个时获取它们 谁能告诉我我做错了什么 编辑:Sry这就是它的样子。 HTML就像它应该的那样:text等等 (function () { var myFunction = function (theP) { alert(theP.id) } window.onload = function () {

我想将单击事件绑定到每个
,但它似乎无法正常工作

当我运行脚本时,我立即收到三个警报。我只想在单击三个
'
中的任何一个时获取它们

谁能告诉我我做错了什么

编辑:Sry这就是它的样子。 HTML就像它应该的那样:

text

等等

(function () {
    var myFunction = function (theP) {
            alert(theP.id)          
        }


    window.onload = function () {           
        var pTags = document.getElementsByTagName('p'),
            pLength = pTags.length,
            i;

        for (i = 0; i < pLength; i += 1) {
            if(pTags[i].className == 'special'){

                pTags[i].onClick = myFunction(pTags[i]);

            }
        };
    }
})();
(函数(){
var myFunction=函数(theP){
警报(密码id)
}
window.onload=函数(){
var pTags=document.getElementsByTagName('p'),
充压长度=ptag.长度,
我
对于(i=0;i
注:我无法使用jQuery atm

请尝试替换

pTags[i].onClick = myFunction(pTags[i]);

您可以看到,当您指定给对象的
onClick
时,您正在将表达式的结果复制到该对象。您应该复制的是单击
p
时要调用的函数

相反,您运行的是命令
myFunction(pTags[i])
,该命令执行
alert()
s,并获取函数的结果。现在,由于函数不返回任何内容,表达式
myFunction(pTags[i])
的值未定义

然后取该值,并将其分配给
onClick
。所以基本上你所做的是:

对于每个“特殊”段落:

  • 执行
    警报
  • undefined
    分配给段落的
    onClick

  • myFunction需要返回一个函数才能让代码正常工作

    下面有人提到一个尝试创建内联函数的选项,但由于闭包绑定是使用变量而不是值进行的,因此这将不起作用(代码中的
    i
    将在函数中包含后进行修改)

    创建函数并使其工作有两种明显的方法。一个是创建每个处理程序函数。。。另一个是使用
    this
    获取元素

    (function () {
        var myFunction = function (theP) {
                return function() {
                    alert(theP.id);
                }                 
            }
    
    
        window.onload = function () {                       
            var pTags = document.getElementsByTagName('p'),
                    pLength = pTags.length,
                    i;
    
            for (i = 0; i < pLength; i += 1) {
                    if(pTags[i].className == 'special'){
    
                            pTags[i].onClick = myFunction(pTags[i]);
    
                    }
            };
        }
    })();
    

    第二种格式是首选格式,因为浏览器使用的内存要少得多。

    。onclick区分大小写,不是吗?

    您正在调用函数。使用括号时,调用函数

    onclick需要函数引用:

    您可以通过以下方式修改代码:

    myFunction(theP){
     return function(){alert(theP.id)};
    }
    

    这将确保您的调用返回函数引用而不是值。

    谢谢您的回答。非常感谢
    我重写了我自己的脚本,并像这样解决了它: 看起来怎么样

    (function () {
        var myFunction1 = function (theP) {
                theP.onclick = myFunction2;
            },
    
            myFunction2 = function(){
                alert('hello world')
            }
    
    
        window.onload = function () {           
            var pTags = document.getElementsByTagName('p'),
                pLength = pTags.length,
                i;
    
            for (i = 0; i < pLength; i += 1) {
                if(pTags[i].className == 'special'){
                    myFunction1(pTags[i]);
                }
            }
        }
    })();
    
    (函数(){
    var myFunction1=函数(theP){
    theP.onclick=myFunction2;
    },
    myFunction2=函数(){
    警报(“你好,世界”)
    }
    window.onload=函数(){
    var pTags=document.getElementsByTagName('p'),
    充压长度=ptag.长度,
    我
    对于(i=0;i
    我们能看到您的html代码片段吗?你没有嵌套的p标签,是吗?一旦你解决了scraimer提到的函数问题,这段代码仍然不能在所有浏览器中工作。考虑与在.@艾伦中显示的方法绑定,我精确地编辑了我的帖子。您所做的是将单击事件分配给函数调用(即现在调用函数,并将结果分配给事件)。您需要的是将事件实际分配给函数。顺便说一句,刚刚测试过,
    onClick
    在Chrome最新版本、Opera 10、Firefox3.7和IE8上不起作用。只有
    onclick
    work所有人都以
    onclick
    为例,所以我很震惊,我的生活中是否有重大误解,幸运的是没有谢谢你!因为我输入了错误的东西,所以我更改了代码。myFunction声明为'var myFunction=function(theP){..}'
    myFunction(theP){
     return function(){alert(theP.id)};
    }
    
    (function () {
        var myFunction1 = function (theP) {
                theP.onclick = myFunction2;
            },
    
            myFunction2 = function(){
                alert('hello world')
            }
    
    
        window.onload = function () {           
            var pTags = document.getElementsByTagName('p'),
                pLength = pTags.length,
                i;
    
            for (i = 0; i < pLength; i += 1) {
                if(pTags[i].className == 'special'){
                    myFunction1(pTags[i]);
                }
            }
        }
    })();