JQuery希望更新元素的onClick方法。jQuery';s click()函数不是';t使用我正在使用的语法

JQuery希望更新元素的onClick方法。jQuery';s click()函数不是';t使用我正在使用的语法,jquery,Jquery,我仍然在努力了解jQuery,提前感谢您的帮助 此代码的某些上下文。这是一个允许用户动态添加问题的页面,每个问题都可以输入相关的答案 我的思考过程是,为了在正确的问题元素中生成答案输入框,我需要将相关的问题ID传递给addAnswer函数 因此,我尝试使用attr()并更新add Answer href的onClick属性,但一些谷歌搜索让我尝试了click()函数 我得到的行为是,每当运行addQuestion()时,addAnswer()似乎也会运行,因为我会收到两个警报 这是密码 <

我仍然在努力了解jQuery,提前感谢您的帮助

此代码的某些上下文。这是一个允许用户动态添加问题的页面,每个问题都可以输入相关的答案

我的思考过程是,为了在正确的问题元素中生成答案输入框,我需要将相关的问题ID传递给addAnswer函数

因此,我尝试使用attr()并更新add Answer href的onClick属性,但一些谷歌搜索让我尝试了click()函数

我得到的行为是,每当运行addQuestion()时,addAnswer()似乎也会运行,因为我会收到两个警报

这是密码

<script>
currentQuestion = 1;

function addQuestion(){      
$('#question0Container').clone().attr('id','question'+currentQuestion).appendTo('#questionArea');
$('addAnswer0').click(addAnswer('0'));
currentQuestion++;
}

function addAnswer(question){
alert(question);
}
</script>

<div id="questionArea">
<div id="question0Container" class="questionContainer">
<textarea id="question0" name="question0"></textarea>
    <div id="answer0Container">
    <h2>Answers</h2>
    <input type="text" id="0-answer1" />
    </div>

    <p><a href="#" id="addAnswer0" class="link-sm">Add Answer</a></p>
    </div>
</div>

<a href="#" onClick="addQuestion();" id="addQuestion" title="Add a question" class="link-sm" style="background-color:red;">Add Question</a>

当前问题=1;
函数addQuestion(){
$('question0Container').clone().attr('id','question0'+currentQuestion').appendTo('questionArea');
$('addAnswer0')。单击(addAnswer0');
当前问题++;
}
功能添加答案(问题){
警惕(问题);
}
答案


最简单的方法是提供一个(有时称为lambda表达式):


问题是jQuery事件函数将函数作为参数。也就是说,jQuery库是围绕以下概念组织的。在JavaScript中,如果希望调用函数foo,则编写foo();而如果你只想引用一个函数,传递它,你只需要写foo。但是,在本例中,您希望传递一个参数,因此您希望创建一个新的匿名函数,该函数只调用另一个函数,并传递参数。

最简单的方法是提供一个(有时称为lambda表达式):


问题是jQuery事件函数将函数作为参数。也就是说,jQuery库是围绕以下概念组织的。在JavaScript中,如果希望调用函数foo,则编写foo();而如果你只想引用一个函数,传递它,你只需要写foo。但是,在本例中,您希望传递一个参数,因此您希望创建一个新的匿名函数,该函数只调用另一个函数,传递参数。

问题在于:

$('#addAnswer0').click(addAnswer('0'));
您正在调用
addAnswer
函数,而不是将其作为处理程序传入。这就是为什么您在调用
addQuestion
时会收到
addAnwser
警报的原因@Daniel的答案应该可以解决这个问题,给你一个传递函数

我认为我们可能遗漏了一些上下文(例如,您要克隆的
#问题0容器
中的代码是什么)。当您提到
#addAnswer0
时,它应该在新的克隆容器中,还是在
#问题0容器中
?如果它是新克隆容器中的一个按钮(这很有意义),您是否应该更改按钮的id以使用
currentQuestion
计数器

编辑:我有一个问题。相关代码:

var currentQuestion = 1;

function addAnswer() {
   // just look for the parent container
   alert($(this).closest('div').attr('id'));
   return false; // need this to keep the link from
                 // being followed
}

function addQuestion(){      
    var newContainer = $('#question0Container')
      .clone()
      .attr('id','question'+currentQuestion)
      .appendTo('#questionArea');

    $('a.addAnswer', newContainer).click(addAnswer);
    currentQuestion++;
}

// apply it to the existing one too
$(function() {
    $('a.addAnswer').click(addAnswer);
});

这里的要点是,使用jQuery的更好方法不是试图操纵和传递ID;它是按上下文查找内容(例如,查找父容器)。

问题在于,您有:

$('#addAnswer0').click(addAnswer('0'));
您正在调用
addAnswer
函数,而不是将其作为处理程序传入。这就是为什么您在调用
addQuestion
时会收到
addAnwser
警报的原因@Daniel的答案应该可以解决这个问题,给你一个传递函数

我认为我们可能遗漏了一些上下文(例如,您要克隆的
#问题0容器
中的代码是什么)。当您提到
#addAnswer0
时,它应该在新的克隆容器中,还是在
#问题0容器中
?如果它是新克隆容器中的一个按钮(这很有意义),您是否应该更改按钮的id以使用
currentQuestion
计数器

编辑:我有一个问题。相关代码:

var currentQuestion = 1;

function addAnswer() {
   // just look for the parent container
   alert($(this).closest('div').attr('id'));
   return false; // need this to keep the link from
                 // being followed
}

function addQuestion(){      
    var newContainer = $('#question0Container')
      .clone()
      .attr('id','question'+currentQuestion)
      .appendTo('#questionArea');

    $('a.addAnswer', newContainer).click(addAnswer);
    currentQuestion++;
}

// apply it to the existing one too
$(function() {
    $('a.addAnswer').click(addAnswer);
});

这里的要点是,使用jQuery的更好方法不是试图操纵和传递ID;它是根据上下文查找内容(例如查找父容器)。

我确实注意到人们在谷歌搜索时正在这样做。只是给了它一个机会,它确实在addQuestion函数运行时取消了警报,但它似乎没有绑定到href。顺便说一句,我注意到我忘记了选择器前面的。我修好了,还是没有骰子。谢谢你的解释!有道理。我仍在努力,我也将发布html代码,这可能会有所帮助。@Bob Jones:我不确定你所说的“绑定到href”是什么意思。jQuery click事件处理点击(或作为点击处理的其他UI事件)——它不修改标记的href属性或类似的内容。你到底想做什么?@Bob Jones:在回答你的问题时,你的问题是:在同一个文件中混合内联事件处理程序(与HTML混合)和编程应用的事件处理程序(使用jQuery)是一种奇怪的风格。我建议你只使用其中一种。也就是说,不需要使用带有虚拟href的锚定标记来获取可单击的元素。在现代浏览器中,JavaScript可以将事件处理程序附加到任何DOM元素,而不仅仅是链接和按钮。我刚刚更新了代码以包含HTML,这将为您提供更多上下文。对于每个生成的问题div,我需要允许用户为该问题创建一对多的答案。这里有一个页面的线框,可能也会有帮助。我想把当前问题的ID传递给addAnswer函数,这样我就知道该向哪个问题添加答案了。我确实注意到人们在谷歌搜索时正在这样做。只是给了它一个机会,它确实在addQuestion函数运行时取消了警报,但它似乎没有绑定到href。顺便说一句,我