JavaScript:单击时相对于父项增加变量值
我有一个复杂的问题,所以我会尽量简短 我的用例是为移动网站构建RSS提要。该界面类似于仅基于浏览器的Pulse reader 我正在使用PHP进行繁重的工作,以连接到XMLAPI,并在页面加载时拉入初始数据。我正在尝试使用jQuery构建一个AJAX调用,它将在JavaScript:单击时相对于父项增加变量值,javascript,jquery,ajax,onclick,click,Javascript,Jquery,Ajax,Onclick,Click,我有一个复杂的问题,所以我会尽量简短 我的用例是为移动网站构建RSS提要。该界面类似于仅基于浏览器的Pulse reader 我正在使用PHP进行繁重的工作,以连接到XMLAPI,并在页面加载时拉入初始数据。我正在尝试使用jQuery构建一个AJAX调用,它将在click()上修改我的URI查询字符串,并拉入一组新的结果并将它们附加到现有元素中 我的URI如下所示: http://www.domain.com/request.php?subcategoryId=1&page=1 我正在运行一个P
click()
上修改我的URI查询字符串,并拉入一组新的结果并将它们附加到现有元素中
我的URI如下所示:
http://www.domain.com/request.php?subcategoryId=1&page=1
我正在运行一个PHPforeach()
循环来填充我的页面:
<?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 } ?>
本质上,当有人单击此按钮时,它将进行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
链接时,它会增加页面
变量,但它会全局执行。如果我尝试移动var页面=1
在单击功能中,它只会增加一次到2
一旦我正确使用了这个函数,我就可以将url
变量传递给我的AJAX函数,以获取新内容
我设置了一个JSFIDLE以防万一,尽管它一直显示子类别ID为未定义:
将新数据添加到:
<td data-subcategoryId="1" data-page="1">
所以听起来每个元素都应该有自己的
page
变量
一个简单的解决方案是使用.each()
分配处理程序,并在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
处理程序都是在自己的新变量环境中创建的,并且每个处理程序在创建时都会引用作用域中的变量
这意味着每个处理程序都有自己的要递增的个人页面变量
另一个解决方案是使用“事件数据”。您可以通过事件
对象将数据与特定元素关联
$('.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);
}
由于闭包不再被利用,为了函数对象重用,我为处理程序使用了一个命名函数。如果这对你来说无关紧要,你可以把它改回匿名函数。我不明白你为什么会被否决,因为你显然已经尝试过了,并且展示了你的尝试。你还摆好了小提琴。杰出的哦,gray state的答案似乎就要来了
应该可以解决你的问题了。谢谢你的好话。这是一个很难表达的问题。更不用说我整天都在盯着同一块代码,所以我的大脑变得一团糟。要比尝试时间长一点,灰色状态即将出现的答案。我非常感谢您的回复!虽然您的解决方案工作得很好,但我现在不想在代码中添加另一个数据属性+谢谢你!反应很好!彻底的解释,以及替代的解决方案,使这成为我接受的答案。我也喜欢这样,我不必修改我的HTML+1我注意到,尽管这在桌面上非常有效,但它并没有在我的触摸设备上收集click()
事件。有什么想法吗?@stat30fbliss:我还没有为触摸设备编程,但我听说点击事件需要更长时间才能注册。我认为可以使用其他事件类型来解决问题。您需要对基于触摸的事件处理进行一些研究。
$('.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);
});
});
$('.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);
}