javascript - console.log 触发,但后续 Jquery 调用不执行任何操作

标签 javascript jquery

这是我的代码:

    jQuery( window ).load( function( ) {
        if ( jQuery('select#pa_form option:selected').val().length > 0 ) {
            if( ! jQuery('div.single_variation').html().length) {
                jQuery('div.single_variation').append("<span class='price'><span class='amount'>$" + jQuery("meta[itemprop=price]").attr('content') + "</span></span>");
            }
            jQuery( 'select#pa_form').change( function() {
                console.log( 'i tried' );
                jQuery('div.single_variation').html("<span class='price'><span class='amount'>$" + jQuery("meta[itemprop=price]").attr('content') + "</span></span>");
            });
        }
    });

我遇到的问题是,当我更改选择时,“我尝试过”的 console.log 语句被触发,但 jQuery .html 调用没有触发。

如果我将以下内容放入控制台,它就会起作用:

        jQuery( 'select#pa_form').change( function() {
            console.log( 'i tried' );
            jQuery('div.single_variation').html("<span class='price'><span class='amount'>$" + jQuery("meta[itemprop=price]").attr('content') + "</span></span>");
        });

但是,如果我从 jQuery( window ).load( function() {}); 函数中删除该代码片段,则不会触发任何操作。

我做错了什么?

Here's a live version of the code

最佳答案

您的代码正确显示了价格,但还有另一个 change由 wooCommerce JS 绑定(bind)的事件处理程序被触发,最终再次清除价格。

让这个工作的最简单的方法是 hacky,但可以完成工作。只需使用 setTimeout() 推迟更新即可延迟 0 允许首先触发其他更改处理程序,然后再执行您想要执行的操作。我建议这样做只是因为我认为 wooCommerce JS 太难更改。

这是一种方法:

jQuery( window ).load( function( ) {
    if ( jQuery('select#pa_form option:selected').val().length > 0 ) {
        if( ! jQuery('div.single_variation').html().length) {
            addPrice('append');
        }
        jQuery( 'select#pa_form').change( function() {
            console.log( 'i tried' );
            addPrice('html');
        });
    }
});

function addPrice(method) {
    setTimeout(function () {
        jQuery('div.single_variation')[method]("<span class='price'><span class='amount'>$" + jQuery("meta[itemprop=price]").attr('content') + "</span></span>");
    }, 0);
}

我还使代码更加干燥,以便更容易维护。

我是如何发现问题的

以下是我在 Chrome 开发工具中发现问题的方法,以便您可以了解如何自行解决。

  1. 在进行更改的行(console.log('i tried') 行之后的行)设置一个断点。
  2. 更改下拉列表,会命中断点。
  3. 跨过一次(F10),回头在浏览器中查看,价格已经出现。到目前为止,一切顺利。
  4. 恢复 (F8),它会再次消失。
  5. <div id="desc_bucket"> 上设置 DOM 断点element,我希望更改的元素的父元素。在“元素”选项卡中右键单击它,选择“中断...”和“子树修改”。
  6. 再次更改下拉菜单,并在它命中您的代码时恢复 (F8)。
  7. 下次出现故障时,将是由于 wooCommerce 代码造成的,您可以在其中探索堆栈跟踪以了解发生了什么情况。

DOM 断点:有时很方便。

关于javascript - console.log 触发,但后续 Jquery 调用不执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29293797/

相关文章:

javascript - 在一个文本框中获取多个值时出现问题

javascript - 如何使用 Dojo Range Slider 拥有 3 个或更多 handle

jQuery 添加类点击不起作用。这是 css 还是 jquery 错误?

jquery - 使用 jquery $.ajax 提交表单 - 更改表单的 View

php - 获取两个值 Javascript

jQuery .val() 忽略输入的第一个字符

javascript - jsviews 的 {{if}} 构造中的 string.indexof() 函数

javascript - 如何在 Javascript 中更改函数内部变量的值?

javascript - 抓取 HTML5 Canvas 的每一帧

javascript - jQuery 选择元素的父级并为其使用 prependTo()