无法使 (this) jQuery 选择器工作

Can't get (this) jQuery selector working

我的页面上有一个名为 "a.add_mycrate" 的重复 class。 此脚本仅针对单击的实例 (this) 并对其进行处理。

这是我的 JS :

jQuery(document).ready(function(){
jQuery(document).on('click', "a.add_mycrate", function(event) {
    event.preventDefault();

    var title = jQuery(this).attr('data-title');
    var artwork = jQuery(this).attr('data-artwork');
    var stream = jQuery(this).attr('data-stream');
    var download = jQuery(this).attr('data-download');

    var data = {
                'action': 'addToCrate',
                'security': jQuery( '#crate-nonce' ).val(),
                'podtitle' : title,
                'podartwork' : artwork,
                'podstream' : stream,
                'podsave' : download
               };                  

    jQuery.post(myCrate.ajaxurl, data, function(response) {

        jQuery('a.add_mycrate', this).html(response);

        alert(response);
    });              
  });
});

这是实际链接在页面上的呈现方式(以防有帮助):

<a class="add_mycrate" href="#" data-title="Title Goes Here" data-artwork="artwork.jpg" data-stream="myfile.mp3" data-download="link/to/download">Add To Crate</a>

(this) 选择器在为 vars 抓取数据时工作正常,但我无法在对 "a.add_mycrate" 的目标 (this) 实例的响应中获取代码。这是我遇到问题的行:

jQuery('a.add_mycrate', this).html(response);

我知道我一定是做错了,但我在这里环顾四周尝试过的所有方法都不起作用。有什么建议吗?

P.S。与问题无关,但我使用 "jQuery" 而不是“$”,因为它在 wordpress 网站上是 运行 以防有人想知道。

几个问题:

$.post 回调中的

this 不是你想的那样。它与外部事件处理程序中的 this 具有不同的范围上下文。 在 ajax 之外存储对 this 的引用以在其中使用

var $this = jQuery(this);
jQuery.post(myCrate.ajaxurl, data, function(response) {
        $this.html(response);
});

这也将解决以下问题:

jQuery('a.add_mycrate', this).html(response);

第二个参数是"context"。如果您假设 this 是元素,则上下文参数使其与 :

相同
jQuery(this).find('a.add_mycrate');

所以你会在自身内部寻找元素。这两个问题都通过将元素引用存储在 ajax 之外并将 html 直接插入存储的元素

来解决

编辑:如何在 wordpress noConflict() 中使用 $ 而不是必须对所有内容使用 jQuery

jQuery(document).ready(function($){
    // can use `$` for all your code inside the ready handler
    // when you pass it in as argument
})

this放在post之前的一个名为elm的变量中,然后像下面这样更改elm的html。

jQuery(document).ready(function(){
    jQuery(document).on('click', "a.add_mycrate", function(event) {
        event.preventDefault();

        var title = jQuery(this).attr('data-title');
        var artwork = jQuery(this).attr('data-artwork');
        var stream = jQuery(this).attr('data-stream');
        var download = jQuery(this).attr('data-download');
        var elm = this;

        var data = {
            'action': 'addToCrate',
            'security': jQuery( '#crate-nonce' ).val(),
            'podtitle' : title,
            'podartwork' : artwork,
            'podstream' : stream,
            'podsave' : download
        };                  

        jQuery.post(myCrate.ajaxurl, data, function(response) {
            jQuery(elm).html(response);
            alert(response);
        });              
    });
});