gpt4 book ai didi

javascript - 通过 Javascript 加载大型 HTML 模板的最佳实践?

转载 作者:行者123 更新时间:2023-12-03 05:14:35 25 4
gpt4 key购买 nike

search.js

function search_function() {
$("#search-button").attr('disabled','disabled');
$("#product-container").empty();
$(".paging_link").empty();
$("#product-container").html('<div class="col-xs-12 text-center" style="margin-bottom: 25px; margin-top: 25px;"><i class="fa fa-circle-o-notch fa-spin fa-3x fa-fw"></i><span class="sr-only">Loading...</span></div>');
var num;
$.ajax({
type: 'POST',
url: '/api/search.php',
async: true,
data: $('#search-capture').serialize() +"&page=1",
success: function (data) {
console.log(data);
$("#product-container").empty();
array = $.parseJSON(data)
if(array[1].length > 0)
{
num = array[0];
$.each(array[1], function (index, item) {
$.ajax({
type: 'POST',
url: '/api/item.php',
data: {item: item},
async: false,
success: function (data) {
if(data)
{
$("#product-container").append(data);
}
}
});
});
$("#search-button").removeAttr('disabled');
history.pushState(null, null, "search.php?search="+$("#search").val()+"&sort="+$("#sort").val()+"&page=1");
}
else {
num = 0;
$("#search-button").removeAttr('disabled');
$("#product-container").append('<div class="col-xs-12 text-center" style="margin-bottom: 25px;"><h1>No results for <i>"'+ $("input[name=search]").val() +'"</i>.</h1></div>');
}
$(".paging_link").bootpag({
total: num,
maxVisible: 5,
page: 1
});
}
});
}

/api/item.php

<?php
include_once("../library/config.php");
include_once("../library/user.class.php");
$user = new user($pdo);
if(isset($_POST['item']))
{
$item = $_POST['item'];
$image_array = json_decode($item['images']);
$person = $user->person_exists($item['owner_id']);
}

?>
<div class="col-md-3 col-md-offset-0 col-sm-4 col-sm-offset-0 col-xs-10 col-xs-offset-1" style="margin-bottom: 25px;">
<div class="col-item">
<div class="post-img-content">
<img src="<?php echo $image_array[0]; ?>" style="height: 100%; width: 100%;"/>
<span class="post-title">
<b><?php echo $item['name'];?></b><br>
</span>
<?php
if($item['price'] > $item['sale_price'])
{
?>
<span class="round-tag">-<?php echo round(($item['price'] - $item['sale_price'])/$item['sale_price'] * 100); ?>%</span>

<?php
}
?>
</div>
<div class="info">
<div class="row">
<div class="price col-md-12">
<h5>Offered By: <a href="/user.php?id=<?php echo $item['owner_id']; ?>"><?php echo $person['firstname']; ?> <?php echo $person['lastname']; ?></a></h5>

<?php
if($item['price'] > $item['sale_price'])
{
?>
<div><b>$<?php echo $item['sale_price']; ?></b> <s class="text-muted">$<?php echo $item['price']; ?></s> <br> + $<?php echo $item['shipping']; ?> Shipping</div>

<?php
}
else {
?>
<div><b>$<?php echo $item['price']; ?></b><br> + $<?php echo $item['shipping']; ?> Shipping</div>
<?php
}
?>
</div>
</div>

<div class="row">
<div class="col-sm-10 col-sm-offset-1">
<hr style="margin-top: 0px; margin-bottom: 10px;">
</div>
<div class="col-xs-6">
<form class="form" name="add-to-cart">

<div class="form-group form-group-sm" style="margin-bottom: 0;">
<input type="hidden" name="id" value="<?php echo $item['id'];?>">
<input type="hidden" name="quantity" id="quantity" placeholder="quantity" value="1">
<input type="hidden" name="action" value="addtocart">
<button class="btn btn-default btn-sm btn-block" type="submit" id="search-button"><i class="fa fa-shopping-cart"></i> </button>
</div>
</form>
</div>
<div class="col-xs-6">
<div class="form-group form-group-sm" style="margin-bottom: 0; margin-top: 0px;">
<a href="details.php?id=<?php echo $item['id']; ?>" class="btn btn-default btn-sm btn-block"><i class="fa fa-list"></i></a>
</div>
</div>
</div>
</div>
</div>
</div>

这是我的 Javascript 函数,用于从 api 调用获取结果,我遇到的问题是加载时间,因为如果首先对 /api/search.php 进行 AJAX 调用来获取项目然后它对 /api/item.php 进行另一个 AJAX 调用,我有一个使用 PHP 的 HTML 模板,使用来自 POST 的数据填充模板,然后返回该 html 并将其附加到文本中。然而,这使得加载速度非常慢,因为在第二次 AJAX 调用时,我必须将 async 设置为 false 才能以正确的顺序加载项目。我想知道除了通过 Javascript 加载巨大的 HTML block 之外,是否有一种更有效、更可行的方法来加载项目项而无需第二次 AJAX 调用(我应该这样做吗?)。

最佳答案

您可以按顺序插入占位符元素,然后在 ajax 完成时将其替换为实际内容

所有跨度都会按顺序同步添加,因此您拥有最终数据的正确位置

$.each(array[1], function(index, item) {
var loc = $("#product-container").append("<span/>").children().last();
// loc is the span just appended
$.ajax({
type: 'POST',
url: '/api/item.php',
data: {
item: item
}
success: function(data) {
if (data) {
loc.replaceWith(data); // replace the span with data
} else {
loc.remove(); // remove the no longer needed placeholder
}
}
});
});

注意:我的 jQuery 生锈了,虽然我对方法做了简单的测试,但我可能把 jQuery 塞到了某个地方

或者,如果您需要等待所有 ajax 完成后再启用搜索按钮和历史推送状态

$.when(array[1].map(function(item) {
var loc = $("#product-container").append("<span/>").children.last();
return $.ajax({
type: 'POST',
url: '/api/item.php',
data: {
item: item
}
success: function(data) {
if (data) {
loc.replaceWith(data);
} else {
loc.remove();
}
}
});
})).then(function() {
$("#search-button").removeAttr('disabled');
history.pushState(null, null, "search.php?search=" + $("#search").val() + "&sort=" + $("#sort").val() + "&page=1");
});

关于javascript - 通过 Javascript 加载大型 HTML 模板的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41659137/

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