【问题标题】:jQuery .click() not working in Internet Explorer 9/10jQuery .click() 在 Internet Explorer 9/10 中不起作用
【发布时间】:2013-05-19 16:53:08
【问题描述】:

下面是一个更大项目的一部分(显然),它在 Chrome、Firefox 和 Opera 中运行良好,但 .click() 函数没有被 IE9 或 10 调用。

jQuery('.current img').hover(function() {
    var thisElem = jQuery(this);

    thisElem.parent().parent().find('.hotspot span:not(.select-image)').remove();
    thisElem.parent().parent().find('.hotspot img').parent().find('span.select-image').remove();

    jQuery('<span class="zoom-out"></span>').prependTo(thisElem.parent()).click(function() {
        z -= .1;
        z = Math.max(z, 1);

        jQuery(this).parent().find('img').attr('src', '<?php echo $urlPrefix; ?>/zcard-thumbnail-image/photos/<?php echo $modelId; ?>/low/' + i + '/' + (w * z) + '/' + (h * z) + '/file');
    });

    jQuery('<span class="select-image"></span>').prependTo(thisElem.parent());

    jQuery('<span class="zoom-in"></span>').prependTo(thisElem.parent()).click(function() {
        z += .1;
        z = Math.min(z, 5);

        jQuery(this).parent().find('img').attr('src', '<?php echo $urlPrefix; ?>/zcard-thumbnail-image/photos/<?php echo $modelId; ?>/low/' + i + '/' + (w * z) + '/' + (h * z) + '/file');
    });
});

据我所知,.click() 没有绑定,因为元素还不存在。如果我改为使用 jQuery(target).prepend(element),然后发出延迟进一步执行的警报,然后 .click() 绑定,一切正常。不幸的是,用 delay() 替换警报不会产生相同的结果。

请问大家有什么建议吗?

【问题讨论】:

  • 你当然在某处声明了zhw
  • 哈,我做到了 =)。这一切都在其他浏览器中完美运行,如果我使用警报来导致创建元素和添加绑定之间的延迟,那么一切在 IE9/10 中也能正常运行。好像 IE 在更新 DOM 时太慢了,无法在创建后立即附加绑定。
  • 这是一个更旧的版本,但同样的问题似乎出现在这个问题上(我现在正在尝试调试的系统的一部分的模拟、线框构建,恐怕我无法提供访问):development.qweb.co.uk/tim-bailey/zcard

标签: jquery internet-explorer-9 internet-explorer-10


【解决方案1】:

如果您可以创建一个选择器来识别元素,您可以使用delegate() 来附加您的处理程序 - 这适用于尚不存在的元素。

【讨论】:

  • 谢谢里奇。 .delegate() 已被 .on() 弃用,不幸的是,这也不起作用。我想可能是因为当 .hover() 完成执行时,任何“for future”绑定都会丢失?
  • @Ric - 在创建元素期间添加事件处理程序可以正常工作,而无需委派事件,所以这不是问题,而是其他问题。 IE9/10确实有控制台,控制台有没有错误。使用可能在其他地方声明的所有 PHP 和变量等很难调试您的代码。
  • 控制台显示没有错误。如果我在 click 事件中放置一个警报,IE 不会触发它,提示永远不会达到点击,所以我只能假设绑定没有粘住。作为记录,我已经为 jQuery 1.8 构建了这个,但也尝试了 1.9 和 1.9.1,以防万一在核心中修复了一些问题。
  • 嗯...@adeneo,我想我会整理一个基本的示例脚本来展示它在 IE9/10 中不起作用,但该示例以某种方式起作用!看来这里确实存在其他问题......
【解决方案2】:

已修复!

事实证明,每次鼠标移到注入的子元素上时,IE 都会触发悬停事件,而其他浏览器只会在悬停在具有绑定的元素上时触发,正如您所期望的那样。

event.stopPropagation 对我不起作用,所以我在 .data() 的帮助下伪造了它。这是最终结果:

jQuery('.current img').hover(function() {
    jQuery(this).parent().addClass('hover');
    jQuery(this).parent().parent().find('.hotspot:not(.hover) span:not(.select-image)').remove();
    jQuery(this).parent().parent().find('.hotspot:not(.hover) img').data('hovered', 'false');
    jQuery(this).parent().removeClass('hover');
    if(jQuery(this).data('hovered') != 'true') {
        jQuery(this).data('hovered', 'true');
        jQuery(this).parent().parent().find('.hotspot span:not(.select-image)').remove();
        jQuery(this).parent().find('span.select-image').remove();
        jQuery(this).parent().prepend('<span class="zoom-in"></span><span class="select-image"></span><span class="zoom-out"></span>');

        jQuery(this).parent().find('.zoom-in').click(function() {
            z += .1;
            z = Math.min(z, 5);

            jQuery(this).parent().find('img').attr('src', '<?php echo $urlPrefix; ?>/zcard-thumbnail-image/photos/<?php echo $modelId; ?>/low/' + i + '/' + (w * z) + '/' + (h * z) + '/file');
        });

        jQuery(this).parent().find('.zoom-out').click(function() {
            z -= .1;
            z = Math.max(z, 1);

            jQuery(this).parent().find('img').attr('src', '<?php echo $urlPrefix; ?>/zcard-thumbnail-image/photos/<?php echo $modelId; ?>/low/' + i + '/' + (w * z) + '/' + (h * z) + '/file');
        });
    }
});

非常感谢大家帮助解决这个问题,我希望以上内容对遇到类似问题的人有用。

【讨论】:

    【解决方案3】:

    还没有尝试过,所以我不确定延迟是否是问题所在,但您可以尝试使用手动 setTimeout 来延迟它:

    var zoomOutSpan = jQuery('<span class="zoom-out"></span>').prependTo(thisElem.parent());
    
    setTimeout( function()
    {
        zoomOutSpan.click(function() {
            z -= .1;
            z = Math.max(z, 1);
    
            jQuery(this).parent().find('img').attr('src', '<?php echo $urlPrefix; ?>/zcard-thumbnail-image/photos/<?php echo $modelId; ?>/low/' + i + '/' + (w * z) + '/' + (h * z) + '/file');
        });
    }, 1) // just 1 milisecond to execute it on a new thread
    

    【讨论】:

    • 谢谢 Dirk - 我真的认为这个想法会奏效,但它似乎没有任何效果。我什至尝试将第一行拆分如下: var zoomInSpan = jQuery(''); zoomInSpan.prependTo(thisElem.parent());
    • 嘎,zoomInSpan = jQuery('');alert('test');zoomInSpan.prependTo... 有效,但 zoomInSpan = jQuery('').delay(100).prependTo... 失败:-/
    • zoomInSpan.prependTo(thisElem.parent()).delay(100).on('click', ... 也失败了。这太荒谬了!
    • 嗨,Ric,我想帮忙。您是否可以使用特定问题的骨架版本设置 jsfiddle?如果您将其添加到您的问题中,那么人们很容易解决您的问题!
    • 感谢您回到 Dirk,但是是的,它现在确实已修复 :-)。由于某种原因,Stack Overflow 直到明天才让我标记答案。它也不让我将这些帖子中的任何一个标记为有用,因为我的排名还不够高,我觉得这有点刻薄!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多