Pass data-attribute value of clicked element to ajax settings

a 夏天 提交于 2019-12-08 04:32:07

问题


For an implementation of Magnific Popup, I need to pass a post id to the ajax settings. The post id is stored in a data attribute of the element to which Magnific Popup is bound. I would like this to work:

html element:

<a data-id="412">Clicke me</a>

Javascript:

$('.element a').magnificPopup({
  type: 'ajax',
  ajax: {
    settings: {
      url: php_array.admin_ajax,
      type: 'POST',
      data: ({
        action:'theme_post_example',
        id: postId
      })
    }
  }

});

Where postId is read from the data attribute.

Thanks in advance.


回答1:


$('.element a').magnificPopup({
    callbacks: {
        elementParse: function(item){
            postData = {
                action  :'theme_post_example',
                id      : $(item.el[0]).attr('data-id')     
            }
            var mp = $.magnificPopup.instance;
            mp.st.ajax.settings.data = postData;
        }
    },
    type: 'ajax',
    ajax: {
        settings: {
            url: php_array.admin_ajax,
            type: 'POST'
        }
    }
});



回答2:


Here is how to do it:

html:

<a class="modal" data-id="412" data-action="theme_post_example">Click me</a>

jquery:

$('a.modal').magnificPopup({
    type: 'ajax',
    ajax: {
        settings: {
            url      : php_array.admin_ajax,
            dataType : 'json'
        }
    },
    callbacks: {
        elementParse: function() {
            this.st.ajax.settings.data = {
                action : this.st.el.attr('data-action'),
                id     : this.st.el.attr('data-id')
            }
        }
    },
    parseAjax: function( response )
    {
        response.data = response.data.html;
    }
});

php

function theme_post_example()
{
    $id = isset( $_GET['id'] ) ? $_GET['id'] : false;

    $html = '<div class="white-popup mfp-with-anim">';

    /**
     * generate your $html code here ...
     */

    $html .= '</div>';

    echo json_encode( array( "html" => $html ) );

    die();
}



回答3:


As this answer was the original question regarding inserting data into Magnific's ajax call, I'll post this here. After many hours of trying to figure this out, you should know that if you're using a gallery with the ability to move between gallery items without closing the popup, using elementParse to set your AJAX data will fail when you visit an item after already viewing it (while the popup is still open).

This is because elementParse is wrapped up in a check that it makes detect if an item has already been 'parsed'. Here's a small explanation as to what happens:

  • Open gallery at item index 2.
  • Item has not been parsed yet, so it sets the parsed flag to true and runs the elementParse callback (in that order). Your callback sets the ajax options to fetch this item's data, all is well.
  • Move (right) to item index 3.
  • Same as above. The item has not been parsed, so it runs the callback. Your callback sets the data. It works.
  • Move (left) back to item index 2.
  • This time the item has been parsed. It skips re-parsing the item's element for assumed potential performance reasons.Your callback is not executed. Magnific's ajax data settings will remain the same as if it were item index 3.
    • The AJAX call is executed with the old settings, it returns with item index 3's data instead, which is rendered to the user. Magnific will believe it is on index 2, but it is rendering index 3's data.

To resolve this, you need to hook onto a callback which is always executed pre-ajax call, like beforeChange.

The main difference is that the current item isn't passed through into the callback. Fortunately, at this point, magnific has updated their pointers to the correct index. You need to fetch the current item's element by using:

var data = {}; // Your key-value data object for jQuery's $.ajax call.

// For non-closures, you can reference mfp's instance using
// $.magnificPopup.instance instead of 'this'.
// e.g.
// var mfp = $.magnificPopup.instance;
// var itemElement = mfp.items[mfp.index].el;
var itemElement = this.items[this.index].el;

// Set the ajax data settings directly.
if(typeof this.st.ajax.settings !== 'object') {
    this.st.ajax.settings = {};
}
this.st.ajax.settings.data = data;

This answer can also be used as a suitable alternative to the currently highest voted, as it will work either way.




回答4:


You may use open public method to open popup dynamically http://dimsemenov.com/plugins/magnific-popup/documentation.html#public_methods




回答5:


postId = $(this).attr('data-id')

$(this) retrieve the current element (the link you clicked on), and attr the value of the specified attribute.



来源:https://stackoverflow.com/questions/16846457/pass-data-attribute-value-of-clicked-element-to-ajax-settings

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!