我有一个复杂的问题,所以我会尽量缩短它。
我的用例是为移动网站构建RSS源。该界面类似于仅基于浏览器的Pulse阅读器。
我正在利用PHP进行繁重的工作,以便连接到XML API并在页面加载时提取初始数据。我正在尝试使用jQuery构建一个AJAX调用,它将在click()
上修改我的URI查询字符串并提取一组新的结果并将它们附加到我现有的元素中。
我的URI看起来像这样:
http://www.domain.com/request.php?subcategoryId=1&page=1
我正在运行PHP foreach()
循环来填充我的页面:
<?php // Collect Subcategories and Titles
foreach ($phpObjects->SubcategoryResult as $SubcategoryResult) { ?>
<?php // Callback to subcategoryArticleRequest() to recieve article data
$subcategoryObjects = subcategoryArticleRequest($SubcategoryResult->subcategoryId); ?>
<div class="subcategory">
<h2><?php echo $SubcategoryResult->subcategoryName; ?></h2>
<div class="articleFeed overthrow">
<table>
<tr>
<?php foreach ($subcategoryObjects->articleResult as $articleResult) { ?>
<td>
<!-- ARTICLE CONTENT POPULATED HERE -->
</td>
<?php } ?>
<td data-subcategoryId="<?php echo $SubcategoryResult->subcategoryId; ?>" onClick="page++">
<a class="loadMore" href="#">Load More</a>
</td>
</tr>
</table>
</div><!-- .articleFeed -->
</div>
<?php } ?>
焦点的主要区域是我在foreach运行后附加到表中的这个元素。我将使用此链接点击并通过AJAX加载更多文章(我在这里有硬编码data-subcategoryId
):
<td data-subcategoryId="1">
<a class="loadMore" href="#">Load More</a>
</td>
实质上,当有人点击此按钮时,它会进行AJAX调用并检索&page=2
,依此类推。
这是我的JavaScript:
var page = 1;
$('.loadMore').click(function() {
page++;
var subcategoryId = $(this).parent().attr('data-subcategoryId');
var url = 'http://www.domain.com/request.php?subcategoryId='+subcategoryId+'&page='+page;
console.log(url);
});
我一直遇到的问题是,当我点击.loadMore
链接时,它会增加page
变量,但它会全局完成。如果我尝试移动点击功能中的var page = 1;
,它只会增加一次到2
。
一旦我正确使用此功能,我可以将url
变量传递给我的AJAX函数以提取新内容。
我设置了一个JSFiddle以防万一,虽然它一直显示subategoryId为undefined:
答案 0 :(得分:2)
所以听起来每个元素都应该有自己的page
变量。
一个简单的解决方案是使用.each()
分配处理程序,并在page
回调中创建each
变量。
$('.loadMore').each(function() {
var page = 1;
$(this).click(function() {
page++;
var subcategoryId = $(this).parent().attr('data-subcategoryId');
var url = 'http://www.domain.com/request.php?subcategoryId='+subcategoryId+'&page='+page;
console.log(url);
});
});
因为JavaScript函数是闭包,所以每个.click
处理程序都是在自己的新变量环境中创建的,并且每个处理程序将始终引用创建时范围内的变量。
这意味着每个处理程序都有自己的个人page
变量来递增。
另一种解决方案是使用“事件数据”。您可以通过event
对象将数据与特定元素相关联。
$('.loadMore').each(function() {
$(this).bind("click", {page:1}, loadMoreHandler);
});
function loadMoreHandler(e) {
e.data.page++;
var subcategoryId = $(this).parent().attr('data-subcategoryId');
var url = 'http://www.domain.com/request.php?subcategoryId='+subcategoryId+'&page='+e.data.page;
console.log(url);
}
由于不再利用闭包,为了函数对象的重用,我为处理程序使用了一个命名函数。如果对您无关紧要,可以将其更改回匿名函数。
答案 1 :(得分:1)
将新数据添加到:
<td data-subcategoryId="1" data-page="1">
然后递增page
并更新data-page
:
$('.loadMore').click(function() {
var page = $(this).parent().data('page');
page++;
$(this).parent().data('page',page);
...