gpt4 book ai didi

javascript - 如何正确实现自定义ajax

转载 作者:IT王子 更新时间:2023-10-29 01:10:47 25 4
gpt4 key购买 nike

为了保留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 slider 或 Visual Composer Parallax 内容的页面时仍然存在一些问题,例如我们在Parallax关于我们 页面上。

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

关于行为:Rev slider 视差内容,将从第二次链接访问(HomeParallax 页面)变得杂乱无章; Visual Composer 视差内容(办公 table 旁的人图片,例如 关于我们 页面)固定在第一次链接访问时 - F5 之后就可以了;

菜单 mynewmenu.js 将记住 session 中的状态,因此您必须关闭浏览器才能正确访问多个直接链接。

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

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

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

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

最佳答案

您可能应该阅读:

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

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

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

关于javascript - 如何正确实现自定义ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33087632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com