Javascript a href=“”中的event.preventDefault()不阻止在IE和Firefox中跳转到页面顶部

Javascript a href=“”中的event.preventDefault()不阻止在IE和Firefox中跳转到页面顶部,javascript,jquery,firefox,Javascript,Jquery,Firefox,HTML: 链接跳转到页面顶部。我尝试使用event.preventDefault停止跳转到页面顶部。然而,它只在Chrome中有效,在IE和Firefox中不起作用。如何解决此问题?您不能仅使用window.event来控制事件。尝试将其标准化,如: function sendDetails(type) { if (event.preventDefault) { event.preventDefault(); } else { event.ret

HTML:

链接跳转到页面顶部。我尝试使用event.preventDefault停止跳转到页面顶部。然而,它只在Chrome中有效,在IE和Firefox中不起作用。如何解决此问题?

您不能仅使用window.event来控制事件。尝试将其标准化,如:

function sendDetails(type) {
    if (event.preventDefault) {
        event.preventDefault();
    } else {
        event.returnValue = false;
    }
    names = $("#names" + type).val();
    Input = encodeURIComponent($("#Input" + type).val());
    ....
您的HTML必须是:

function sendDetails(e, type) {
    var evt = window.event || e;
    if (evt.preventDefault) {
        evt.preventDefault();
    } else {
        evt.returnValue = false;
    }
    // ...
}
在这种情况下,您的HTML将是:

$(document).ready(function () {
    $(".button").on("click", function (e) {
        e.preventDefault();
        // Your sendDetails code (without the "event" stuff)
        // OR call sendDetails (and remove the "event" stuff in the sendDetails function)
    });
});
尽管这比使用我提供的.button选择器更容易定位应用于的特定元素。我确信button类不仅仅适用于这些目标,但也许我错了:

在这种情况下使用jQuery是很好的,因为它已经标准化了事件对象,您只需使用click回调中包含的e变量即可。我确信它不仅仅是window.event | | e,所以我更喜欢/建议使用jQuery来处理事件。

您不能只使用window.event来控制事件。尝试将其标准化,如:

function sendDetails(type) {
    if (event.preventDefault) {
        event.preventDefault();
    } else {
        event.returnValue = false;
    }
    names = $("#names" + type).val();
    Input = encodeURIComponent($("#Input" + type).val());
    ....
您的HTML必须是:

function sendDetails(e, type) {
    var evt = window.event || e;
    if (evt.preventDefault) {
        evt.preventDefault();
    } else {
        evt.returnValue = false;
    }
    // ...
}
在这种情况下,您的HTML将是:

$(document).ready(function () {
    $(".button").on("click", function (e) {
        e.preventDefault();
        // Your sendDetails code (without the "event" stuff)
        // OR call sendDetails (and remove the "event" stuff in the sendDetails function)
    });
});
尽管这比使用我提供的.button选择器更容易定位应用于的特定元素。我确信button类不仅仅适用于这些目标,但也许我错了:

在这种情况下使用jQuery是很好的,因为它已经标准化了事件对象,您只需使用click回调中包含的e变量即可。我确信它不仅仅是window.event | | e,所以我更喜欢/建议使用jQuery来处理事件。

而不是使用javascript:;因此没有跳转,请确保返回false以禁用链接行为

<a href="#" class="button">ASDF</a>
您可以使用javascript来代替;因此没有跳转,请确保返回false以禁用链接行为

<a href="#" class="button">ASDF</a>

您已经在使用jQuery了,只需使用jQuery的方式即可。jQuery包装了事件对象并提供了一个规范化的事件对象,因此您可以只使用标准,而不需要根据浏览器支持的内容进行分叉

<a href="javascript:;" onclick="something();return false;">link</a>

您已经在使用jQuery了,只需使用jQuery的方式即可。jQuery包装了事件对象并提供了一个规范化的事件对象,因此您可以只使用标准,而不需要根据浏览器支持的内容进行分叉

<a href="javascript:;" onclick="something();return false;">link</a>

如何在sendDetailstype中获取事件?尝试在函数末尾添加一个返回false…从何处调用sendDetails?事件来自何处?你怎么打电话给sendDetails?jQuery提供了一个统一的事件接口,您可以安全地调用event.preventDefault…这是我在我的php页面中调用的方式…如何在sendDetailstype中获取事件?尝试在函数末尾添加一个返回false…您从何处调用sendDetails?事件来自何处?你怎么打电话给sendDetails?jQuery提供了一个统一的事件接口,您可以安全地调用event.preventDefault…这是我在php页面中调用的方式…响应不错,但我认为应该有一个习惯,使用@gaurav,防止默认行为或返回false将防止实际发生错误。无论如何,这是一场大辩论。视情况而定。我宁愿使用href,因为如果发生了不应该发生的坏事,那么我可以直观地看到它……这意味着代码有问题。如果您正确地处理事件,则可以选择其中一种。另外,我也不确定如果禁用Javascript并使用void的话会发生什么:你写的东西不重要,重要的是你如何以干净的方式处理它way@gaurav:更好:使用链接实现其目的,即链接到文档的其他文档/部分。使用按钮进行用户交互。不管怎样,你都可以随心所欲地设计其中的任何一个。@FelixKling哈哈,我同意这一点,尽管我有时会因为使用链接作为按钮而感到内疚……反应不错,但我认为人们应该有使用@gaurav的习惯。好吧,防止默认行为或返回false将防止错误的实际发生。无论如何,这是一场大辩论。视情况而定。我宁愿使用href,因为如果发生了不应该发生的坏事,那么我可以直观地看到它……这意味着代码有问题。如果您正确地处理事件,则可以选择其中一种。另外,我也不确定如果禁用Javascript并使用void的话会发生什么:你写的东西不重要,重要的是你如何以干净的方式处理它way@gaurav:更好:使用链接实现其目的,即链接到文档的其他文档/部分。使用按钮进行用户交互。不管怎样,你都可以随心所欲地为其中任何一个设置样式。@FelixKling哈哈,我同意这一点,尽管我对有时使用链接作为按钮感到内疚……onclick,函数{……}更好,因为jQuery使用事件delega
tes和是由them@FibreFoX不是真的。单击函数{};与.onclick相同,函数{};-这只是一条捷径。实际的事件委派是通过使用on实现的,但有3个参数…它并不真正适用于这种情况@伊恩:是的,这是一个快捷方式,但是想象一下,如果将方法导出到插件中,就可以将名称空间放入eventnames onclick.yourNameSpace中。激活/取消激活变得更容易,顺便说一句:打开2个参数或只需单击一次就可以了code@FibreFoX我并不反对你的观点,他们应该使用on而不是click。我不同意你的观点,关于on和两个参数使用事件委托的事实……它没有;具有三个参数的on不起作用。这只是你的意见,对更好。这并不是每种情况都重要。双方都有理由。@FibreFoX事件委托很好,但并非在所有情况下都有必要。例如,问题中的示例显示了一个按钮,您不需要授权。我确实怀疑实际的实现有不止一个按钮,在这种情况下,授权可能是合适的。但是,提供的代码没有提供足够的上下文来知道将委托附加到何处,将其附加到bodyála.live将提供比仅附加几个单独的事件处理程序差得多的性能。onclick,函数{…}更好,因为jQuery使用事件委托,并且由them@FibreFoX不是真的。单击函数{};与.onclick相同,函数{};-这只是一条捷径。实际的事件委派是通过使用on实现的,但有3个参数…它并不真正适用于这种情况@伊恩:是的,这是一个快捷方式,但是想象一下,如果将方法导出到插件中,就可以将名称空间放入eventnames onclick.yourNameSpace中。激活/取消激活变得更容易,顺便说一句:打开2个参数或只需单击一次就可以了code@FibreFoX我并不反对你的观点,他们应该使用on而不是click。我不同意你的观点,关于on和两个参数使用事件委托的事实……它没有;具有三个参数的on不起作用。这只是你的意见,对更好。这并不是每种情况都重要。双方都有理由。@FibreFoX事件委托很好,但并非在所有情况下都有必要。例如,问题中的示例显示了一个按钮,您不需要授权。我确实怀疑实际的实现有不止一个按钮,在这种情况下,授权可能是合适的。但是,提供的代码没有提供足够的上下文来知道将委托附加到何处,将其附加到bodyála.live将提供比仅附加几个单独的事件处理程序更差的性能。