【问题标题】:How to properly implement a custom ajax如何正确实现自定义 ajax
【发布时间】:2016-01-10 07:35:31
【问题描述】:

为了保持 logotext <div class="small-7 medium-4 columns logo"> 和菜单 <nav class="pagedMenu" role="navigation">,在页面刷新或内容从一个页面加载到另一个页面时不剪裁,我正在尝试实现 @Buzinas 提出的这个解决方案(特殊谢谢)。多说几句:

header.php 我们有这个脚本:

<head>
    ...

    <script>
    function ajax(url, callback, method, params) {
      if (!method) method = 'GET';

      var xhr = new XMLHttpRequest();
      xhr.open(method, url);

      if (callback) xhr.addEventListener('load', function() {
        callback.call(this, xhr);
      });

      if (params) {
        params = Object.keys(params).map(function(key) {
          return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
        }).join('&');
        xhr.send(params);
      } else {
        xhr.send();
      }
    }

    // CUSTOM AJAX CONTENT LOADING FUNCTION
    function ajaxRevslider(obj) {

        // obj.type : Post Type
        // obj.id : ID of Content to Load
        // obj.aspectratio : The Aspect Ratio of the Container / Media
        // obj.selector : The Container Selector where the Content of Ajax will be injected. It is done via the Essential Grid on Return of Content

        var content = "";

        data = {};

        data.action = 'revslider_ajax_call_front';
        data.client_action = 'get_slider_html';
        data.token = '<?php echo wp_create_nonce("RevSlider_Front"); ?>';
        data.type = obj.type;
        data.id = obj.id;
        data.aspectratio = obj.aspectratio;

        // SYNC AJAX REQUEST
        jQuery.ajax({
            type:"post",
            url:"<?php echo admin_url('admin-ajax.php'); ?>",
            dataType: 'json',
            data:data,
            async:false,
            success: function(ret, textStatus, XMLHttpRequest) {
                if(ret.success == true)
                    content = ret.data;                             
            },
            error: function(e) {
                console.log(e);
            }
        });

         // FIRST RETURN THE CONTENT WHEN IT IS LOADED !!
         return content;                         
    };

    // CUSTOM AJAX FUNCTION TO REMOVE THE SLIDER
    function ajaxRemoveRevslider(obj) {
        return jQuery(obj.selector+" .rev_slider").revkill();
    }

    document.addEventListener('DOMContentLoaded', function() {
      var main = document.querySelector('div[role=main]'),
        spinner = document.querySelector('div.sk-spinner'),
        pages = {};

      window.addEventListener('load', function() {
          toggleSpinner(false);
      });

      function toggleSpinner(b) {       
        spinner.classList[b ? 'remove' : 'add']('hidden');
        document.getElementById('wrapper').style.opacity = b ? 0 : 1;
      }

      function changePage(url, title) {
        setTimeout(function() {
          window.SITE.init();
          window.vc_js();
        }, 0);

        history.pushState({
          html: main.innerHTML,
          title: title
        }, '', url);

        toggleSpinner(false);
      }

      document.getElementById('menu-menu-2').addEventListener('click', function(e) {
        var el = e.target;

        if (el.tagName === 'A') {
          e.preventDefault();
          toggleSpinner(true);

          if (pages[el.href]) {
            main.innerHTML = '';
            main.appendChild(pages[el.href]);
            changePage(el.href);
          }
          else {
            ajax(el.href, function(xhr) {
              var frag = document.createRange().createContextualFragment(xhr.responseText);
              main.innerHTML = '<div>' + frag.querySelector('div[role=main]').innerHTML + '</div>';
              //pages[el.href] = main.firstElementChild;

              var _currentScripts = [].slice.call(document.querySelectorAll('script'));

              [].forEach.call(frag.querySelectorAll('script'), function(el, i) {
                if ((el.src === '' && el.parentNode)
                    || el.src.indexOf('slider') >= 0
                    || el.src.indexOf('Scroll') >= 0
                    || el.src.indexOf('vendor') >= 0
                    || el.src.indexOf('composer') >= 0
                   ) {
                  var s = _currentScripts.filter(function(x) {
                    return x.src === el.src;
                  });

                  while (s.length) {
                    if (s[0].parentNode)
                      s[0].parentNode.removeChild(s[0]);
                    s.shift();
                  }

                  document.body.appendChild(el);
                }
              });

              [].forEach.call(frag.querySelectorAll('style'), function(el, i) {
                document.querySelector('head').appendChild(el);
              });

              changePage(el.href, frag.querySelector('title').textContent);
            });
          }
        }
      });

      window.addEventListener('popstate', function(e) {
        if (e.state) {
          main.innerHTML = e.state.html;
          document.title = e.state.title;
        }
      });
    });
    </script>

    ...
</head>

以下jquery-ready.jsscript-calls.php 中注册/排队:

