使用Javascript函数更改onclick操作


69

我有一个按钮:

<button id="a" onclick="Foo()">Button A</button>

当我第一次单击此按钮时,我希望它执行Foo(可以正确执行):

function Foo() {
  document.getElementById("a").onclick = Bar();
}

第一次单击按钮时,我想发生的事情是将onclick函数从更改Foo()Bar()。到目前为止,我只能实现无限循环或完全没有变化。Bar()看起来像这样:

function Bar() {
  document.getElementById("a").onclick = Foo();
}

因此,单击此按钮只是交替调用哪个函数。我该如何工作?另外,有什么更好的方式显示/隐藏帖子的全文?它最初开始短路,我提供一个按钮来“查看全文”。但是,当我单击该按钮时,我希望用户能够再次单击该按钮以使长文本消失。

这是完整的代码,如果有帮助的话:

function ShowError(id) {
    document.getElementById(id).className = document.getElementById(id).className.replace(/\bheight_limited\b/, '');
    document.getElementById(id+"Text").className = document.getElementById(id+"Text").className.replace(/\bheight_limited\b/, '');
    document.getElementById(id+"Button").innerHTML = "HIDE FULL ERROR";
    document.getElementById(id+"Button").onclick = HideError(id);
}

function HideError(id) {
    document.getElementById(id).className += " height_limited";
    document.getElementById(id+"Text").className += " height_limited";
    document.getElementById(id+"Button").innerHTML = "SHOW FULL ERROR";
    document.getElementById(id+"Button").onclick = "ShowError(id)";
}

2
因为您是专门询问香草JavaScript的,所以我不是要回答这个问题,但是您可能希望研究jQuery。这是一个JavaScript库,可以帮助您完成问题中的工作。
JasCav 2011年

了解JQuery,在这种情况下只能使用Javascript。谢谢。
托尼·史塔克

1
onclick属性应全部小写。developer.mozilla.org/en/DOM/element.onclick
Matt Ball

是否不使用+ =添加事件处理程序?也许您甚至可能需要这样做:myobject.onclick += function() { Foo(); }
MikaelÖstberg

1
原来我不需要+ =。我认为+ =不会删除现有的onclick函数,对吗?
托尼·史塔克

Answers:


106

您的代码正在调用该函数,并将返回值分配给onClick,也应为“ onclick”。这就是它的外观。

document.getElementById("a").onclick = Bar;

查看其他代码,您可能想要执行以下操作:

document.getElementById(id+"Button").onclick = function() { HideError(id); }

10
只是想补充一点,Ryan在Bar之后不包含括号,因为它不是函数调用。
金鱼

...您可能想执行以下操作:.onclick = HideError; //如果这行不通,为什么不呢?与上述答案的区别是什么?
pashute

@pashute的区别在于,.onclick = HideError将调用,HideError(event: MouseEvent)而上述答案将调用HideError(id)。如果您不关心参数,则可以使用较短的版本,并忽略传入的事件
Patrick

65
var Foo = function(){
    document.getElementById( "a" ).setAttribute( "onClick", "javascript: Boo();" );
}

var Boo = function(){
    alert("test");
}

2
这似乎是最好的方法。尽管其他方法可行,但在某些情况下可能无法直接向onclick添加功能。在循环中创建多个按钮并为循环中的每个按钮分配onclick函数的情况下,我遇到了一个问题。它将最后一个按钮的功能分配给所有按钮。使用此方法就像一个魅力。谢谢荷尔!
Deepak GM

1
应该是onclick,不是onClick
2014年

@ user66001没关系,HTML不区分大小写
Kyle

@Calne-骆驼案可能会让人们认为它是必须的。
user66001

2
这仍然是真的吗?'onClick'对我不起作用,但'onclick'对我有用。在Windows 7 64位上使用Chrome 47。
Sujay Phadke 2015年

21

分配新的onclick处理程序时不要调用该方法。

只需删除括号:

document.getElementById("a").onclick = Foo;

更新(由于新信息):

document.getElementById("a").onclick = function () { Foo(param); };

不幸的是,我有一个需要存在的参数。那会改变你的答案吗?
托尼·史塔克

1
@hatorade:使用onclick = function(){Foo(params); };
里德

@hatorade-是的document.getElement... function() { Foo(param);};
John Giotta 2011年

谢谢大家的帮助。如果可以的话,我会给你答案,但瑞恩很快就得到了答案。抱歉:(。我还是+1了!
Tony Stark

1
应该是.onclick而不是.onClick吗?
GlennG

10

我推荐这种方法:

而不是只有两个单击处理程序,而只有一个具有if-else语句的函数。让BUTTON元素的状态确定执行if-else语句的哪个分支:

HTML:

<button id="a" onclick="toggleError(this)">Button A</button>

JavaScript:

function toggleError(button) { 
    if ( button.className === 'visible' ) {
        // HIDE ERROR
        button.className = '';
    } else {
        // SHOW ERROR
        button.className = 'visible';
    }
}

现场演示: http : //jsfiddle.net/simevidas/hPQP9/


我个人喜欢这种解决方案,因为它可以将按钮的代码保持在一起(并且是切换按钮,如果您要更新一侧,通常您要更新另一侧),但是我也在使用Vue并使用v-on:click ,因此最佳答案似乎并不适合我。谢谢Sime!
OhFiddleDiddle

10

感谢JoãoPaulo Oliveira,这是我的解决方案,其中包括一个变量(这是我的目标)。

document.getElementById( "myID" ).setAttribute( "onClick", "myFunction("+VALUE+");" );


3

可能更容易的是具有两个按钮,并在您的功能中显示/隐藏它们。(即display:none|block;)然后,每个按钮都可以拥有您自己的onclick,无论您需要什么代码。

因此,起初button1将是display:block并且button2将是display:none。然后,当你点击button1它会切换button2display:blockbutton1display:none


完美的答案!对于不太真正了解javascript的人,这是一种非常有用的方法。
RolandiXor

0

对于像我这样的人,尝试在操作上设置查询字符串,并想知道为什么它不起作用-

您不能为GET表单提交设置查询字符串,但是我发现可以为POST设置查询字符串。

对于GET提交,您必须在隐藏的输入中设置值,例如

的动作:"/handleformsubmission?foo=bar" 将被添加为隐藏字段,例如:<input type="hidden" name="foo" value="bar" />

可以在JavaScript中动态添加为(其中clickedButton是被单击的提交按钮:

var form = clickedButton.form;
var hidden = document.createElement("input");
hidden.setAttribute("type", "hidden");
hidden.setAttribute("name", "foo");
hidden.setAttribute("value", "bar");
form.appendChild(hidden);

请参阅此问题以获取更多信息,以 提交带有查询字符串参数且隐藏参数消失的GET表单。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.