【问题标题】:Using jQuery to trigger html onclick event使用jQuery触发html onclick事件
【发布时间】:2011-06-05 05:03:45
【问题描述】:
<input type="text" id="test_value" name="test_value" value="xyz" />
<input id="test_default" name="test_default" type="checkbox" onclick="with(this.form.elements['test_value']) { disabled = this.checked; if (this.checked) { value = ''; } else {if(value=='') {value=' '; value = '';}}};" />

内联 onclick 是由我无法控制的 cms 生成的。 我想用 jQuery 执行 $("#test_default").click(); 但这不起作用,因为它没有绑定到 jQuery 事件管理器。

我一直在尝试各种变化

$("#test_default").click(function (e) {
                    $(e.target).attr("onclick").apply(checkbox, [e]);
                    return false;
                }).click();

但无济于事。请帮忙。

谢谢。

onclick 中可能内嵌了许多不同的函数。复制它们并并行运行它们并不是一个真正的选择。

答案在小型演示中有效,但在现场环境中无效。请查看http://jsfiddle.net/GtJjt/ 我需要以编程方式触发复选框。

奇怪的是只有$("#metadata_field_text_10190_default")[0].click(); 正确触发了事件。谁能解释一下?

【问题讨论】:

  • 上没有类型。您可能必须绑定 click() 或使用 live()。

标签: javascript jquery javascript-events


【解决方案1】:

我使用下一个代码:

$("your_selector")[0].click();

在你的情况下:

 $("#test_default")[0].click();

【讨论】:

    【解决方案2】:

    我在html中使用了带有onclick事件的触发器如下:

    $("#test_default").trigger("onclick");
    

    【讨论】:

    • 这对我有用。但是我没有使用.trigger("onclick"),而是使用了.trigger("click")。再次感谢!
    • 很高兴认识你@AnneLagang
    • 这样更好。
    【解决方案3】:

    直接调用原生DOM的onclicksee demo):

    $("#test_default")[0].onclick();
    

    或者,完全没有 jQuery,

    document.getElementById("test_default").onclick();
    

    更新:

    实际问题在于 jQuery 的 .click() 和内联 onclick 代码之间的交互。 jQuery 的.click() 实际上做了两件事:它首先 触发任何事件处理程序,包括 内联onclick 代码,然后 它导致复选框被选中。

    问题出现是因为内联代码测试复选框是否被选中。因为这是首先触发的,所以代码发现复选框未选中,并且不执行任何操作。现在完成后,jQuery 会检查复选框。

    我们如何解决这个问题?我们先手动勾选复选框,然后调用内联处理程序。不幸的是,我们不能使用 jQuery 的 .click() 来调用内联处理程序,因为它会再次取消选中该复选框(如果您将来添加这些,它还会调用其他 jQuery 绑定的事件处理程序,您可能不希望这样)。因此我们使用我之前描述的原生 DOM 方法,因为它的唯一作用是运行内联代码。

    最终代码是这样的:

    $("#metadata_field_text_10190_default").attr("checked", true)[0].onclick();
    

    查看演示:http://jsfiddle.net/GtJjt/3/。 (我在演示的内联代码中包含了console.log,以证明内联代码正在运行。如果您的浏览器不是 Firefox 或 Chrome,请删除它,否则会崩溃)。

    再次更新

    Simon 之前没有看到您的解决方案,感谢您提醒我有关 [0].click() 的信息。本质上,它是 jQuery 的 .click() 的原生等效项,并且可以工作,因为它执行我上面描述的操作(首先选中复选框,然后调用内联代码)。一个警告:这也将调用任何与 jQuery 绑定的事件处理程序,这可能不是你想要的。

    【讨论】:

    • 太棒了。感谢您澄清我的主要代码在$("input[type=checkbox]:checked").each(function() {}); 内,所以无论如何都可以使用。很高兴解决这个问题。
    • @Simon 不客气。不过最好接受正确的答案:P
    【解决方案4】:

    只是不要return false,它会被调用:

    $("#test_default").click(function (e) {
      //hi!
    }).click();
    

    如果您想阻止默认操作,请改用e.peventDefault(),这不会终止该事件。此外,关于您的内联 onclick 处理程序(为什么不all 不显眼?),我强烈建议不要使用 with

    【讨论】:

    • 它是由 CMS 生成的,是 HTML 标准的祸根。
    • 谢谢。这也有效。但是@Box9 在一分钟前就使用了更少的字符。您确实具有稍后能够使用 .click() 方法的优势。干杯。
    • @Simon - 更少的字符!= 更正确,你为什么要杀死一个你不需要的事件?如果你想要更少的字符并且你的处理程序中没有其他任何东西$("#test_default").click(),但这不是你问的:)
    • 尼克,您的答案绑定了第二个处理程序并触发它,而@Simon 的问题似乎只是询问如何触发内联onclick 属性。虽然 jQuery 的 .click() 应该 触发了这个内联代码,但我想还有其他事情正在阻止它,因为 Simon 说 $("#test_default").click(); 不起作用。如果是这种情况,我看不出这个答案有什么不同,以及为什么需要任何绑定。
    • @Simon - 它确实有效,这是订购问题,我会在这里使用onchange inline,然后在 jQuery 中使用click(如果可能的话),就像这样:jsfiddle.net/nick_craver/GtJjt/4
    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多