(function($){
var readyList = [];

// Store a reference to the original ready method.
var originalReadyMethod = jQuery.fn.ready;

// Override jQuery.fn.ready
jQuery.fn.ready = function(){
    var args = [].slice.call(arguments);

    if(args.length && args.length > 0 && typeof args[0] === 'function') {
      readyList.push(args[0]);
    }

    // Execute the original method.
    originalReadyMethod.apply( this, args );
};

// Used to trigger all ready events
$.triggerReady = function() {
  $(readyList).each(function(i, el) {
      try {
          el.apply(el);
      } catch(e) {
          console.log(e);
      }
  });
};
})(jQuery);

另外,在page.php 中我替换了get_header()get_footer() 函数如下:

<?php
if(!isset($_REQUEST['ajax'])){
    get_header(); 
}
?>
<?php 
    if (is_page()) {
        $id = $wp_query->get_queried_object_id();
        $sidebar = get_post_meta($id, 'sidebar_set', true);
        $sidebar_pos = get_post_meta($id, 'sidebar_position', true);
    }
?>
...

<?php
if(!isset($_REQUEST['ajax'])){
    get_footer();
}
?>

在尝试加载带有 Revolution 滑块或 Visual Composer Parallax 内容的页面时仍然存在一些问题,例如我们在 Parallax关于我们 页面上遇到的问题。

您可以use this link 并导航到上述页面;仅在 Chrome 45.0.2454.101 m 64-bit/Win7 中进行测试,尚未为 IE、Firefox、移动等做好准备。

关于行为: Rev 滑块视差内容,将从第二次链接访问(HomeParallax 页面)开始被打乱; Visual Composer 视差内容(例如办公桌上的那个人图片,关于我们页面)固定在第一次链接访问 - F5 之后就可以了;

菜单mynewmenu.js会记住状态会话,所以你必须关闭浏览器才能正确访问多个直接链接。

我收到了 Rev Slider 支持团队的答复,告诉我:

Ajax 的最佳选择是将滑块的简码添加到常规页面/帖子中,然后滑块的“init”脚本将自动包含在滑块的 HTML 中。然后当滑块的 HTML 从 DOM 中移除时,所有 jQuery 事件也被移除。因此,您真正需要做的就是将滑块作为页面/帖子内容拉入,然后您就不需要专门为滑块提供任何自定义脚本了。

不幸的是,我不知道如何解决这个问题,将上述建议实施到我已经收到的解决方案中。

可能与 API 相关(?)我在 Revolution slider / Visual Composer 页面上找到了这些信息。有什么想法吗?

【问题讨论】:

  • @Patel 嘿,抱歉回复晚了;实际上,我认为这个问题很清楚,也许考虑到这个问题还不清楚:) 没有冒犯。您是 wordpress 用户/开发人员吗?我想要实现的是在这个东西中有一个功能齐全的 ajax 集成了 Revolution 滑块和 Visual Composer 插件;无论如何,我会尝试几次apply this,希望有足够的时间;可能是正确的答案。感谢您的关注。
  • 如果您将关注点分开,这将更容易调试。 JavaScript 不应该在 PHP 文件中。使用 PHP 文件呈现动态 HTML,然后使用 JavaScript 文件对其进行操作。
  • @freak3dot 你好,我能做到,没问题。我已经在 wp-content/themes/notio-wp/assets/js/buzinas.js 文件中移动了 js 序列,并且此时,该文件已在 script 中注册/排队-calls.php.
  • @typo_78 请不要将您的链接隐藏在缩短器后面。没有理由这样做,因为你给了它一个标题,它只会让人担心它是恶意软件。
  • @Don Rhummy,谢谢你的建议,我理解你的观点,我想过,但如果我不隐藏链接,ggl 将显示在站点名称搜索所有这些 stackoverflow 页面——我不想那样——对吗?

标签: javascript php jquery ajax wordpress


【解决方案1】:

您可能应该阅读:

您应该使用 wp_localize_script 将 PHP 变量传递给您的 javascript 文件。

即使您不这样做,您也不应该仅仅为了提供特定内容而修改主页模板——创建一次性页面,然后创建make a specific template for it。然后您可以使用该页面的 URL 作为您的 ajax 端点。

但是,如果您真正需要做的是在页面以外的其他地方运行 Rev Slider 的简码(以及 Parallax 的东西,如果它也有的话):

【讨论】:

  • 感谢您的努力。希望有空闲时间尝试上述解决方案。
【解决方案2】:

您还需要这方面的帮助吗?我认为革命滑块的支持团队通过声明将其钉牢

只需将滑块的简码添加到常规页面/帖子

您真正需要做的就是将滑块作为页面/帖子内容拉入

因此,请使用 WordPress 页面上的滑块/通过简码 [简码] 发布。然后根据需要在 php(或 javascript,但你正在这样做)中引用 $_GET[] 和/或 $_POST[] 数组元素。

【讨论】:

  • 感谢@JoshuaKersey 的反馈,一旦我有空闲时间,我会尝试你的解决方案;问题是我们将使用 Visual Composer 的行为相同...
猜你喜欢
  • 2013-07-21
  • 2011-04-04
  • 2011-03-24
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 2016-08-23
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多